UnitKktlistbox; {===================================================== ====================================== Design by: Peng Guohui Date: 2004-12-24 Site: http://kacarton.yeah.net/ Blog: http://blog.csdn.net/nhconch Email: kacarton # sohu.com The article is original to the author. Please contact me before reprinting. for reprinting, please indicate the source of the article and retain the author information. Thank you for your support! ========================================================== =====================================}
Interface Uses Windows, messages, sysutils, classes, controls, stdctrls, commctrl; Type Tkktlistbox =Class(Tlistbox) Private Maxlenitemindex: integer; Fscrollwidth: integer; ProcedureLbaddstring (VaR message: Tmessage );MessageLb_addstring; ProcedureLbinsertstring (VaR message: Tmessage );MessageLb_insertstring; ProcedureLbdeletestring (VaR message: Tmessage );MessageLb_deletestring; ProcedureCmfontchanged (VaR message: Tmessage );MessageCm_fontchanged; ProcedureAdjuctscrollwidth (Message: Tmessage ); ProcedureResetscrollwidth; Protected Public ConstructorCreate (aowner: tcomponent );Override; ProcedureCreatewnd;Override; End; Procedure Register; Implementation {Tkktlistbox} ConstructorTkktlistbox. Create (aowner: tcomponent ); Begin InheritedCreate (aowner ); Maxlenitemindex: =-1; Fscrollwidth: = 0; End; ProcedureTkktlistbox. createwnd; Begin InheritedCreatewnd; Canvas. Font: = font; End; ProcedureTkktlistbox. lbaddstring (VaR message: Tmessage ); Begin Inherited; IfMessage. Result = lb_errThenExit; Adjuctscrollwidth (Message ); End; ProcedureTkktlistbox. lbinsertstring (VaR message: Tmessage ); Begin Inherited; IfMessage. Result = lb_errThenExit; IfMessage. wparam <= maxlenitemindexThenMaxlenitemindex: = maxlenitemindex + 1; Adjuctscrollwidth (Message ); End; ProcedureTkktlistbox. lbdeletestring (VaR message: Tmessage ); Begin Inherited; IfMessage. Result = lb_errThenExit; IfMessage. wparam = maxlenitemindexThenResetscrollwidth; End; ProcedureTkktlistbox. cmfontchanged (VaR message: Tmessage ); VaR SZ: size; Begin Inherited; IfMaxlenitemindex =-1ThenExit; // Textwidth is not used here, but the gettextextentpoint32 function is used. If you are interested // You can trace a textwidth function, which is implemented by calling gettextextentpoint32. Gettextextentpoint32 (canvas. Handle, pchar (items [maxlenitemindex]), length (items [maxlenitemindex]), SZ ); Fscrollwidth: = Sz. cx + 4; Perform (lb_sethorizontalextent, fscrollwidth, 0 ); End; ProcedureTkktlistbox. adjuctscrollwidth (Message: Tmessage ); VaR SZ: size; Begin Gettextextentpoint32 (canvas. Handle, pchar (message. lparam), strlen (pchar (message. lparam), SZ ); IfSZ. cx + 4> fscrollwidthThen Begin Fscrollwidth: = Sz. cx + 4; Perform (lb_sethorizontalextent, fscrollwidth, 0 ); Maxlenitemindex: = message. result; End; End; ProcedureTkktlistbox. resetscrollwidth; VaR I, maxwidth: integer; SZ: size; Begin Maxwidth: = 0; I: = items. Count-1; Maxlenitemindex: =-1; WhileI> = 0Do begin SZ. CX: = 0; Gettextextentpoint32 (canvas. Handle, pchar (items [I]), length (items [I]), SZ ); IfSZ. cx + 4> maxwidthThen begin Maxwidth: = Sz. cx + 4; Maxlenitemindex: = I; End; Dec (I ); End; Fscrollwidth: = maxwidth; Perform (lb_sethorizontalextent, fscrollwidth, 0 ); End; Procedure Register; Begin Registercomponents ('kacarton ', [tkktlistbox]); End; End. |