²Ä 24 ³¹¡@³q¥Î±±¨î¶µ(4)¡G¾ðª¬À˵ø±±¨î¶µ ( Tree View )


¾ðª¬À˵ø±±¨î¶µªº¥~Æ[

¾ðª¬À˵ø±±¨î¶µ¤]¬O¤@ºØµøµ¡¡A¦Ó¸Óµøµ¡¤º©Ò¥]§tªº¶µ¥Ø¬O¨ã¦³¶¥¼hªº¡C°Ñ¦Ò©³¤Uªº¹ï¸Ü²°¡AHDINFO2¡A¥¦¬O¥»³¹½d¨Ò¡A¦¹¹ï¸Ü²°¬O¥Ñ¥ªÃ䪺¡u¾ðª¬À˵ø±±¨î¶µ¡v»P¥kÃ䪺¡uÀRºA±±¨î¶µ¡v²Õ¦¨¡C¡u¾ðª¬À˵ø±±¨î¶µ¡v¤º¦³³\¦h¶µ¥Ø ( item )¡A³o¨Ç¶µ¥Ø¥i¥H¾Ö¦³¤U¤@¼hªº¶µ¥Ø¡A³oºØ¤U¤@¼hªº¶µ¥ØºÙ¬°¡u¤l¶µ¥Ø¡v( child item )¡A¤l¶µ¥Ø¬OªþÄÝ©ó¡u¤÷¶µ¥Ø¡v( parent item ) ¤§¤U¡C³Ì³»¼hªº¶µ¥Ø¡A¬O¨S¦³¡u¤÷¶µ¥Ø¡vªº¡AºÙ¬°¡u®Ú¶µ¥Ø¡v( root item )¡C¹³³oºØ¡A¬Y­Ó¶µ¥ØªþÄÝ©ó¥t¤@­Ó¶µ¥Ø¡AºÙ¬°¶¥¼h©Ê¡A¦p¦P¾ð·F¨Ìªþ¾ð®Ú¡A¾ðªK¨Ìªþ¾ð·F¡C

¤W¹Ï¤¤¡A¡u¹q¸£¤¤ªºµwºÐ¡v´N¬O©Ò¿×ªº®Ú¶µ¥Ø¡A¨ä¤U¦³¤T­Ó¤l¶µ¥Ø¡G¡u¹êÅéºÏºÐ 0¡v¡B¡u¹êÅéºÏºÐ 1¡v¡B¡u¹êÅéºÏºÐ 2¡v¡A³o¨Ç¡u¹êÅéºÏºÐ 0¡v¡B¡u¹êÅéºÏºÐ 1¡vµ¥ºÙ¬°¶µ¥Ø¦WºÙ©Î¼ÐÅÒ ( item label )¡C³o¤T­Ó¤l¶µ¥Ø¤§¤U¤S¦U¦³¤l¶µ¥Ø¡A¹ï¡u¹q¸£¤¤ªºµwºÐ¡v¦Ó¨¥¡A´N¬O¡u®]¶µ¥Ø¡v¤F¡A¨Ò¦p¡u¹êÅéºÏºÐ 2¡v´N¦³¤@­Ó¤l¶µ¥Ø¡AºÙ¬°¡uD:¡v¡A¬O¡u¹q¸£¤¤ªºµwºÐ¡vªº®]¶µ¥Ø¡C¦b¹w³]ªº±¡§Î¤U¡A¾ðª¬À˵øªº¶µ¥Ø«e¬O¨S¦³«ö¶s»P½u±ø¡AµLªk²M·¡ªºÅã¥Ü¶¥¼hÃö«Y¡A¤]µLªk±oª¾¬Y¶µ¥Ø¬O§_§t¤l¶µ¥Ø¡A¶·¥H·Æ¹«ÂùÀ»¡A¦pªG¯àÅã¥Ü¤U¤@¼hªº¤l¶µ¥Ø¤~¯àª¾¹D¨ä¹ê¸Ó¶µ¥Ø§t¦³¤l¶µ¥Ø¡C

¦ý¬O¡A°²¦p¾ðª¬À˵ø³]¦³ TVS_HASBUTTONS ­·®æ¡A«h·|¦b¨C­Ó¨ã¦³¤l¶µ¥Øªº¶µ¥Ø«e¥X²{©Î«ö¶s¡A¤À§Oªí¥Ü¥¼®i¶} ( ¦U¤l¶µ¥Ø¦¬Ãl°_¨Ó ) ©Î¤w®i¶} ( §â¤l¶µ¥ØÅã¥Ü©ó¸Ó¶µ¥Ø©³¤U ) ª¬ºA¡F¨Ï¥ÎªÌ¤]¥i¥H¥H·Æ¹«³æÀ»³o¨âºØ«ö¶s¡A¥H®i¶}©Î¦¬Ãl¶µ¥Ø¡C¦ý¬O®Ú¶µ¥Ø«e¤£·|¦³«ö¶s¡A¦pªG­n©ó®Ú¶µ¥Ø«eÅã¥Ü«ö¶s¡A¶·¥[¤W TVS_LINESATROOT ­·®æ¡C¦pªG¸Ó¶µ¥Ø¨S¦³¤l¶µ¥Ø¡A´N¤£Åã¥Ü«ö¶s¡C°²¦p³]©w¤F TVS_HASLINES ­·®æ¡A¨t²ÎÁÙ·|¥Hµê½u³s±µ¤÷¶µ¥Ø»P¤l¶µ¥Ø¡C³o¼Ë´NÅܦ¨¤W¹Ïªºµøµ¡¤F¡C

¦b¹w³]ªº±¡§Î¤U¡A¦pªG·Æ¹«´å¼Ð¦b¬Y­Ó¶µ¥Ø¤WªÅ¡A¨S«ö·Æ¹«¥ªÁä¡A¦Ó¸Ó¶µ¥Ø¦WºÙ¤S¶W¥Xµøµ¡½d³ò¡A¨º»ò¾ðª¬À˵ø·|¼u¥X¤@­Ó¤u¨ã´£¥Ü ( tooltip ) Åã¥Ü§¹¾ãªº¶µ¥Ø¦WºÙ¡C³o­Ó¤u¨ã´£¥Ü¤]¥s infotip¡A¥¦¬O¾ðª¬À˵øªº¤lµøµ¡¡Aµ{¦¡¥i¥H³]©w TVS_NOTOOLTIPS ­·®æ¡A¸T¤îÅã¥Ü¤u¨ã´£¥Ü¡C¤]¥i¥H³B²z TVN_GETINFOTIP ³qª¾½X¡A³]©w¤u¨ã´£¥Üªº­·®æ©Î¤å¦r¡C¤W¹Ï¤¤¡A¥H²H¶À¦â©³ªº®ð²yª¬ªºµøµ¡¡A´N¬O¤u¨ã´£¥Ü¡C


¾ðª¬À˵ø±±¨î¶µ·§»¡

«Ø¥ß¾ðª¬À˵ø±±¨î¶µ

«Ø¥ß¾ðª¬À˵ø±±¨î¶µ¦³¨âºØ¤èªk¡G¤@¬O¦b¸ê·½´y­zÀɤ¤ªº¹ï¸Ü²°­±ªOùØ©w¸q¡F©ÎªÌ¬O¦bµ{¦¡¤¤©I¥s CreateWindowEx «Ø¥ß¡C¤£½×¬O­þ¤@ºØ¤èªk¡A©Ò¨Ï¥Îªºµøµ¡Ãþ§O³£¬O¡uSysTreeView32¡v¡A¨Ã¥B­n©I¥s InitCommonControls ©Î InitCommonControlsEx¡C¦p©³¤U¬O©I¥s CreateWindowEx «Ø¥ß¾ðª¬À˵ø±±¨î¶µ¡G

.CONST
szClass DB  "SysTreeView32",0

.CODE
INVOKE  CreateWindowEx,0,OFFSET szClass,0,WS_BORDER or WS_CHILD or WS_VISIBLE,\
        10,10,160,200,hWnd,0,hInstance,0
mov     hTreeView,eax

¾ðª¬À˵øªº­·®æ ( style )

©³¤U¬O¾ðª¬À˵øªº­·®æ¡G

­·®æ»¡©ú
TVS_CHECKBOXES 4.70 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¦b¶µ¥Ø«eÅã¥ÜÀËÅç²°¡A¥i¨Ñ¨Ï¥ÎªÌ¤Ä¿ï¡A¦Ó¥B¥u¦³¾ðª¬À˵ø»P Image List ³sµ²«á¤~·|Åã¥ÜÀËÅç²°¡C§ó¸Ô²Óªº²Ó¸`°Ñ¦Ò MSDN¡C
TVS_DISABLEDRAGDROP¤£µo°e TVN_BEGINDRAG µ¹¾ðª¬À˵ø±±¨î¶µ¡A¦]¦¹µLªk¥H·Æ¹«©ì¦²¶µ¥Ø¡C
TVS_EDITLABELS¤¹³\´N¦a½s¿è¶µ¥Ø¦WºÙ
TVS_FULLROWSELECT¥u¦³ 4.71 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¨Ï¥ÎªÌ¿ï¨ú¶µ¥Ø®É¡A¾ã¦C³£·|ÅÜ°ª«G«×Åã¥Ü¡A¤£¯à»P TVS_HASLINES ·f°t¨Ï¥Î
TVS_HASBUTTONSÅã¥Ü©Î«ö¶s¡A¨Ï¥ÎªÌ«ö¦¹«ö¶s¯à®i¶}©Î¦¬Ãl
TVS_HASLINES¥Hµê½u¬q§â¤÷¶µ¥Ø»P¤l¶µ¥Ø³s±µ¡Aªí¥Ü¶¥¼hÃö«Y
TVS_INFOTIP4.70 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¨ã¦³¦¹­·®æ®É¡A·í·Æ¹«²¾¹L¶µ¥Ø¤WªÅ®É¡A¾ðª¬À˵ø·|µo°e TVN_GETINFOTIP ³qª¾½Xµ¹¤÷µøµ¡¡C
TVS_LINESATROOT¥Hµê½u³s±µ®Ú¶µ¥Ø¡C¦pªG¨S«ü©w TVS_HASLINES¡A¨t²Î·|©¿²¤¦¹­·®æ¡C
TVS_NOHSCROLL5.80 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¦¹­·®æ¨Ï¾ðª¬À˵ø¤£Åã¥Ü¤ô¥­±²¶b
TVS_NONEVENHEIGHT¶µ¥Ø¹w³]°ª«×¬°°¸¼Æ­È¡A³]©w¦¹­·®æ«á¥i¥Hµo¥X TVM_SETITEMHEIGHT ³]©w©_¼Æ­Èªº¶µ¥Ø°ª«×¡A4.71 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡C
TVS_NOSCROLL4.71 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¤£Åã¥Ü¤ô¥­±²¶b¤Î««ª½±²¶b
TVS_NOTOOLTIPS4.70 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¸T¥Î¤u¨ã´£¥Ü ( ¦b¾ðª¬À˵ø±±¥ó«Ø¥ßªº¦P®É¡A¤]·|«Ø¥ß¤@­Ó¤u¨ã´£¥Ü¬°¨ä¤lµøµ¡¡A¦pªG¤£»Ý­n«Ø¥ß¤u¨ã´£¥Ü¡A´N­n«ü©w TVS_NOTOOLTIPS¡C¾ðª¬À˵øªº¤u¨ã´£¥Ü¦n¹³¤]¥s INFOTIP¡C)
TVS_RTLREADING4.70 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¶µ¥Ø¦WºÙ¥Ñ¥k¦Ü¥ªÅã¥Ü¡A¥u¦³¦b§Æ§B¨Ó»y¡Bªü©Ô§B»yµ¥ª©¥»ªº Windows ¤~¦³¥i¥Î¦¹­·®æ¡C
TVS_SHOWSELALWAYS§Y¨Ï¾ðª¬À˵ø¥¢¥h¿é¤JµJÂI¡A¤]¯à¥H°ª«G«×Åã¥Ü³Q¿ï©wªº¶µ¥Ø
TVS_SINGLEEXPAND4.71 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A¥u¦³³Q¿ï¨ú¶µ¥Ø©³¤Uªº¤l¶µ¥Ø®i¶}¡A¨ä¾l¶µ¥Ø³£·|¦¬Ãl¡F¦Ó¥B·Æ¹«ÂIÀ»¬Y¶µ¥Ø¤@¦¸´N¯à®i¶}¤l¶µ¥Ø¡A¦AÂIÀ»¸Ó¶µ¥Ø´N¦¬Ãl¡C¦pªG¦b¥H·Æ¹«ÂI¿ï¶µ¥Ø¦P®É¡AÁÙ«ö¦í Ctrl Áä¡A«h¨ä¾l¶µ¥Ø¤£·|¦¬Ãl©Î®i¶}¡C
TVS_TRACKSELECT4.71 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¤~¥i¨Ï¥Î¡A·Æ¹«´å¼Ð«ü¨ì¥ô¤@¶µ¥Ø®É¡A¸Ó¶µ¥Ø·|Åܦ¨¡u¶W³sµ²¡vªº¼Ë¤l¡A·Æ¹«´å¼ÐÅܦ¨¤â§Î¡C

§Y¨Ï¾ðª¬À˵ø¤w«Ø¥ß¦n¤F¡A§Ú­ÌÁÙ¬O¥i¥H¨Æ«á§ïÅܩΦs¨ú¾ðª¬À˵øªº­·®æ¡A«eªÌ¥i¥H©I¥s SetWindowLong¡F«áªÌ«h¬O©I¥s GetWindowLong¡C½Ð°Ñ¦Ò²Ä 22 ³¹¡C

¾ðª¬À˵øªº©µ¦ù­·®æ ( extended style )

©³¤U¬O Tree View ªº©µ¦ù­·®æ¡G

©µ¦ù­·®æ»¡©ú
TVS_EX_AUTOHSCROLL¤£Åã¥Ü¤ô¥­±²¶b¡A¦ý¬O¥i¥H§â©Ò¿ï¨úªº¶µ¥Ø¡A¦Û°ÊªºÅã¥Ü¦b¾ðª¬À˵ø¥i¬Ý¨£ªº°Ï°ì¤¤¡C
TVS_EX_DIMMEDCHECKBOXES
TVS_EX_DOUBLEBUFFERTVS_EX_DOUBLEBUFFER ·|§i¶D¾ðª¬À˵ø­n³z¹LÂù­«½w½Ä¶i¦æø»s¡A³o¥i¥HÁקK±±¨î¶µ¦b½Õ¾ã¤j¤p®É°{Ã{¡C
TVS_EX_DRAWIMAGEASYNC
TVS_EX_EXCLUSIONCHECKBOXES
TVS_EX_FADEINOUTEXPANDOS¥i­n¨D²H¥X®ÄªG
TVS_EX_MULTISELECT¦b Windows XP ¤§«e³£¤£¤ä´©¡A³Ì¦n§O¨Ï¥Î
TVS_EX_NOINDENTSTATE
TVS_EX_PARTIALCHECKBOXES
TVS_EX_RICHTOOLTIP

¾ðª¬À˵ø±±¨î¶µªº©µ¦ù­·®æ¦ü¥G¸ò²M³æÀ˵ø¤@¼Ë¡A³£¤£¯à¦b¸ê·½ÀÉùس]©w¡A¦]¦¹¥u¦n¹ï¾ðª¬À˵øµo¥X TVM_SETEXTENDEDSTYLE °T®§¡A¨Ó³]©w©µ¦ù­·®æ¡C¤£¹L¬°¤F¤£¯}Ãa¨ä¥L©µ¦ù­·®æ¡A¶È¶È³]©w§Ú­Ì·Q­nªº©µ¦ù­·®æ¡A©Ò¥HÀ³¸Ó¥ý¥H TVM_GETEXTENDEDSTYLE ¨ú±o©µ¦ù­·®æ¡A¦A°µ¹Bºâ¡A³Ì«á¤~§â©µ¦ù­·®æ¶Çµ¹¾ðª¬À˵øùØ¡C¨Ò¦p­n³]©w TVS_EX_AUTOHSCROLL¡A§@ªkÀ³¸Ó¦p¤Uµ{¦¡¡G

        INVOKE  SendMessage,hTreeView,TVM_GETEXTENDEDSTYLE,0,0              ;¨ú±o©µ¦ù­·®æ¡A¦s©ó EAX
        or      eax,TVS_EX_AUTOHSCROLL                                      ;¥[¤W TVS_EX_AUTOHSCROLL
        INVOKE  SendMessage,hTreeView,TVM_SETEXTENDEDSTYLE,hTreeView,eax    ;µo°e©µ¦ù­·®æµ¹¾ðª¬À˵ø

¦pªG­n¨ú®ø TVS_EX_AUTOHSCROLL¡A°µªk¦p¤U¡G

        INVOKE  SendMessage,hTreeView,TVM_GETEXTENDEDSTYLE,0,0              ;¨ú±o©µ¦ù­·®æ¡A¦s©ó EAX
        or      eax,not TVS_EX_AUTOHSCROLL                                  ;¨ú®ø TVS_EX_AUTOHSCROLL
        INVOKE  SendMessage,hTreeView,TVM_SETEXTENDEDSTYLE,hTreeView,eax    ;µo°e©µ¦ù­·®æµ¹¾ðª¬À˵ø

¾ðª¬À˵øªº¶µ¥Øª¬ºA ( item state )

¾ðª¬À˵øùتº¨C­Ó¶µ¥Ø³£¦³¬Y¨Çª¬ºA¡A³o¨Çª¬ºA¬O«ü¬O§_³Q¿ï¨úªº ( selected )¡B¬O§_¦³®Äªº ( disabled )¡B¬O§_®i¶}ªº ( expanded )¡K¡Kµ¥µ¥¡C¨C¤@ºØª¬ºA³£¥Ñ¤@­Ó¦ì¤¸ªí¥Ü¡A¤j³¡¤Àªº±¡§Î¤U¡A¨t²Î·|¦Û¦æ³]©w¡A¨Ò¦p·í¨Ï¥ÎªÌ¥H·Æ¹«¦b¶µ¥Ø¤WÂIÀ»®É¡A´N·|¨Ï¸Ó¶µ¥Ø¦Û°ÊªºÅܬ°³Q¿ï¨úªº¡F¦ý¬Oµ{¦¡¤]¯à¦Û¦æ³]©w¬Y¶µ¥Øªºª¬ºA¡A­n³o¼Ë°µ¥i¥H¹ï¾ðª¬À˵øµo¥X TVM_SETITEM °T®§³]©w¬Y­Ó¶µ¥Øªºª¬ºA¡Aµ{¦¡¤]¥i¥Hµo°e TVM_GETITEM °T®§¥H¨ú±o¬Y­Ó¶µ¥Øªºª¬ºA¡C©³¤U¬Oµo¥X TVM_SETITEM °T®§ªº¹Lµ{¡G

        INVOKE  SendMessage,hTreeView,TVM_SETITEM,0,ADDR tvi

hTreeView ¬O¾ðª¬À˵øªº¥N½X¡AwParam ¤£¨Ï¥Î¶·³]¬° 0¡AlParam ¬Oµ²ºcÅé tvi ªº¦ì§}¡Atvi ¬O¤@­ÓºÙ¬° TVITEM ªºµ²ºcÅé¡ATVITEM µ²ºcÅ骺¦U­ÓÄæ¦ì¬O¡G

TVITEM          STRUCT
imask           UINT    ?
hItem           HANDLE  ?
state           UINT    ?
stateMask       UINT    ?
pszText         LPTSTR  ?
cchTextMax      DWORD   ?
iImage          DWORD   ?
iSelectedImage  DWORD   ?
cChildren       DWORD   ?
lParam          LPARAM  ?
TVITEM          ENDS

TVITEM ªº²Ä¤@­ÓÄæ¦ì¬O imask¡A¦b MSDN ºÙ¬° mask¡A¦ý mask »P MASM ªº«O¯d¦r¬Û¦P¡A¬G MASM32 §ï¬° imask ©Î _mask¡A¦¹Äæ¦ì«ü¥X TVITEM ùتº­þ¨ÇÄæ¦ì¬O¦³®Äªº¡A¥²¶·³]©w¡A¤Uªí¦C¥X imask »P¨ä¥LÄæ¦ìªºÃö«Y¡G

imask ¼vÅTÄæ¦ì»¡¡@¡@¡@©ú
TVIF_HANDLE hItem ¶µ¥Øªº¥N½X
TVIF_STATE state
stateMask
³]©w©Î¨ú±o¶µ¥Øªºª¬ºA
TVIF_TEXT pszText
cchTextMax
pszText «ü¦V¥H NULL µ²§Àªº¦r¦ê¡A°µ¬°¶µ¥Øªº¦WºÙ¡F¦pªG pszText ¬° LPSTR_TEXTCALLBACK ªº¸Ü¡A¨º»ò¾ðª¬À˵ø±±¨î¶µ·|¦b­nÅã¥Ü¡B©Î±Æ§Ç¡B©Î½s¿è¶µ¥Ø¦WºÙ®É¡A©Î¬O¶µ¥Ø¦WºÙ§ïÅܦӵo¥X TVN_GETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡Aµ{¦¡À³¦b³B²z¦¹³qª¾½X®É³]¦n¶µ¥Ø¦WºÙ¡C
cchTextMax ¬O pszText ©Ò«ü¦r¦êªº¤j¤p¡A¥H¦r¤¸¬°³æ¦ì¡A¦pªG¬O³]©w¦r¦ê¡A¦]¬°¥i¥Ñ NULL °µµ²§À¡A©Ò¥H cchTextMax ·|³Q¨t²Î©¿²¤¡C
TVIF_IMAGE iImage image list ªº¯Á¤Þ­È¡A¥iÅã¥Ü¥X¶µ¥Ø¥¼³Q¿ï©w®Éªº¹Ï¥Ü¡C¦pªG¦¹Äæ¦ì¬° I_IMAGECALLBACK¡A«h¾ðª¬À˵ø·|§â¦b»Ý­nÅã¥Ü¹Ï¥Ü®É¡Aµo¥X TVN_GETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡A¤÷µøµ¡ªºµøµ¡¨ç¦¡³B²z¦¹³qª¾½X®É¦A«ü©w¥¼³Q¿ï©wªº¹Ï¥Ü¡C
TVIF_SELECTEDIMAGE iSelectedImage image list ªº¯Á¤Þ­È¡A¥iÅã¥Ü¥X¶µ¥Ø³Q¿ï©w®Éªº¹Ï¥Ü¡C¦pªG¦¹Äæ¦ì¬° I_IMAGECALLBACK¡A«h¾ðª¬À˵ø·|§â¦b»Ý­nÅã¥Ü¹Ï¥Ü®É¡Aµo¥X TVN_GETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡A¤÷µøµ¡ªºµøµ¡¨ç¦¡³B²z¦¹³qª¾½X®É¦A«ü©w³Q¿ï©wªº¹Ï¥Ü¡C
TVIF_CHILDREN cChildren «ü¥X¦¹¶µ¥Ø©³¤U¦³¦h¤Ö­Ó¤l¶µ¥Ø¡A¥i¥H¬O¡G
  1. 0¡G¨S¦³¤l¶µ¥Ø¡A¦pªG¾ðª¬À˵ø¨ã¦³ TVS_HASBUTTONS¡A¶µ¥Ø«e·|Åã¥Ü
  2. 1¡G¹w©w¦³¤@­Ó©Î¤@­Ó¥H¤Wªº¤l¶µ¥Ø¡A¦pªG¨ã¦³ TVS_HASBUTTONS ªº¾ðª¬À˵ø¡A­è¥[¤Jªº¶µ¥Ø¥i¯à¨S¦³¤l¶µ¥Ø¡A¦ý¦pªG cChildren ³]¬° 1¡A«h¸Ó¶µ¥Ø«e¤´·|Åã¥Ü
  3. I_CHILDRENCALLBACK¡G¾ðª¬À˵ø¦b»Ý­nÅã¥Ü¶µ¥Ø®É¡A¶Ç°e TVN_GETDISPINFO °T®§µ¹¤÷µøµ¡¡A¥Î¨Ó«ü©w¦¹¶µ¥Øªº¤l¶µ¥Ø¡C¦pªG¾ðª¬À˵ø¨ã¦³ TVS_HASBUTTONS ­·®æ¡A¥i¥H±j­¢Åã¥Ü¦³¤l¶µ¥Øªº«ö¶s¡A¤£½×¬O§_¯u¦³¤l¶µ¥Ø¡C
TVIF_PARAM lParam µ{¦¡¦Û¦æ©w¸qªº¼Æ­È

·íµ{¦¡­n¦Û¦æ§ïÅܬY­Ó¶µ¥Øª¬ºA®É¡A³q±`¶È¶È§ïÅܤ@­Óª¬ºA¡A¦Ó¨ä¾lª¬ºA¤£ÅÜ¡A¥ç§Y¨ä¾lª¬ºAªº¦ì¤¸¶·¾B¸n ( mask )¡C¨Ò¦p©³¤Uªºµ{¦¡¬O¨Ï¬Y­Ó¶µ¥ØÅܲÊÅé¦r¡A¦Ó¨ä¾lª¬ºA«h¤£ÅÜ¡G

        mov     tvi.imask,TVIF_HANDLE or TVIF_STATE
        mov     ecx,hitem
        mov     tvi.hItem,ecx                       ;§ïÅÜ hitem ¶µ¥Ø¬°²ÊÅé¦rª¬ºA
        mov     tvi.state,TVIS_BOLD                 ;²ÊÅé¦rª¬ºA
        mov     tvi.stateMask,TVIS_BOLD             ;¾B¸n°£¤F²ÊÅé¦r¥H¥~ªº¦ì¤¸
        INVOKE  SendMessage,hTreeView,TVM_SETITEM,0,OFFSET tvi

¤W­±µ{¦¡ªº²Ä¤@¦æ¡A´N¬O§i¶D¨t²Î TVITEM Äæ¦ì¥u¦³ hItem¡Bstate ¦³®Ä¡A²Ä¥|¦æ«h¬O§ïÅܪ¬ºA¬°²ÊÅé¡A²Ä¤­¦æ«h¬O¥u¦³²ÊÅ騺­Ó¦ì¤¸ÅÜ°Ê¡A¨ä¾l¤£ÅÜ¡C

©³¤U¬O¾ðª¬À˵øªº¶µ¥Øª¬ºA¡G

ª¬ºA¤Q¤»¶i¦ì
¼Æ­È
»¡©ú
TVIS_FOCUSED1 ¦¹¶µ¥Ø³B©óµJÂIª¬ºA¡A¤]´N¬O³Qµê½u®Ø¥]³ò¦í¡C
TVIS_SELECTED2 ¦¹¶µ¥Ø³B©ó³Q¿ï¨úªºª¬ºA¡A¦¹®É¸Ó¶µ¥Øªº©³¦â·|¥H¤Ï¥ÕÅã¥Ü¡A¦pªG¦P®É¤]¨ã¦³¿é¤JµJÂI ( ¤j³¡¥÷ªº±¡§Î¤U )¡A¨º»ò¸Ó¶µ¥Ø¤]·|¬°µê½u¥~®Ø¥]³ò¦í¡C
TVIS_CUT4 ¦¹¶µ¥Ø³B©ó¼Ð°O ( marked ) ª¬ºA¡C
TVIS_DROPHILITED8 ¦¹¶µ¥Ø³Q¿ï¬°©ì¦² ( drag and drop ) ªº¥Ø¼Ð¡A¥ç§Y·í¨Ï¥ÎªÌ©ì¦²¥Ò¶µ¥Ø¨ì¤A¶µ¥Ø®É¡A¤A¶µ¥Ø¨ã¦³ TVIS_DROPHILITED ª¬ºA¡C
TVIS_BOLD10h ¶µ¥Ø¬°²ÊÅé¦r¡C
TVIS_EXPANDED20h ¬Y­Ó¤÷¶µ¥Ø©³¤Uªº¤l¶µ¥Ø¤w³Q®i¶}¡A¨ä¤l¶µ¥Ø¯àÅã¥Ü¥X¨Ó¡A¥u¦³¨ã¦³¤l¶µ¥Øªº¶µ¥Ø¤~¯à¦³¦¹ª¬ºA¡C
TVIS_EXPANDEDONCE40h ¬Y­Ó¤÷¶µ¥Ø©³¤Uªº¤l¶µ¥Ø´¿¸g³Q®i¶}¹L¡A¦¹ª¬ºA¥u¯à³]¦b¨ã¦³¤l¶µ¥Øªº¤÷¶µ¥Ø¤W¡C¦pªG¦b³B²z TVM_EXPAND °T®§®É¡A¤÷¶µ¥Ø¦³¦¹ª¬ºA¡A´N¤£·|¬°²£¥Í TVN_ITEMEXPANDING ©M TVN_ITEMEXPANDED ³qª¾½X¡C­Y·Q°£¥h¦¹ª¬ºA¡A¥i¥Hµo¥X TVM_EXPAND °T®§¡A¨Ã¨Ï wParam ¬°¡uTVE_COLLAPSE or TVE_COLLAPSERESET¡v¡C
TVIS_OVERLAYMASK0F00h ¥Î¨ÓÀò±o¶µ¥Ø­«Å|¹Ï¤ù¯Á¤Þªº¾B¸n½X
TVIS_STATEIMAGEMASK0F000h ¥Î¨ÓÀò±o¶µ¥Øª¬ºA¹Ï¤ù¯Á¤Þªº¾B¸n½X
TVIS_USERMASK0F000h »P TVIS_STATEIMAGEMASK ¬Û¦P

¨Æ¹ê¤W¡A¦b TVITEM µ²ºcÅéùتº state Äæ¦ì¡A¥u¦³ 0¡ã7 ¦ì¤¸¡A¤~¬Oªí¥Ü¶µ¥Øª¬ºA¡F8¡ã11 ¦ì¤¸¡Aªí¥Ü­«Å|¹Ï¤ù ( overlay image )¡A³o¥|­Ó¦ì¤¸ªí¥Ü¤@­Ó¤Q¤»¦ì¤¸¼Æ­È¡A¦¹¼Æ­È¬° image list ªº¯Á¤Þ¡A¥Ñ¤@¶}©l¡C¦pªG¦¹¼Æ­È¬°¹s¡Aªí¥Ü¨S¦³­«Å|¹Ï¤ù¡C­n¨ú±o­«Å|¹Ï¤ù¯Á¤Þ¡A´N¥²¶·¨Ï state Äæ¦ì»P TVIS_OVERLAYMASK °µ AND ¹Bºâ¡Cstate Äæ¦ìªº 12¡ã15 ¦ì¤¸¡Aªí¥Üª¬ºA¹Ï¤ù¡A¥Ñ¤@¶}©l¡A¦pªG¦¹¼Æ­È¬°¹s¡Aªí¥Ü¨S¦³ª¬ºA¹Ï¤ù¡C­n¨ú±oª¬ºA¹Ï¤ù¯Á¤Þ¡A´N¥²¶·¨Ï state Äæ¦ì»P TVIS_STATEIMAGEMASK °µ AND ¹Bºâ¡C


¦b¾ðª¬À˵ø¤¤ªº¶µ¥Ø ( item )

¦b¾ðª¬À˵ø¤¤·s¼W¡B¬d¸ß¶µ¥Øµ¥µ¥°Ê§@¡A³£¬O©I¥s SendMessage¡A¹ï¾ðª¬À˵øµo¥X¯S©wªº°T®§¡A¸Ó°T®§¥]§t¾Þ§@¤Î©Ò»Ý¸ê®Æ¡A¦Ó©I¥s¦¨¥\«á¡A¾ðª¬À˵ø§Y¨Ì¸Ó¾Þ§@§¹¦¨°Ê§@¡C¨Ò¦p­n·s¼W¶µ¥Ø´N¬Oµo¥X TVM_INSERTITEM °T®§¡C·í¨Ï¥ÎªÌ¹ï¾ðª¬À˵ø¤¤ªº¶µ¥Ø°µ­×§ï©Î©ì¦² ( drag and drop ) ®É¡A¾ðª¬À˵ø«h¬Oµo¥X³qª¾½Xµ¹¤÷µøµ¡¡A¦Ó¤÷µøµ¡«h¦b³B²z¸Ó³qª¾½X®É¡A°µ¤@¨Ç³B²z¡C

¼W²K¶µ¥Ø

­n¦b¾ðª¬À˵ø±±¨î¶µ¤¤·s¼W¤@­Ó¶µ¥Ø¡A¥²¶·¹ï¾ðª¬À˵ø±±¨î¶µµo¥X TVM_INSERTITEM °T®§¡Aµ{¦¡¦p¤U¡G

        INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis

¦pªG¦¨¥\´¡¤J·s¶µ¥Ø¡A¶Ç¦^·s¶µ¥Øªº¥N½X¡A§_«hªð¦^ 0¡C³o­Ó°T®§ªº¶Ç¦^­È»P²M³æÀ˵ø±±¨î¶µ ( list view ) ´¡¤J¶µ¥Ø°T®§ ( LVM_INSERTITEM ) ªº¶Ç¦^­È«Ü¤£¦P¡A LVM_INSERTITEM °T®§¶Ç¦^¯Á¤Þ­È¡A¦ý¬O TVM_INSERTITEM «o¶Ç¦^¥N½X¡A¥D­n¬O¦]¬°¾ðª¬À˵ø±±¨î¶µªº¤l¶µ¥Ø©M¤÷¶µ¥Ø¦³¶¥¼hªºÃö«Y¡A©Ò¥H¬°¤FÂç²M¦U¶µ¥Ø¤§¶¡ªºÃö«Y¡A¨C­Ó¶µ¥Ø³£¦³¥N½X¡C¤W­±µ{¦¡ùØ¡AhTreeView ¬O¾ðª¬À˵ø±±¨î¶µ¥N½X¡A¦¹¥N½X¥i±µ¦¬¨ì TVM_INSERTITEM °T®§¡A¥H¼W²K·s¶µ¥Ø¡Ctvis ¬O¤@­ÓºÙ¬° TVINSERTSTRUCT µ²ºcÅé ( ¦b MASM32 v.11 ªº WINDOWS.INC v.1.60 ¤]ºÙ¬° TV_INSERTSTRUCT µ²ºcÅé )¡ASendMessage ªº³Ì«á¤@­Ó°Ñ¼Æ¬O TVINSERTSTRUCT µ²ºcÅ骺¦ì§}¡A¦¹µ²ºcÅ餺§t¦³·s¥[¤J¶µ¥Øªº¸ê®Æ¡A¨äÄæ¦ì¬O¡G

TVINSERTSTRUCT  STRUC
hParent         HANDLE      ?
hInsertAfter    HANDLE      ?
UNION
  itemex        TVITEMEX    <>
  item          TVITEM      <>
ENDS
TVINSERTSTRUCT  ENDS

²Ä¤@­ÓÄæ¦ì¡AhParent¡A¬O¤÷¶µ¥Øªº¥N½X¡A¦pªG¬O­n´¡¤J®Ú¶µ¥Ø¡A¦¹Äæ¦ì¬° TVI_ROOT ©Î NULL¡ChInsertAfter ¬O¬Y­Ó¶µ¥Øªº¥N½X¡A·s¥[¤Jªº¶µ¥Ø·|¦w´¡¦b¦¹¶µ¥Ø¤§«á¡A¦ý¤]¥i¥H¬O TVI_FIRST¡Aªí¥Ü´¡¦b¦P¤@¶¥¼h¶µ¥Øªº²Ä¤@­Ó¡F©Î¬O TVI_LAST¡Aªí¥Ü´¡¦b³Ì«á¤@­Ó¡F©Î¬O TVI_SORT¡Aªí¥Ü¨Ì¶µ¥Ø¦WºÙ±Æ§Ç¡C²Ä¤T­ÓÄæ¦ì¬O TVITEMEX µ²ºcÅé©Î TVITEM µ²ºcÅé¡C4.71 ª©¤Î¨ä¥H«áªº COMCTL32.DLL ¥i¥Î TVITEMEX¡A§_«h¥u¯à¨Ï¥Î TVITEM¡C¦w¸Ë¤F IE 4.0 ¥H«á¡ACOMCTL32.DLL ´N¬O 4.71 ª©¤F¡CTVITEM ¤]¥s TV_ITEM¡A«e­±¤w¸g»¡©ú¹L¤F¡CTVITEMEX ¤]¥s TV_ITEMEX¡A¬O TVITEM ªº©µ¦ù¡ATVITEMEX µ²ºcÅ骺Äæ¦ì¦p¤U¡G

TVITEMEX        STRUCT
imask           UINT    ?
hItem           HANDLE  ?
state           UINT    ?
stateMask       UINT    ?
pszText         LPTSTR  ?
cchTextMax      DWORD   ?
iImage          DWORD   ?
iSelectedImage  DWORD   ?
cChildren       DWORD   ?
lParam          LPARAM  ?
iIntegral       DWORD   ?
uStateEx        DWORD   ?
hwnd            HWND    ?
iExpandedImage  DWORD   ?
TVITEMEX        ENDS

±q imask ¨ì lParam ¬OÄÝ©ó TVITEM µ²ºcÅé¡AiIntegral ¨ì iExpandedImage ¬O TVITEMEX ¦h¥Xªº³¡¥÷¡A¦Ó uStateEx ¨ì iExpandedImage «h¬O Windows XP ¤Î¨ä¥H«áªº¨t²Î¤~¦³ªºÄæ¦ì¡C©³¤Uªºªí®æ¬O imask »P¦UÄæ¦ì¤§¶¡ªºÃö«Y¡G

imask ¼vÅTÄæ¦ì»¡¡@¡@¡@©ú
TVIF_HANDLE hItem ¶µ¥Øªº¥N½X
TVIF_STATE state
stateMask
³]©w©Î¨ú±o¶µ¥Øªºª¬ºA¡A½Ð°Ñ¦Ò¾ðª¬À˵øªº¶µ¥Øª¬ºA¡C
TVIF_TEXT pszText
cchTextMax
pszText «ü¦V¥H NULL µ²§Àªº¦r¦ê¡A°µ¬°¶µ¥Øªº¦WºÙ¡F¦pªG pszText ¬° LPSTR_TEXTCALLBACK ªº¸Ü¡A¨º»ò¾ðª¬À˵ø±±¨î¶µ·|¦b­nÅã¥Ü¡B©Î±Æ§Ç¡B©Î½s¿è¶µ¥Ø¦WºÙ®É¡A©Î¬O¶µ¥Ø¦WºÙ§ïÅܦӵo¥X TVN_GETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡Aµ{¦¡À³¦b³B²z¦¹³qª¾½X®É³]¦n¶µ¥Ø¦WºÙ¡C
cchTextMax ¬O pszText ©Ò«ü¦r¦êªº¤j¤p¡A¥H¦r¤¸¬°³æ¦ì¡A¦pªG¬O³]©w¦r¦ê¡A¦]¬°¥i¥Ñ NULL °µµ²§À¡A©Ò¥H cchTextMax ·|³Q¨t²Î©¿²¤¡C
TVIF_IMAGE iImage image list ªº¯Á¤Þ­È¡A¥iÅã¥Ü¥X¶µ¥Ø¥¼³Q¿ï©w®Éªº¹Ï¥Ü¡C¦pªG¦¹Äæ¦ì¬° I_IMAGECALLBACK¡A«h¾ðª¬À˵ø·|§â¦b»Ý­nÅã¥Ü¹Ï¥Ü®É¡Aµo¥X TVN_GETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡A¤÷µøµ¡ªºµøµ¡¨ç¦¡³B²z¦¹³qª¾½X®É¦A«ü©w¥¼³Q¿ï©wªº¹Ï¥Ü¡C
TVIF_SELECTEDIMAGE iSelectedImage image list ªº¯Á¤Þ­È¡A¥iÅã¥Ü¥X¶µ¥Ø³Q¿ï©w®Éªº¹Ï¥Ü¡C¦pªG¦¹Äæ¦ì¬° I_IMAGECALLBACK¡A«h¾ðª¬À˵ø·|§â¦b»Ý­nÅã¥Ü¹Ï¥Ü®É¡Aµo¥X TVN_GETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡A¤÷µøµ¡ªºµøµ¡¨ç¦¡³B²z¦¹³qª¾½X®É¦A«ü©w³Q¿ï©wªº¹Ï¥Ü¡C
TVIF_CHILDREN cChildren «ü¥X¦¹¶µ¥Ø©³¤U¦³¦h¤Ö­Ó¤l¶µ¥Ø¡A¥i¥H¬O¡G
  1. 0¡G¨S¦³¤l¶µ¥Ø
  2. 1¡G¦³¤@­Ó©Î¤@­Ó¥H¤Wªº¤l¶µ¥Ø
  3. I_CHILDRENCALLBACK¡G¾ðª¬À˵ø¦b»Ý­nÅã¥Ü¶µ¥Ø®É¡A¶Ç°e TVN_GETDISPINFO °T®§µ¹¤÷µøµ¡¡A¥Î¨Ó«ü©w¦¹¶µ¥Øªº¤l¶µ¥Ø¡C¦pªG¾ðª¬À˵ø¨ã¦³ TVS_HASBUTTONS ­·®æ¡A¥i¥H±j­¢Åã¥Ü¦³¤l¶µ¥Øªº«ö¶s¡A¤£½×¬O§_¯u¦³¤l¶µ¥Ø¡C
TVIF_PARAM lParam µ{¦¡¦Û¦æ©w¸qªº¼Æ­È
TVIF_INTEGRALiIntegral ¶µ¥Øªº°ª«×¡C¦pªG¦¹Äæ¦ì¬° 2¡Aªí¥Ü¦¹¶µ¥Ø°ª«×¬°¥¿±`ªº 2 ­¿¡F¦pªG¦¹Äæ¦ì¬° 3¡Aªí¥Ü¦¹¶µ¥Ø°ª«×¬°¥¿±`ªº 3 ­¿¡C¦¹Äæ¦ì¥u³]©w³æ¤@¶µ¥Øªº°ª«×¡A­n³]©w©Ò¦³¶µ¥Øªº°ª«×¡A­nµo°e TVM_SETITEMHEIGHT °T®§µ¹¾ðª¬À˵ø¡C
TVIF_STATEEXuStateEx ¥u¦³ XP ¤Î¨ä¥H«áªº¨t²Î¥i¥Î¦¹ºX¼Ð¡C¥i¥H¬O¤U­±¨ä¤¤¤@ºØ¡G
  1. TVIS_EX_DISABLED¡G¥H¦Ç¦âªí¥Üªºª¬ºA¡A¨Ï¥ÎªÌµLªk¿ï¨ú¡C
  2. TVIS_EX_FLAT¡G¬Ý¤£¨£ªº¶µ¥Ø
  3. TVIS_EX_HWND¡G
¡@hwnd ¥¼¨Ï¥Î¡AÀ³³]¬° 0¡C
TVIF_EXPANDEDIMAGEiExpandedImage Vista ¤Î¨ä¥H«á¨t²Î¤~¥i¨Ï¥Î¡A®i¶}ªº¤l¶µ¥Ø¹Ï¥Ü¡A¦¹¹Ï¥Ü¬O image list ¤¤ªº¯Á¤Þ¡C
TVIF_DI_SETITEM ¡@ ¥u¯à¦b³B²z TVN_GETDISPINFO ®É¥i¥Î¡A¥¦¥iºû«ù­ì­È¡C

¦b¶µ¥Ø«e¥[¤J¹Ï¤ù

¦pªG·Q¦A¶µ¥Ø¥ªÃä¥[¤W¹Ï¤ùªº¸Ü¡A¦³¥|­Ó¨BÆJ¡G

  1. ­º¥ý¥²¶·©I¥s ImageList_Create «Ø¥ß¡u¹Ï¤ù²M³æ¡v( image list )¡AImageList_Create ­ì«¬¬O¡G

            ImageList_Create   PROTO   cx:DWORD,cy:DWORD,flags:DWORD,cInitial:DWORD,cGrow:DWORD

    ¦pªG¦¨¥\«Ø¥ß¡A«h·|¶Ç¦^¹Ï¤ù²M³æªº¥N½X¡A¸Ô²Ó»¡©ú°Ñ¦Ò²Ä 21 ³¹¡C

  2. ±N»Ý­n¥Î¨ìªº¹Ï¤ù¡A¦p BMP ¦ì¤¸¹Ï©Î¹Ï¥Ü¡A¥[¤J¨ì¹Ï¤ù²M³æùØ¡C¦pªG¬O­n¥[¤J¦ì¤¸¹Ï¡A¥i¥H©I¥s ImageList_Add¡F­n¥[¤J¹Ï¥Ü¡A©I¥s ImageList_ReplaceIcon¡C¸Ô²Ó»¡©ú°Ñ¦Ò²Ä 21 ³¹¡C

  3. µo°e TVM_SETIMAGELIST µ¹¾ðª¬À˵ø¡A§â¹Ï¤ù²M³æ»P¾ðª¬À˵ø³sµ²°_¨Ó¡C¤èªk¬O¡G

            INVOKE  SendMessage,hTreeView,TVM_SETIMAGELIST,iImage,himl

    iImage °Ñ¼Æ¥i¥H¦³¨âºØ­È¡GTVSIL_NORMAL ©M TVSIL_STATE¡A«eªÌ¥Nªí³Q¿ï©w©Î¥¼³Q¿ï©wªº¹Ï¤ù¡F«áªÌ¥Nªíµ{¦¡³]­p®v¦Û¦æ©w¸qªºªºª¬ºA¹Ï¤ù¡Chiml «h¬O¹Ï¤ù²M³æªº¥N½X¡A­Y himl ¬° NULL¡A«h¨t²Î·|²¾°£¾ðª¬À˵øªº image list¡C

  4. ³Ì«á¤@¨B¡A«h¬O¦b·s²K¥[¶µ¥Ø®É ( µo¥X TVM_INSERTITEM °T®§µ¹¾ðª¬À˵ø ) ©ÎªÌ¹ï¦b¤w¦s¦bªº¶µ¥Øµo¥X TVM_SETITEM ®É¡A³]©w TVITEM µ²ºcÅ骺 imask¡BiImage¡BiSelectedImage Äæ¦ì¡C­n³]©w¥¿±`Åã¥Ü©Î¥¼³Q¿ï¨úªº¹Ï¤ù®É¡A¥²¶·³]©w imask ªº TVIF_IMAGE ºX¼Ð¡A¨Ã©ó iImage Äæ¦ì¶ñ¤W image list ªº²Ä´X­Ó¹Ï¤ù¡C­nÅã¥Ü³Q¿ï¨úªº¹Ï¤ù¡A«h­n³]©w imask ªº TVIF_SELECTEDIMAGE ºX¼Ð¡A¨Ã©ó iSelectedImage Äæ¦ì¶ñ¤W image list ªº²Ä´X­Ó¹Ï¤ù¡C

¨ú±o¶µ¥Øªº¸ê®Æ

«e­±´£¹L¡A¦b¾ðª¬À˵øùبC·s²K¤@­Ó¶µ¥Ø¡A¸Ó¶µ¥Ø´N¾Ö¦³¤@­Ó¥N½X¡A¨º»ò¡Aµ{¦¡»Ý¤£»Ý­nµe¥X¤@¶ô°O¾ÐÅé¨Ó«O¦s¨C­Ó¶µ¥Øªº¥N½X©O¡Hµª®×¬O¤£»Ý­n¡A¤×¨ä¬O§âºÏºÐùتº¥Ø¿ý·í¦¨¾ðª¬À˵øªº¶µ¥Ø®É¡A³o®É¶µ¥Øªº¼Æ¶q¥i¯à·|µLªk¹wª¾¦Ó¥B¥i¯à«D±`¦h¡C¬JµM¤£¥²«O¦s¶µ¥Øªº¥N½X¡A¨º»ò¸Ó¦p¦ó¤~¯à¨ú±o¶µ¥Øªº¸ê®Æ©O¡H¤@¯ë¦Ó¨¥¡A­n¨ú±o¬Y­Ó¶µ¥Øªº¸ê®Æ¦³¨â¨BÆJ¡G

©³¤U¥H¨ú±o®Ú¶µ¥Øªº¦WºÙ¬°¨Ò¤l¡A»¡©ú³o¨â­Ó¨BÆJ¡Aµ{¦¡½X¦p¤U¡G

        LOCAL   tvi:TVITEM
        LOCAL   buffer[200]:BYTE                                    ;¦s©ñ®Ú¶µ¥Ø¦WºÙ³B
        INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_ROOT,0   ;EAX¡×®Ú¶µ¥Ø¥N½X
        lea     edx,buffer
        mov     tvi.hItem,eax
        mov     tvi.imask,TVIF_TEXT
        mov     tvi.pszText,edx
        mov     tvi.cchTextMax,SIZEOF buffer
        INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvi        ;©I¥s¦¨¥\«á¡Abuffer ¦s¦³®Ú¶µ¥Ø¦WºÙ

¦pªG­n±o¨ì®Ú¶µ¥Ø¦³´X­Ó¤l¶µ¥Ø¡A«h¨Ï tvi.imask Äæ¦ìÅܦ¨¡uTVIF_TEXT or TVIF_CHILDREN¡v¡A©I¥s¦¨¥\«á¡A·|¦b cChildren Äæ¦ì¦s¦³¤l¶µ¥Ø­Ó¼Æ¡C

´N¦a½s¿è¶µ¥Ø¦WºÙ

¨Ï¥Î TVN_BEGINLABELEDIT »P TVN_ENDLABELEDIT

°²¦p¾ðª¬À˵ø¨ã¦³¡uTVS_EDITLABELS¡v­·®æ®É¡A´N¥i¥H¨Ï¥Î´N¦a½s¿è¡C´N¦a½s¿èªº·N«ä¬O¡A¦b¬Y­Ó³Q¿ï©wªº¶µ¥Ø¤W¡A¦A¥H·Æ¹«¥ªÁä³æÀ»¤@¦¸¡A´N·|¦b¸Ó¶µ¥Ø¤W¥X²{¤@­Ó½s¿è®Ø¡A¥i¥H¨Ñ¨Ï¥ÎªÌ­×§ï¶µ¥Ø¦WºÙ¡C¦bµ{¦¡¤¤­n³B²z´N¦a½s¿è¡A¥²¶·³B²z¨â­Ó³qª¾½X¡ATVN_BEGINLABELEDIT ©M TVN_ENDLABELEDIT¡C³o¨â­Ó³qª¾½X¬O¨Ï¥ÎªÌ°µ¤F´N¦a½s¿èªº°Ê§@¤§«á¡A³z¹L¾ðª¬À˵ø¶Çµ¹¤÷µøµ¡ªºµøµ¡¨ç¦¡¡A¤÷µøµ¡¦A¥[¥H³B²z¡C¤÷µøµ¡¤]¥i¥H¦Û¦æµo¥X TVM_EDITLABEL °T®§µ¹¾ðª¬À˵ø¡A­n¨D´N¦a½s¿è¡C

·í¨Ï¥ÎªÌ°µ¤F´N¦a½s¿èªº°Ê§@©Î¤÷µøµ¡¹ï¾ðª¬À˵øµo¥X TVM_EDITLABEL ¤§«á¡A¾ðª¬À˵ø·|«Ø¥ß¤@­Ó½s¿è®Ø¨Ñ¨Ï¥ÎªÌ½s¿è¶µ¥Ø¦WºÙ¡C¦b¦¹½s¿è®Ø©|¥¼Åã¥Ü©ó¿Ã¹õ®É¡A¾ðª¬À˵ø«Kµo¥X TVN_BEGINLABELEDIT ³qª¾½Xµ¹¤÷µøµ¡¡Aµ{¦¡¥i¥H¦b³B²z TVN_BEGINLABELEDIT ³qª¾½X®É¡Aµo¥X TVM_GETEDITCONTROL °T®§µ¹¾ðª¬À˵ø¦ÓÀò±o½s¿è®Ø¥N½X¡A¨Ï½s¿è®Ø²Å¦X­n¨D¡C¨Ò¦pµo¥X EM_SETLIMITTEXT µ¹½s¿è®Ø­­¨î¿é¤J¦r¼Æ¡C

«Ý¨Ï¥ÎªÌ¥H·Æ¹«¥ªÁä³æÀ»¨ä¥L°Ï°ì¡Aªí¥Ü¨Ï¥ÎªÌ¿é¤J§¹¦¨¡A³o®É¾ðª¬À˵øµo¥X TVN_ENDLABELEDIT ³qª¾½Xµ¹¤÷µøµ¡¡C³o¬q®É´Á¤º¡A¤÷µøµ¡À³¥Ñ§â½s¿è®Øªº¤º®e³]©wµ¹¶µ¥Ø¦WºÙ¡C¤èªk¦³´X­Ó¡A¨ä¤¤¤@¬O¥Ñ½s¿è®ØÀò±o¨ä¤º®e¡A¦s©ó¬Y¦ì§}¤º¡A¦A§â¸Ó¦ì§}«ü©wµ¹ TVITEM µ²ºcÅ餤ªº pszText Äæ¦ì¡A³Ì«áµo¥X TVM_SETITEM °T®§µ¹¾ðª¬À˵ø¡A³]©w·sªº¶µ¥Ø¦WºÙ¡C«Ý¤÷µøµ¡³]©w¦n¶µ¥Øªº·s¦WºÙ¤§«á¡A¾ðª¬À˵ø¦A±N½s¿è®Ø¾P·´¡C¾ã­Ó¹Lµ{¦p¤U¡J

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
hTreeView       DWORD   ?
hEdit           DWORD   ?
 
        LOCAL   tviex:TVITEMEX          ;tviex µ²ºcÅ鬰 26 ¦æµo¥X TVM_SETITEM °T®§©Ò¥Î
        LOCAL   buffer[40]:BYTE
 
.ELSEIF uMsg==WM_NOTIFY
                push    ebx
                ASSUME  ebx:PTR NM_TREEVIEW
                mov     ebx,lParam
                mov     eax,[ebx].hdr.hwndFrom                          ;EAX¡×µo¥X WM_NOTIFY ªº±±¨î¶µ¥N½X
    .IF eax==hTreeView
        .IF [ebx].hdr.code==TVN_BEGINLABELEDIT                          ;³qª¾½X¬O§_¬° TVN_BEGINLABELEDIT
                ASSUME  ebx:PTR NMTVDISPINFO
                INVOKE  SendMessage,hTreeView,TVM_GETEDITCONTROL,0,0    ;¨ú±o½s¿è®Ø¥N½X
                mov     hEdit,eax
                INVOKE  SendMessage,eax,EM_SETLIMITTEXT,32,0            ;³]©w³Ì¦h¶È¯à¿é¤J 32 ­Ó¦r
        .ELSEIF [ebx].hdr.code==TVN_ENDLABELEDIT                        ;³qª¾½X¬O§_¬° TVN_ENDLABELEDIT
                ASSUME  ebx:PTR NMTVDISPINFO
                INVOKE  GetWindowText,hEdit,ADDR buffer,32              ;¨ú±o½s¿è®Ø¤º®e¡A¦s©ó buffer °Ï°ìÅܼÆùØ
                mov     edx,[ebx].item.hItem                            ;¨ú±o¶µ¥Ø¥N½X
                mov     tviex.hItem,edx                                 ;§â¶µ¥Ø¥N½X¦s¤J tviex µ²ºcÅ餺
                mov     tviex.imask,TVIF_TEXT                           ;³]©wºX¼Ð¡A¶È§ïÅÜ pszText
                lea     ecx,buffer
                mov     tviex.pszText,ecx                               ;§â pszText «ü¦V buffer ¦ì§}
                INVOKE  SendMessage,hTreeView,TVM_SETITEM,0,ADDR tviex  ;³]©w¶µ¥Ø
        .ENDIF
    .ENDIF
                ASSUME  ebx:PTR NOTHING
                pop     ebx

­è¤~´£¹L¡A·í¨Ï¥ÎªÌ¦b¾ðª¬À˵øªº¬Y­Ó³Q¿ï©wªº¶µ¥Ø¤W¡A¦A¥H·Æ¹«¥ªÁä³æÀ»¤@¦¸«á¡A¾ðª¬À˵ø«K·|µo¥X WM_NOTIFY µ¹¤÷µøµ¡¡CWM_NOTIFY ªº wParam ¬O¾ðª¬À˵øªºÃѧO½X¡A¦Ó lParam «h¬O NMTVDISPINFO µ²ºcÅé¦ì§}¡A¦¹®É³o­Óµ²ºcÅ骺 hdr.hwndFrom ¬°¾ðª¬À˵øªº¥N½X¡Ahdr.idFrom ¬°¾ðª¬À˵øªºÃѧO½X¡Ahdr.code ¬° TVN_BEGINLABELEDIT¡C¦Ó NMTVDISPINFO µ²ºcÅ骺 item Äæ¦ì¤¤¡AhItem¡Bstate¡BlParam ¤Î pszText ªº¸ê®Æ·|³Q¨t²Î¶ñ¦n¡A¥i¨Ñ¤÷µøµ¡¨Ï¥Î¡C

·í¨Ï¥ÎªÌµ²§ô´N¦a½s¿è®É¡A¾ðª¬À˵øÁÙ¬Oµo¥X WM_NOTIFY °T®§µ¹¤÷µøµ¡¡A¨ä¤¤ hdr ªºÄæ¦ì¸ò¤W­±¤@¼Ë¡A¥u¦³ hdr.code Åܬ° TVN_ENDLABELEDIT¡C¦Ó item Äæ¦ìªº hItem¡BlParam ¤Î pszText ªº¸ê®Æ·|³Q¶ñ¦n¡A¥i¨Ñ¤÷µøµ¡¨Ï¥Î¡C¤]´N¬O»¡¡A·í¤÷µøµ¡¦¬¨ì TVN_ENDLABELEDIT ³qª¾½X®É¡A¶µ¥Ø¦WºÙ¤w¸g³Q¶ñ¦b pszText ©Ò«ü¦ì§}¤º¡AhItem ¤º¤]¤w¦s¦³¶µ¥Ø¥N½X¡C©Ò¥H³B²z TVN_ENDLABELEDIT ¨ä¹ê¥i¥H²¤Æ¦p¤U¡J

1
2
3
4
5
6
        .ELSEIF [ebx].hdr.code==TVN_ENDLABELEDIT                        ;³qª¾½X¬O§_¬° TVN_ENDLABELEDIT
                ASSUME  ebx:PTR NMTVDISPINFO
                mov     [ebx].item.imask,TVIF_TEXT                      ;§ó§ï imask ºX¼Ð¡A¥H°t¦X TVM_SETITEM ³]©w¶µ¥Ø¦WºÙ
                lea     eax,[ebx].item                                  ;EAX «ü¦V ITEM µ²ºcÅé¦ì§}
                INVOKE  SendMessage,hTreeView,TVM_SETITEM,0,eax         ;³]©w¶µ¥Ø
        .ENDIF

¦pªG¨S¦³µo¥X TVM_SETITEM¡A­«·s³]©w¶µ¥Ø¡A©ÎªÌ¥H¨ä¥L¤èªk§ó§ï¶µ¥Ø¦WºÙ¡A¨º»ò¶µ¥Ø¦WºÙ¤´µM·|¬O­ì¨Óªº¡C¤£¹L¤W­z¤èªk¡AÁö¸g²¤Æ¡A¦ý¤´¶û³Â·Ð¡A½Ð¬Ý©³¤Uªº¡uTVN_BEGINLABELEDIT »P TVN_ENDLABELEDIT ªºªð¦^­È¡v¡C

TVN_BEGINLABELEDIT »P TVN_ENDLABELEDIT ªºªð¦^­È

»¡°_¨Ó¡A¹ï¸Ü®Øªºªð¦^­ÈÆZ½ÆÂøªº¡A¥²¶·­n¦³¥¿½TªºÆ[©À¤~¦æ¡C¹ï¸Ü²°¨ç¦¡¬Oµ{¦¡³]­p®v©Ò¼¶¼gªº¡A¨ä¦a¦ìÃþ¦üµøµ¡¨ç¦¡¡C·í¨Ï¥ÎªÌ¾Þ§@¹ï¸Ü²°¤Wªº±±¨î¤¸¥ó®É¡A°T®§¬O¶Çµ¹¹ï¸Ü²°ºÞ²z¾¹¡A¹ï¸Ü²°ºÞ²z¾¹¦A©I¥s¹ï¸Ü²°¨ç¦¡¡C¦b¹ï¸Ü²°¨ç¦¡¤º¡A¥u»Ý³B²z§Ú­Ì·P¿³½ìªº°T®§§Y¥i¡C³B²z§¹«á¡Aªð¦^ TRUE¡A¥Nªí³B²z¹L¦¹°T®§¡F¦Ó¨ä¾l¥¼³B²z¹Lªº°T®§¡A«hªð¦^ FALSE¡C¦ý¬O¡A³Q³B²z¹Lªº°T®§¡A³B²z«áªº±¡§Î¬O¤°»ò¡A¤]À³¦bªð¦^®É§iª¾¹ï¸Ü²°ºÞ²z¾¹¤~¬O¡C³o®É¥²¶·¥H DWL_MSGRESULT ¬°°Ñ¼Æ¡A©I¥s SetWindowLong API ¤~¥i¥H±N³B²z¹L«áªºªð¦^­È¡A¶Çµ¹¹ï¸Ü²°ºÞ²z¾¹¡CSetWindowLong ­ì«¬¬O¡G

        INVOKE  SetWindowLong,hWnd,nIndex,dwNewLong

¨Æ¹ê¤W¡ASetWindowLong ¥i¥H³]©wµøµ¡ªº³\¦h©Ê½è¡A¨Ò¦p³]©wªð¦^­È¡Bµøµ¡¨ç¦¡¦ì§}µ¥µ¥¡ChWnd ¬°­n³]©wªºµøµ¡¥N½X¡AnIndex ¬O«ü­n³]©w­þ¤@­Ó©Ê½è¡A¥i¥H¬O¤U­±´XºØ¡C¦Ó­n³]©wªº¼Æ­È¡A«h¬O¥H dwNewLong ¶Çµ¹¨t²Î¡C­Y°õ¦æ¦¨¥\¡A«hªð¦^­ì¨Óªº³]©w­È¡F­Y¥¢±Ñ¡A«h¶Ç¦^ 0¡C

­·®æ»¡¡@¡@©ú
GWL_EXSTYLE³]©w·sªº©µ¦ù­·®æ
GWL_STYLE³]©w·sªº­·®æ
GWL_WNDPROC³]©w·sªºµøµ¡¨ç¦¡¦ì§}
GWL_HINSTANCE³]©w·sªº°õ¦æ¹ê¨Ò¥N½X
GWL_ID³]©w·sªºµøµ¡ÃѧO½X
GWL_USERDATA³]©w·sªº¨Ï¥ÎªÌ¸ê®Æ
DWL_DLGPROC³]©w·sªº¹ï¸Ü²°¨ç¦¡¦ì§}
DWL_MSGRESULT³]©w¹ï¸Ü²°¨ç¦¡ªºªð¦^­È
DWL_USER³]©w·sªºÃB¥~¸ê®Æ

¦b¤j³¡¤À±¡§Î¤U¡A¹ï¸Ü²°¨ç¦¡¨Ã¤£Ãö¤ßªð¦^­È¡CµM¦Ó¡A¦pªG­n¸T¤î¨Ï¥ÎªÌ§ó§ï¬Y¨Ç¾ðª¬À˵øªº¶µ¥Ø¦WºÙ®É¡A´N±o³]©w TVN_BEGINLABELEDIT ªð¦^­È¤F¡CTVN_BEGINLABELEDIT ªºªð¦^­È¦³¨âºØ¡ATRUE »P FALSE¡C¦pªGªð¦^ TRUE ªí¥Ü¨ú®ø½s¿è¶µ¥Ø¦WºÙ¡A³o®Éµ{¦¡½X¬°¡G

        INVOKE  SetWindowLong,hDlg,DWL_MSGRESULT,TRUE

¦pªGªð¦^ FALSE¡Aªí¥Ü¤¹³\½s¿è¡C

TVN_ENDLABELEDIT ªð¦^­È¬° TRUE¡A«h±µ¨ü½s¿è®Ø¤ºªº¤å¦r¬°·sªº¶µ¥Ø¦WºÙ¡F­Yªð¦^­È¬° FALSE¡A«h¥á±ó½s¿è®Øªº¤å¦r¡A«ì´_­ì¶µ¥Ø¦WºÙ¡C

´N¦a½s¿è®É¡A³B²z Enter Áä»P Esc Áä

¦b´N¦a½s¿è®É¡A¦pªG·Q¥H«ö Enter Áä¡A·í§@½s¿è§¹¦¨¨Ã§ó§ï¶µ¥Ø¦WºÙ¡F¥H«ö Esc Áä¡A¥Nªí©ñ±ó§ó§ï«ì´_­ì¨Ó¶µ¥Ø¦WºÙ¡AÀ³¸Ó¬O¤@ºØ«Ü¤è«Kªº°µªk¡A§Y¨Ï¬O²{¦b·Æ¹«·í¹Dªº¤µ¤é¡CµM¦Ó¡A½s¿è®Ø³B²z«öÁ䪺¤º©w¤è¦¡¡A¨Ã¤£¯àº¡¨¬³o­Ó­n¨D¡C¦b½s¿è®Øªºµøµ¡¨ç¦¡ùØ¡A¹ï©ó³æ¦æªº½s¿è®Ø¨Ã¤£³B²z Enter Áä¡F¹ï©ó¦h¦æªº½s¿è®Ø ( ¨ã¦³ ES_MULTILINE »P ES_WANTRETURN ­·®æ )¡AEnter Á䪺§@¥Î¦¡´«¦æ¡C³o®É¥i¥H¦³¨âºØ¤è¦¡Åý½s¿è®Ø²Å¦X§Ú­Ìªº­n¨D¡G¤@¬O¦Û¦æ³]­p½s¿è®Ø¡F¤G¬Oµøµ¡¤lÃþ§O¤Æ ( window subclass )¡CÅãµM«eªÌ¬O¤Ó¹L³Â·Ð¤F¡A¤j³¡¤Àªº¤H³£·|±Ä¥Î«áªÌ¡A½Ð°Ñ¦Òªþ¿ý¤C¡C¦¹³B¡A¤p¤ì°¸¥u»Ý±N¾ðª¬À˵ø©Ò«Ø¥ßªº½s¿è®Ø¤lÃþ§O¤Æ¡A¨Ï¨ä¯à³B²z Enter Áä¤Î Esc Áä§Y¥i¡C

¤£¹L¡A¤£¦Pªº¦a¤è¬O¡A¦pªG¾ðª¬À˵ø¬O¦b¹ï¸Ü²°¤º¡A¹ï¸Ü²°ºÞ²z¾¹³B²z Esc ©M Enter Áä¡A¨Ã¤£·|±N¨ä¶Ç»¼¦Ü¾ðª¬À˵ø©Ò«Ø¥ßªº½s¿è®Ø¡A¥H­P©ó¨Ï«öÁäµL®Ä¡C­Y­n¸Ñ¨M³o­Ó°ÝÃD¡AÀ³¸Ó¦b¾ðª¬À˵ø¶Ç°e TVN_BEGINLABELEDIT ³qª¾½X®É¡A¥H TVM_GETEDITCONTROL ¬°°Ñ¼Æ¡A©I¥s SendMessage¡A¨ú±o½s¿è®Ø¥N½X¡A¦A¤lÃþ§O¤Æ½s¿è®Ø¡C¦Ó¦b¤lÃþ§O¤Æ«áªº½s¿è®Øªºµøµ¡¨ç¦¡¤º¡A³B²z WM_GETDLGCODE °T®§¡A¨Ï¨ä¶Ç¦^ DLGC_WANTALLKEYS¡C³o¥i¨Ï¾ðª¬À˵ø¤¤ªº¤lÃþ§O¤Æ¨ç¦¡¯à³B²z Esc ©M Enter Áä¡C

ºî¦X¡uTVN_BEGINLABELEDIT »P TVN_ENDLABELEDIT ªºªð¦^­È¡v»P¡u´N¦a½s¿è®É¡A³B²z Enter Áä»P Esc Áä¡v¨â¤p¸`¡A³Ì«á³B²z´N¦a½s¿èªºµ{¦¡¤ù¬q¡A³Q²¤Æ¦¨¤U­±¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
;---------------------------------------------------------------------------------------------------
;¤lÃþ§O¤Æªº¦Û¦æ¼¶¼gªº½s¿è®Øµøµ¡¨ç¦¡
new_edit_proc   PROC    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg==WM_CHAR
                mov     eax,wParam
        .IF al==VK_RETURN
                INVOKE  SendMessage,hTreeView,TVM_ENDEDITLABELNOW,FALSE,0
        .ELSEIF al==VK_ESCAPE
                INVOKE  SendMessage,hTreeView,TVM_ENDEDITLABELNOW,TRUE,0
        .ELSE
                INVOKE  CallWindowProc,lpOldEditProc,hWnd,uMsg,wParam,lParam
                ret
        .ENDIF
 
.ELSEIF uMsg==WM_GETDLGCODE
                mov     eax,DLGC_WANTALLKEYS
                ret
 
.ELSE
                INVOKE  CallWindowProc,lpOldEditProc,hWnd,uMsg,wParam,lParam
                ret
.ENDIF
                xor     eax,eax
                ret
new_edit_proc   ENDP
;---------------------------------------------------------------------------------------------------
DlgProc         PROC    hDlg:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
¡K¡K
.IF uMsg==WM_NOTIFY
                push    ebx
                ASSUME  ebx:PTR NM_TREEVIEW
                mov     ebx,lParam
                mov     eax,[ebx].hdr.hwndFrom  ;EAX¡×µo¥XWM_NOTIFYªº±±¨î¶µ¥N½X
    .IF eax==hTreeView
      ;³B²zTVN_BEGINLABELEDIT³qª¾½X¡A¸T¤î¨Ï¥ÎªÌ´N¦a½s¿è¡u¹q¸£¤¤ªºµwºÐ¡v¡B¡u¹êÅéºÏºÐ¡v¡B¡uÅÞ¿èºÏºÐ¡v¡A¦ý­ã³\½s¿èÀÉ®×
      ;©Î¤l¥Ø¿ý´N¦a½s¿è¡A¤£¹L¦³­­¨î¡A·sªº¶µ¥Ø¦WºÙªø«×¦b32¦ì¤¸²Õ¥H¤º
      .IF [ebx].hdr.code==TVN_BEGINLABELEDIT
                ASSUME  ebx:PTR NMTVDISPINFO
         .IF ([ebx].item.lParam==504d5e43h)||([ebx].item.lParam==4448474ch)||([ebx].item.lParam==44485946h)
                INVOKE  SetWindowLong,hDlg,DWL_MSGRESULT,TRUE                   ;¸T¤î¨Ï¥ÎªÌ´N¦a½s¿è¡u¹q¸£¤¤ªºµwºÐ¡vµ¥¤TºØ¶µ¥Ø
         .ELSE
                INVOKE  SendMessage,hTreeView,TVM_GETEDITCONTROL,0,0
                mov     hEdit,eax
                INVOKE  SendMessage,eax,EM_SETLIMITTEXT,20h,0                   ;½s¿è®Ø¥u¯à¿é¤J32¦ì¤¸ªø«×
                INVOKE  SetWindowLong,hEdit,GWL_WNDPROC,OFFSET new_edit_proc    ;¤lÃþ§O¤Æ½s¿è®Ø
                mov     lpOldEditProc,eax
         .ENDIF
 
      ;³B²zTVN_ENDLABELEDIT³qª¾½X¡A­Y½s¿è®Ø¤ºµL¦r¤¸¡A«h«ì´_­ì¶µ¥Ø¦WºÙ¡F­Y¦³¦r¤¸¡A«h¥H½s¿è®Ø¤º®e¬°¶µ¥Ø·s¦WºÙ
      .ELSEIF [ebx].hdr.code==TVN_ENDLABELEDIT
                INVOKE  GetWindowTextLength,hEdit       ;EAX¡×½s¿è®Ø¤º¦r¤¸ªø«×
         .IF eax==0
                mov     ecx,FALSE
         .ELSE
                mov     ecx,TRUE
         .ENDIF
                INVOKE  SetWindowLong,hDlg,DWL_MSGRESULT,ecx

©ì¦²¶µ¥Ø ( ¤]¥s©ì©Ô¡Adrag and drop item )

·í¨Ï¥ÎªÌ§â·Æ¹«´å¼Ð²¾¦Ü¬Y­Ó¶µ¥Ø¤W¡A¦A«ö¦í·Æ¹«¥ªÁ䤣©ñ¡A²¾°Ê·Æ¹«¡A³o®É¶}©l©ì¦²¹Lµ{¡C¤@¯ë¦Ó¨¥¡A³o®É·Æ¹«´å¼Ð°£¤F­ì¨Óªº¥Õ¦â½b¸¹ ( ) ¤§¥~¡AÁÙ·|¦h¥X¤@­Ó¹Ï¹³¡AºÙ¬°©ì¦²¹Ï¹³¡C·í·Æ¹«´å¼Ð²¾¨ì¥Øªº¦a«á¡A¨Ï¥ÎªÌ¤~©ñ¶}·Æ¹«¥ªÁä¡A§¹¦¨©ì¦²°Ê§@¡A·Æ¹«´å¼Ð¤]«ì´_¦¨­ì¨Óªº¥Õ¦â½b¸¹¡C©³¤U¬O©ì¦²®É¡Aµ{¦¡À³¦³ªº¨BÆJ¡G

1. ³B²z TVN_BEGINDRAG ³qª¾½X

  1. ·í¶}©l°µ©ì¦²°Ê§@®É¡A¾ðª¬À˵ø·|µo¥X TVN_BEGINDRAG ³qª¾½Xµ¹¤÷µøµ¡¡A¤÷µøµ¡©ó³B²z¦¹³qª¾½X®É¡A¥i¥Hµo¥X TVM_CREATEDRAGIMAGE °T®§µ¹¾ðª¬À˵ø¡AÅý¾ðª¬À˵ø¦Û¦æ«Ø¥ß¤@­Ó image list¡A¨Ã¥B§â¸Ó¶µ¥Øªº¹Ï¤ù¥[¤J¨ì image list ùØ¡A³Ì«á§â¸Ó image list ªº¥N½X¶Ç¦^µ¹¤÷µøµ¡¡A¨ä­ì«¬¬O¡G

            INVOKE  SendMessage,hTreeView,TVM_CREATEDRAGIMAGE,0,hitem

    wParam ¥²¶·¬° 0¡AlParam ¬O³Q©ì¦²ªº¶µ¥Ø¥N½X¡C¦pªG±z¤£¥´ºâ¦b©ì¦²®ÉÅã¥Ü¹Ï¹³¡A·íµM¥i¥H¤£°µ¦¹¨BÆJ¡C¤S©ÎªÌ¦pªG§A¤£·Q¥Î¶µ¥Øªº¹Ï¹³¡A­n·s«Ø¨ä¥L¹Ï¹³¤]¥¼¹Á¤£¥i¡C

  2. ±µµÛ­n°µªº¬O¦b¹Ï¹³¤W«ü©w¤@­ÓÂI¡A°µ¬°·Æ¹«¦b©ì°Ê®É¡A·Æ¹«¼öÂI«ü¦b¹Ï¹³¤Wªº¦ì¸m¡C´å¼Ðªº¼öÂI ( hot spot ) «üªº´N¬O·í·Æ¹«ÂIÀ»®É¡A§@¥Îªº¨º¤@­ÓÂI¡A¤@¯ë¬O«ü´å¼Ð¥ª¤W¨¤ªº¨º¤@ÂI¡C§Ú­Ì¥i¥H©I¥s ImageList_BeginDrag «ü©w¹Ï¹³¤Wªº¼öÂI¦ì¸m¡A¨ä­ì«¬¬O¡G

    ImageList_BeginDrag PROTO   himlTrack:DWORD,iTrack:DWORD,dxHotspot:DWORD,dyHotspot:DWORD

    himlTrack ©M iTrack ¤À§Oªí¥Ü image list ¥N½X¤Î¸Ó image list ªº¯Á¤Þ­È¡A³o¨â¶µ«ü©w¤F¹Ï¹³¡CdxHotspop¡BdyHotspot «ü©w¹Ï¹³ªº­þ¤@ÂI°µ¬°´å¼Ðªº¼öÂI¡A¥¦­Ì¬O¬Û¹ï©ó¹Ï¹³ªº¥ª¤W¨¤¡A¦]¦¹¦pªG¥H¥ª¤W¨¤¬°¼öÂI¡A¨º»ò³o¨â­Ó¼Æ­È§¡³]¬° 0¡C

  3. ±µµÛ¬O©I¥s ImageList_DragEnter¡A³o­Ó API ·|©ó«ü©wªº¦ì¸mÅã¥Ü©ì¦²¹Ï¹³¡A¨Ã³qª¾¨t²Î¶}©l©ì¦²¤F¡C¨ä­ì«¬¬°¡G

    ImageList_DragEnter PROTO   hwndLock:DWORD,x:DWORD,y:DWORD

    hwndLock ¬O¾Ö¦³©ì¦² image list ªºµøµ¡¥N½X¡A¦b¦¹³B§Y¬°¾ðª¬À˵ø¥N½X¡Fx¡By ¤À§O¬O¹Ï¹³ªº x ®y¼Ð»P y ®y¼Ð¡A¦¹®y¼Ðªº­ìÂI¬O¦b¸Óµøµ¡ªº¥ª¤W¨¤¡A¨Ã«D¤u§@°Ïªº¥ª¤W¨¤¡A¦ý¬O¹ï©ó¾ðª¬À˵ø¦Ó¨¥¡A¨Ã¨S¦³¿ï³æ¡B¼ÐÃDÄæ¡A©Ò¥Hµøµ¡ªº¥ª¤W¨¤¤]¬O¤u§@°Ïªº¥ª¤W¨¤¡C¦]¬°¦b¤W¤@¨BÆJ¡A¤w¸g©I¥s ImageList_BeginDrag ¤F¡A©Ò¥H¨t²Î¤]¤w¸gª¾¹D¸Óµøµ¡ªº©ì¦² image list ¬O­þ¤@­Ó¡A¤]ª¾¹D¹Ï¹³¯Á¤Þ¡C

  4. ¨ì¦¹¡AÁÙ¦³¤@­Ó°ÝÃD­n¸Ñ¨M¡C·í§Ú­Ì°µ©ì¦²°Ê§@®É¡A¹Ï¹³·|ÀHµÛ·Æ¹«´å¼Ð²¾°Ê¦Ó²¾°Ê¡A§Ú­Ì¥²¶·¦b¤÷µøµ¡ªºµøµ¡¨ç¦¡¤¤±o¨ì·Æ¹«¦ì¸m¡A¤~¯à°µ¥X³oºØ®ÄªG¨Ó¡A¤@¯ëªº¤èªk¬O³B²z WM_MOUSEMOVE °T®§ ( °Ñ¦Ò²Ä¤­³¹ªº»¡©ú )¡C¦ý¬O§Ú­Ì¬O¥H·Æ¹«¦b¾ðª¬À˵øùة즲¶µ¥Ø¡A¨Ã¤£¬O¦b¤÷µøµ¡©ì¦²¶µ¥Ø¡C¨º»ò¡A¤÷µøµ¡¤S¬O¦p¦ó¤~¯à±oª¾·Æ¹«¦ì¸m©O¡H³o®É­Ô´N¥²¶·©I¥s SetCapture ¤F¡CSetCapture ªº­ì«¬¬O¡G

    SetCapture  PROTO   hWnd:HWND

    hWnd ¬Oµøµ¡¥N½X¡A·í·Æ¹«´å¼Ð²¾¨ì¦¹µøµ¡ªº¤lµøµ¡©Î±±¨î¶µ®É¡A¨t²Î¤´·|§â·Æ¹«°T®§ ( «ü WM_MOUSEMOVE¡BWM_LBUTTONDOWN¡BWM_LBUTTON_UP µ¥µ¥¦³Ãö·Æ¹«¿é¤Jªº°T®§ ) ¶Çµ¹ hWnd¡A¦Ó¤£¬O¤lµøµ¡©Î±±¨î¶µ¡C¦pªG·Æ¹«´å¼Ð²¾¨ì¨ä¥Lµøµ¡ ( ¤£¬O hWnd µøµ¡¡A¤]¤£¬O¨ä¤lµøµ¡©Î±±¨î¶µ¡A¦Ó¬O¨ä¥Lµ{¦¡²£¥Íªºµøµ¡ )¡A¨º»ò·Æ¹«°T®§´N¤£·|µo°e¨ì hWnd ùØ¡A°£«D·Æ¹«¨Æ¥ý¦b hWnd µøµ¡ùؤw«ö¤U·Æ¹«¥ªÁä©Î¥kÁä¡A¥B¨S¦³ÃP¶}¡A¦A²¾¨ì¨ä¥Lµøµ¡¤W¡C

2. ³B²z WM_MOUSEMOVE °T®§

  1. ¨ì¦¹¤@¨BÆJ®É¡A¤w¸g¦³©ì¦²¹Ï¹³¡A¤]¥i¥HÂÇ¥Ñ SetCapture ¯à°÷¦b¤÷µøµ¡ªºµøµ¡¨ç¦¡¤¤ºÊµø WM_MOUSEMOVE °T®§¡A§Y¨Ï·Æ¹«¦b±±¨î¶µùز¾°Ê¡C³B²z WM_MOUSEMOVE °T®§ªº­º­n¤u§@¡A¤j·§¬O§â©ì¦²¹Ï¹³ÀHµÛ·Æ¹«´å¼Ð²¾°Ê¦Ó²¾°Ê¡C³o­Ó¤u§@¥i¥H©I¥s ImageList_DragMove §¹¦¨¡AImageList_DragMove ªº§@¥Î´N¬O²¾°Ê©ì¦²ªº¹Ï¹³¨ä­ì«¬¬O¡G

    ImageList_DragMove  PROTO   x:DWORD,y:DWORD

    ¨ä¤¤ x¡By ¤À§O¥Nªí¬Û¹ï©ó¾ðª¬À˵ø¤lµøµ¡¥ª¤W¨¤ªº x ®y¼Ð»P y ®y¼Ð¡C¹ï¾ðª¬À˵ø¦Ó¨¥¡A¦]¨S¦³¿ï³æ¡B¼ÐÃDÄæ¡A©Ò¥Hµøµ¡¥ª¤W¨¤¤]´N¬O¤u§@°Ï¥ª¤W¨¤¡C¦ý¬O¥Ñ WM_MOUSEMOVE ©ÒÄâ±aªº°Ñ¼Æ lParam ©Ò±o¨ìªº®y¼Ð¬O¬Û¹ï©ó¹ï¸Ü²°¤u§@°Ï¥ª¤W¨¤¡A¦]¦¹ÁÙ±o°µ¤@¨ÇÂà´«¡AÂà´«¤è¦¡´N¬O¦©°£¹ï¸Ü²°¤u§@°Ï¥ª¤W¨¤¨ì¾ðª¬À˵ø¥ª¤W¨¤¤§ x¡By ®y¼Ð¤§®t¶Z¡C¥i¥H©I¥s GetWindowRect ±o¨ì¹ï¸Ü²°»P¾ðª¬À˵ø¨âµøµ¡ªº¦ì¸m¡A¦¹¦ì¸m¬O¥H¿Ã¹õ¥ª¤W¨¤¬°­ìÂI¡C

  2. ¨Ï¥ÎªÌ¤@¯ëªº²ßºD¬O·í©ì¦²¹Ï¹³¸g¹L¬Y­Ó¶µ¥Ø¤WªÅ®É¡A¸Ó¶µ¥ØÀ³¸Ó¥H°ª«G«×Åã¥Ü¡C¬°¹F¦¹®ÄªG¡Aµ{¦¡¥ýµo¥X TVM_HITTEST °T®§µ¹¾ðª¬À˵ø¡A½T©w¬O§_¸g¹L¬Y­Ó¶µ¥Øªº¤WªÅ¡F¦Aµo¥X TVM_SELECTITEM °T®§¡A¨Ï¸Ó¶µ¥ØÅܦ¨°ª«G«×Åã¥Ü¡C¥ý»¡ TVM_HITTEST °T®§¡Aµo¥X TVM_HITTEST ¹Lµ{¦p¤U¡G

    INVOKE  SendMessage,hTreeView,TVM_HITTEST,0,ADDR tvhti

    TVM_HITTEST ªº wParam ¥²¶·¬°¹s¡AlParam «ü¦V¤@­ÓºÙ¬° TVHITTESTINFO ªºµ²ºcÅé¡A¨äÄæ¦ì¬O¡G

    TVHITTESTINFO   STRUCT
    pt              POINT   <>
    flags           DWORD   ?
    hItem           DWORD   ?
    TVHITTESTINFO   ENDS

    ©I¥s SendMessage «e¥²¶·¥ý§â pt ¶ñ¤J¬Y­ÓÂIªº®y¼Ð¡A¥H´ú¸Õ³o­ÓÂI¬O§_¥]§t¦b¬Y­Ó¶µ¥Ø¤º¡A³o­Ó®y¼Ð¬O¥H¾ðª¬À˵øªº¤u§@°Ï¥ª¤W¨¤¬°­ìÂI¡C¦pªG¾ðª¬À˵ø¨ã¦³±²¶b¡A¦Ó¥B¤w±²°Ê¨ì¬Y­Ó¦ì¸m¡A¨Ò¦p¦V¥k±²°Ê®É¡Aµe­±·|¦V¥ª²¾¡A¥i¯à·|¬Ý¤£¨£­ì¨Óªº­ìÂI¡A¦ý¬O¦¹ÂIªº®y¼Ð¬O¥H¥i¬Ý¨£ªº°Ï°ì¥ª¤W¨¤¬°­ìÂI¡A¦Ó¤£¬O¥H­ì¨Óªº­ìÂI¬°­ìÂI¡C¦pªG³o­ÓÂI¥]§t¦b¬Y­Ó¶µ¥Ø¤º¡Aµ{¦¡¥Ñ SendMessage ªð¦^®É¡A¨t²Î·|¦b TVHITTESTINFO ¤ºªº hItem ¶ñ¤W¸Ó¶µ¥Øªº¥N½X¡A§_«h¶ñ¤W NULL¡Aªð¦^­È»P hItem ¬Û¦P¡CTVHITTESTINFO ªº flags Äæ¦ì¥i¥H¬O¥H¤U¤@­Ó©Î¼Æ­Ó¼Æ­È¡G

    ±`¡@¼Æ¼Æ­È·N¡@¸q
    TVHT_ABOVE100H ¸ÓÂI¦b¾ðª¬À˵ø¥i¨£°Ï°ì¥~ªº¤W¤è¡C
    TVHT_BELOW200H ¸ÓÂI¦b¾ðª¬À˵ø¥i¨£°Ï°ì¥~ªº¤U¤è¡C
    TVHT_NOWHERE1H ¸ÓÂI¦b¥i¨£°Ï°ì¤º¡A¦ý¬O¦b³Ì«á¤@­Ó¶µ¥Øªº¤U¤è¡C
    TVHT_ONITEM46H ¸ÓÂI¦b¬Y­Ó¶µ¥Øªº¹Ï¹³©Î¦WºÙ¤W¡C
    TVHT_ONITEMBUTTON10H ¸ÓÂI¦b¬Y­Ó¶µ¥Øªº«ö¶s¤W¡C
    TVHT_ONITEMICON2H ¸ÓÂI¦b¬Y­Ó¶µ¥Øªº¹Ï¥Ü¤W¡C
    TVHT_ONITEMINDENT8H ¸ÓÂI¦b¬Y­Ó¶µ¥ØªºÁY±Æ¦ì¸m¤W¡C
    TVHT_ONITEMLABEL4H ¸ÓÂI¦b¬Y­Ó¶µ¥Øªº¦WºÙ¤W¡C
    TVHT_ONITEMRIGHT20H ¸ÓÂI¦b¥i¨£°Ï°ì¤º¡A¬Y­Ó¶µ¥Øªº¥k¤è¡C
    TVHT_ONITEMSTATEICON40H ¸ÓÂI¦b¬Y­Ó¶µ¥Øªº state icon ¤W¡C
    TVHT_TOLEFT800H ¸ÓÂI¦b¾ðª¬À˵ø¥i¨£°Ï°ì¥~ªº¥ª¤è¡C¥u¦³¸ÓÂIªº X ®y¼Ð¬°­t­È¡A¤~·|³o¼Ë¡C
    TVHT_TORIGHT400H ¸ÓÂI¦b¾ðª¬À˵ø¥i¨£°Ï°ì¥~ªº¥k¤è¡C

  3. ¦bµo°e°T®§ TVM_SELECTITEM «e¡A¥²¶·¥ýÁôÂé즲¹Ï¹³¡A§_«h·|¯d¤UÃø¬Ýªº²ª¸ñ¡C­nÁôÂé즲¹Ï¹³¥i¥H©I¥s ImageList_DragShowNolock¡A¦bÅã¥Ü§¹°ª«G«×ªº¶µ¥Ø¤§«á¡A¦A©I¥s¤@¦¸¸Ó API¡A¥H¨Ï±o©ì¦²¹Ï¹³¥¿±`Åã¥Ü¡CImageList_DragShowNolock ­ì«¬¬°

    ImageList_DragShowNolock    PROTO   fShow:BOOL

    ­Y fShow ¬° TRUE¡Aªí¥ÜÅã¥Ü¹Ï¹³¡FFALSE ªí¥ÜÁôÂùϹ³¡Cªð¦^­È¬°¹s¡Aªí¥Ü©I¥s¥¢±Ñ¡F«D¹sªí¥Ü©I¥s¦¨¥\¡C

  4. ­n¨Ï¶µ¥ØÅܬ°°ª«G«×Åã¥Ü¡Aµ{¦¡­nµo¥X TVM_SELECTITEM µ¹¾ðª¬À˵ø¡A¦³Ãö TVM_SELECTITEM °T®§µo°e¤è¦¡¬°¡G

    INVOKE  SendMessage,hTreeView,TVM_SELECTITEM,flag,hitem

    hitem ¬O­n¿ï¾Üªº¶µ¥Ø¥N½X¡Aflag ¥i¥H¬O¥H¤U¼Æ­È¡C¦pªG³Q¿ï¾Üªº¶µ¥Ø¬O¬Y­Ó¤l¶µ¥Ø¡A¦Ó¨ä¤÷¶µ¥Ø³B©ó¦¬Ãlª¬ºA¡A¨º»ò¦¹°T®§·|¨Ï±o¤÷¶µ¥Ø®i¶}¡A¦P®É¨Ï³Q¿ï¾Üªº¤l¶µ¥ØÅã²{¡A¦b³oºØ±¡§Î¤U¡A¾ðª¬À˵øÁÙ·|µo¥X TVN_ITEMEXPANDING »P TVN_ITEMEXPANDED ¨â³qª¾½Xµ¹¤÷µøµ¡¡C¦pªG¦¨¥\ªº¿ï©w¶µ¥Ø¡Aªð¦^ TRUE¡F§_«hªð¦^ FALSE¡C

    flag¼Æ­È·N¡@¸q
    TVGN_CARET9H ¿ï©w hitem ¶µ¥Ø¡A¨Ãµo¥X TVN_SELCHANGING »P TVN_SELCHANGED ³qª¾½Xµ¹¤÷µøµ¡¡C
    TVGN_DROPHILITE8H ¥Ñ©ó©ì¦²¥Ø¼Ð¦Ó­«Ã¸ hitem¡C
    TVGN_FIRSTVISIBLE5H ¨Ï hitem ³Q¿ï©w¡A¨Ã¥B¾¨¶q¨Ï¨ä««ª½±²°Ê¡AÅܦ¨¥i¨£°Ï°ìªº²Ä¤@­Ó¶µ¥Ø¡C¦ý¬O¦pªG¶µ¥Ø¤Ó¤Ö¡A¥B hitem ¦b«Ü«á­±¡A´NµLªk¹F¦¨¡A¦]¦¹»¡¡u¾¨¶q¡v¡C
    TVSI_NOSINGLEEXPAND8000H ³Q¿ï©wªº¤l¶µ¥Ø¤£®i¶}¡A¥²¶··f°t TVGN_CARET ¨Ï¥Î¡C

3. ³B²z WM_LBUTTONUP °T®§

·í¨Ï¥ÎªÌ©ñ¶}·Æ¹«¥ªÁä®É¡Aªí¥Üµ²§ô©ì¦²°Ê§@¡A¨t²Î·|µo¥X WM_LBUTTONUP °T®§¡A§Ú­Ì¥²¶·©ó¦¹°T®§¤¤³B²z©³¤Uªº¨Æ±¡¡A¤~¤£·|³y¦¨¿ù»~¡C«Ý³o¨Ç¥²­nªº¨Æ³B²z§¹«á¡A¦A¨Ì§Ú­Ìªº»Ý¨D¡A§¹¦¨­n¨D¡C

  1. ²Ä¤@¥ó¨Æ¬O¦pªG¦b WM_MOUSEMOVE ¤¤¡A´¿¨Ï¬Y­Ó¶µ¥ØÅܦ¨³Q¿ï¨ú¹L¡A¥²¶·µo°e TVM_SELECTITEM °T®§¡A¨Ã³]¬° TVGN_DROPHILITE¡A¦ý³o®É­Ôªº lParam ¶·³]¬°¹s¡C¦pªG¤£³o»ò°µ¡A¨º»ò·|µo¥Í©_²§²{¶H¡C
  2. ©I¥s ImageList_EndDrag ©M ImageList_DragLeave¡A§i¶D¨t²Îµ²§ô©ì¦²°Ê§@¡A¨Ã©I¥s ImageList_Destroy ¾P·´«Ø¥ßªº©ì¦²¹Ï¹³¦Cªí¡C¥t¥~¤]­n©I¥s ReleaseCapture ÄÀ©ñ®·Àòªº·Æ¹«´å¼Ð¡C
  3. «Ý¤W­±ªº¨î¦¡¤u§@§¹¦¨¡A´N¥i¥H°µµ{¦¡­n°µªº¨Æ¤F¡A¨Ò¦p§â©ì¦²ªº¶µ¥Ø©ñ¦b¥Ø¼Ð¶µ¥Ø¤§¤U¡C

¾ðª¬À˵øªº°T®§ ( Message )

¾ðª¬À˵øªº°T®§¡A§¡¥H TVM_ ¬°¶}ÀY¡A«Ü©úÅã¬O tree view message ªºÁY¼g¡Cµ{¦¡¥i¥H¹ï¾ðª¬À˵øµo¥X°T®§¡A­n¨D¾ðª¬À˵ø°µ¤@¨Ç¨Æ±¡¡C©³¤U¨Ó¬Ý¬Ý¾ðª¬À˵øªº°T®§¡G

°T®§wParamlParam ·N¡@¡@¡@¸qªð¦^­È
TVM_CREATEDRAGIMAGE0 hitem ¨Ï¾ðª¬À˵ø¦Û¦æ«Ø¥ß¤@­Ó image list¡A¨Ã¥B§â hitem ¶µ¥Øªº¹Ï¤ù¥[¤J¨ì image list ùØ¡C¦pªG¾ðª¬À˵ø¨S¦³¬ÛÃöªº image list¡A«hµLªk¨Ï¥Î¥»°T®§¡A¥²¶·¦Û¦æ«Ø¥ß image list¡C¤£¦A¨Ï¥Î©ì¦²¹Ï¹³®É¡Aµ{¦¡±o¦Û¦æ¾P·´¨ä image list¡C ¦¨¥\®Éªð¦^ image list ªº¥N½X¡F§_«hªð¦^ NULL
TVM_DELETEITEM0 hitem §R°£ hitem ¶µ¥Ø¤Î¨ä¥H¤Uªº©Ò¦³¤l¶µ¥Ø¡A¦pªG hitem ¬° TVI_ROOT ©Î NULL ´N·|§R°£©Ò¦³¶µ¥Ø¡C·í¶µ¥Ø³Q§R°£®É¡A¤÷µøµ¡·|¦¬¨ì TVN_DELETEITEM¡C ¦¨¥\®Éªð¦^ TRUE¡F§_«hªð¦^ FALSE
TVM_EDITLABEL0 hitem ´N¦a½s¿è ( in-place editing ) hitem ¶µ¥Øªº¦WºÙ¡C¦¹°T®§·|¨Ï¾ðª¬À˵ø¦b hitem ©Ò¦b¦ì¸m¡A«Ø¥ß³æ¦æ½s¿è®Ø¡A¥H§ó§ï¶µ¥Ø¦WºÙ¡A¨Ãµo¥X TVN_BEGINLABELEDIT µ¹¤÷µøµ¡¡Cµo°e¦¹°T®§«e¡A¾ðª¬À˵øÀ³¸Ó­n¦³¿é¤JµJÂI¡C ¦¨¥\®Éªð¦^³æ¦æ½s¿è®Ø¥N½X¡F§_«hªð¦^ NULL
TVM_ENDEDITLABELNOWfCancel 0 µ²§ô´N¦a½s¿è¡CfCancel ¬° TRUE ®É¡Aªí¥Üµ²§ô´N¦a½s¿è¤£Àx¦s¡FFALSE ªí¥Ü­nÀx¦s¡C¦¹°T®§·|¨Ï¾ðª¬À˵øµo¥X TVN_ENDLABELEDIT µ¹¤÷µøµ¡¡C ¦¨¥\®Éªð¦^ TRUE¡F§_«hªð¦^ FALSE
TVM_ENSUREVISIBLE0 hitem ½T©w hitem ¯à¦b¾ðª¬À˵ø¤¤¬Ý¨£¡A¦pªG¥²­n¡A·|®i¶} hitem ªº¤÷¶µ¥Ø¥B±²°Ê¡C¦pªG¦³®i¶}ªº°Ê§@¡A´N·|µo¥X TVN_ITEMEXPANDING¡BTVN_ITEMEXPANDED µ¹¤÷µøµ¡¡C ¦pªG¥u¦³±²°Ê¥BµL¶µ¥Ø³Q®i¶}¡Aªð¦^«D¹s­È¡F§_«hªð¦^ 0
TVM_EXPANDflag hitem ¨Ì¾Ú flag ¤§­È¡A¨M©w hitem ®i¶}©Î¦¬Ãl¤l¶µ¥Ø¡Aflag ¥i¥H¬O
  1. TVE_COLLAPSE¡G¦¬Ãl¤l¶µ¥Ø
  2. TVE_COLLAPSERESET¡G¦¬Ãl¨Ã§R°£¨ä¤l¶µ¥Ø¡A¶·»P TVE_COLLAPSE ¦X¥Î¡A¦P®É TVIS_EXPANDEDONCE ·|³Q³]¸m¡C
  3. TVE_EXPAND¡G®i¶}¡C
  4. TVE_EXPANDPARTIAL¡G³¡¥÷®i¶}¡C¥u¦³ 4.70 ª©¤§«áªº COMCTL32.DLL ¥i¨Ï¥Î¡A¶·»P TVE_EXPAND ¦X¥Î¡C
  5. TVE_TOGGLE¡G­Y¶µ¥Ø¤w®i¶}¡A«h¦¬Ãl¡F­Y¶µ¥Ø¤w¦¬Ãl¡A«h®i¶}¡C
®i¶}¤w®i¶}ªº¶µ¥Ø¡A³Q»{¬°¬O¦¨¥\ªº¡A·|ªð¦^«D¹s­È¡F¦ý¦¬Ãl¤w¦¬Ãlªº¶µ¥Ø¡A«o·|ªð¦^ 0¡C
·í¶µ¥Ø³Q®i¶}¡A¾ðª¬À˵ø·|µo¥X TVN_ITEMEXPANDING ©M TVN_ITEMEXPANDED ³qª¾½Xµ¹¤÷µøµ¡¡A¨Ã³]©w TVIS_EXPANDEDONCE ª¬ºA¡C
¦¨¥\®Éªð¦^«D¹s¡F§_«hªð¦^ 0
TVM_GETBKCOLOR0 0 ¨ú±o¾ðª¬À˵øªº©³¦â¡A¤@¯ëªð¦^ COLORREF ­È¡A­Yªð¦^ -1¡Aªí¥Ü¨Ï¥Î¨t²Î¹w©wªº©³¦â¡C °Ñ¦Ò¥ªÄæ
TVM_GETCOUNT0 0 ªð¦^¶µ¥ØÁ`¼Æ¡C °Ñ¦Ò¥ªÄæ
TVM_GETEDITCONTROL0 0 ¨ú±o´N¦a½s¿è®Éªº½s¿è®Ø¥N½X¡C°Ñ¦Ò´N¦a½s¿èªº»¡©ú¡C ¦¨¥\®Éªð¦^½s¿è®Ø¥N½X¡F§_«hªð¦^ 0
TVM_GETEXTENDEDSTYLE0 0 ¨ú±o¾ðª¬À˵øªº©µ¦ù­·®æ¡A°Ñ¦Ò©µ¦ù­·®æ¡C ªð¦^©µ¦ù­·®æ
TVM_GETIMAGELISTiImage 0 ¨ú±o¾ðª¬À˵øªº image list ©Î state image list¡CiImage ¥i¥H¬O TVSIL_NORMAL¡Aªí¥Ü¨ú±o image list¡F¤]¥i¥H¬O TVSIL_STATE¡Aªí¥Ü¨ú±o state image list¡C ªð¦^ image list ¥N½X
TVM_GETINDENT0 0 ¨ú±o¤l¶µ¥Ø¥ªÃäÁY±Æ¦h¤ÖÂI¡C °Ñ¦Ò¥ªÄæ
TVM_GETINSERTMARKCOLOR0 0 ¨ú±o´¡¤J°O¸¹ªºÃC¦â¡Cªð¦^®É¡AEAX ªº¬°­ì¦³ªº´¡¤J°O¸¹ÃC¦â¡C °Ñ¦Ò³oùØ¡C
TVM_GETISEARCHSTRING
TVM_GETITEM0 pitem ¨ú±o¬Y­Ó¶µ¥Øªº¸ê®Æ¡C©I¥s SendMessage «á¡A¸Ó¶µ¥Ø¸ê®Æ·|¦s¦b pitem ©Ò«ü¦ì§}¡A¦¹¦ì§}¨ä¹ê¬O¤@­ÓºÙ¬° TV_ITEM ªºµ²ºcÅé¡C¦b©I¥s SendMessage «e¡A¥²¶·§â­n¨ú±o¸ê®Æªº¶µ¥Ø¥N½X¦s©ó TV_ITEM ªº hItem Äæ¦ì¡A­n¨ú±o­þ¨Ç¸ê®Æ­n¦s©ó imask Äæ¦ì¡C¦³Ãö§ó¸Ô²Óªº¥Îªk¡A½Ð°Ñ¦Ò¨ú±o¶µ¥Øªº¸ê®Æ¡C ¦¨¥\®Éªð¦^ TRUE¡F§_«hªð¦^ FALSE
TVM_GETITEMHEIGHT0 0 ¨ú±o¶µ¥Øªº°ª«×¡A¥HÂI¬°³æ¦ì¡C¦b¾ðª¬À˵ø¤¤¡A¨C­Ó¶µ¥Ø¤@¼Ë°ª¡C ªð¦^­È¬°¶µ¥Øªº°ª«×
TVM_GETITEMRECTfItemRect prc ¨ú±o³ò¦í¶µ¥Øªº¯x§Î¤j¤p¡A¥HÀ˵ø¬O§_¯à¬Ý±o¨£¦¹¶µ¥Ø¡C­Y fItemRect ¬° TRUE¡Aªí¥Ü¶È¨ú±o³ò¦í¶µ¥Ø¦WºÙªº¯x§Î¡F­Y¬° FALSE¡A«h¨ú±o³ò¦í¶µ¥Ø¾ã¦Cªº¯x§Î¡C¦Ó¯x§Îªº¦ì§}¬O¥H prc «ü©w¡A¨ä®y¼Ð¥H¾ðª¬À˵ø¥ª¤W¨¤¬°­ìÂI¡C¦b©I¥s«e prc ©Ò«ü RECT µ²ºcÅ骺 left Äæ¦ì¬°­n¨úªº³ò¦í¯x§Îªº¶µ¥Ø¡C ¦pªG¶µ¥Ø¥i¨£¥B¦¨¥\¨ú±o³ò¦íªº¯x§Î¡Aªð¦^ TRUE¡F§_«hªð¦^ FALSE¡C
TVM_GETITEMSTATEhItem stateMask ¨ú±o hItem ¶µ¥Øªº¬Y¨Çª¬ºA¡A­n¨ú±oªºª¬ºA¥H stateMask ªí¥Ü¡AstateMask ªº·N¸q»P TVITEMEX ªº stateMask Äæ¦ì¬Û¦P¡C ¥u¦³³Q stateMask «ü©w¥B³]©wªºª¬ºA¦ì¤¸¬° 1
TVM_GETLINECOLOR0 0 ¨ú±o¶µ¥Ø»P¤l¶µ¥Ø½u¬qªºÃC¦â¡C­n¨ú±o©Î«ö¶sÃC¦â¡A­n¥Î TVM_GETTEXTCOLOR °T®§¡C ªð¦^½u¬qÃC¦â¡A¦pªG¨S¦³«ü©w¡Aªð¦^ CLR_DEFAULT
TVM_GETNEXTITEMflag hitem ¨ú±o flag ©Ò«ü©wªº¶µ¥Ø¥N½X¡A½Ð°Ñ¦Ò¨ú±o¶µ¥Øªº¸ê®Æ¡C ½Ð°Ñ¦Ò¨ú±o¶µ¥Øªº¸ê®Æ¡C
TVM_GETSCROLLTIME0 0 ¨ú±o³Ì¤j±²°Ê®É¶¡ ( maximum scroll time )¡C³Ì¤j±²°Ê®É¶¡¬O«ü§¹¦¨±²°Ê©Òªáªº³Ìªø®É¶¡¡A¥H²@¬í¬°³æ¦ì¡C ªð¦^­È¬°³Ì¤j±²°Ê®É¶¡¡C
TVM_GETTEXTCOLOR0 0 ­Y¦¨¥\¡A¨ú±o¶µ¥Ø¦WºÙªºÃC¦â¡A¥H COLORREF §Î¦¡¦s©ó EAX¡F­Y¥¢±Ñ¡Aªð¦^ ¡Ð1¡C °Ñ¦Ò¥ªÄæ¡C
TVM_GETTOOLTIPS0 0 ªð¦^®É¡AEAX ¬°¾ðª¬À˵øªº¤lµøµ¡¡A¤u¨ã´£¥Ü ( tool tip ) ªº¥N½X¡F­Y EAX ¬° NULL¡Aªí¥Ü¦¹¾ðª¬À˵ø¨S¦³¤u¨ã´£¥Ü¡C«Ø¥ß¾ðª¬À˵ø®É¡A¨t²Î·|¦Û°Ê¬°¨ä«Ø¥ß¤@­Ó¤u¨ã´£¥Üªº¤lµøµ¡¡A°£«D¾ðª¬À˵ø¨ã¦³ TVS_NOTOOLTIPS ­·®æ¡A¤~¤£«Ø¥ß¤u¨ã´£¥Ü¡C °Ñ¦Ò¥ªÄæ¡C
TVM_GETUNICODEFORMAT0 0 ªð¦^«D¹s­È¡Aªí¥Ü¾ðª¬À˵ø¨Ï¥Î¸U°ê½X¦r¤¸¡Fªð¦^ 0 ­È¡Aªí¥Ü¨Ï¥Î ANSI ¦r¤¸¡C °Ñ¦Ò¥ªÄæ¡C
TVM_GETVISIBLECOUNT0 0 ¨ú±o¯à¦b¾ðª¬À˵ø¤¤¨£¨ì§¹¾ãªº¶µ¥Ø­Ó¼Æ¡A³o­Ó¼Æ¥Ø¥i¯à¤ñ¼Æª¬À˵øªº¶µ¥Ø¼ÆÁÙ¦h¡A¦]¬°¨t²Î¬O¥H¾ðª¬À˵øªº°ª«×°£¥H¶µ¥Ø°ª«×©Ò±oªº°Ó¡A¤wµL±ø¥ó±Ë¥hÅܾã¼Æ¡C °Ñ¦Ò¥ªÄæ¡C
TVM_HITTEST0 lpht Àˬd¬Y­ÓÂI ( ¨ä®y¼Ð¥H¾ðª¬À˵ø¥ª¤W¨¤¬°­ìÂI ) ¬O§_¦b¬Y­Ó¶µ¥Ø¤WªÅ¡C­Y¦b¬Y­Ó¶µ¥Ø¤W¡Aªð¦^®É¡AEAX ¬°¶µ¥Ø¥N½X¡F§_«h¬° NULL¡C°Ñ¦Ò«e­±¡C °Ñ¦Ò¥ªÄæ¡C
TVM_INSERTITEM0 lpis ©ó¾ðª¬À˵ø¤¤·s²K¥[¤@­Ó¶µ¥Ø¡Alpis ¬°«ü¦V TVINSERTSTRUCT µ²ºcÅé¦ì§}ªº«ü¼Ð¡A¸Ô²Ó¸ê®Æ½Ð°Ñ¦Ò¼W²K¶µ¥Ø¡C ¦¨¥\®Éªð¦^¶µ¥Ø¥N½X¡F§_«h¬° NILL¡C
TVM_MAPACCIDTOHTREEITEMid 0 ¨C·í·s¼W¶µ¥Ø®É¡A¨t²Î·|¬°¦¹¶µ¥Ø«ü©w¤@­Ó¥N½X¤ÎÃѧO½X ( accessibility ID )¡A¦¹°T®§¥i¥Ñ¶µ¥ØªºÃѧO½X¨ú±o¶µ¥Ø¥N½X¡C¥u¯à¦b XP ¤Î¨ä¥H¤Wªº¨t²Î¨Ï¥Î¡C ªð¦^¶µ¥Ø¥N½X¡C
TVM_MAPHTREEITEMTOACCIDhtreeitem 0 ¥Ñ¶µ¥Ø¥N½XÀò±oÃѧO½X¡C¥u¯à¦b XP ¤Î¨ä¥H¤Wªº¨t²Î¨Ï¥Î¡C ªð¦^¶µ¥ØÃѧO½X¡C
TVM_SELECTITEMflag hitem ¿ï©w hitem ©Ò«ü©wªº¶µ¥Ø¡A§â¥¦²¾¨ì¥i¨£°Ï°ì¤º¡A©Î¬O¦]©ì¦²°Ê§@¦Ó­«Ã¸¡C½Ð°Ñ¦Ò«e­±ªº»¡©ú¡C ¦¨¥\®Éªð¦^ TRUE¡F§_«hªð¦^ FALSE¡C
TVM_SETAUTOSCROLLINFOuPixPerSec uUpdateTime ³]©w¦Û°Ê±²°Êªº©Ê½è¡AuPixPerSec ¬°¨C¬í±²°ÊÂI¼Æ¡A¥u¯à¦b Vista ¤Î¨ä¥H¤Wªº¨t²Î¨Ã¥B¨ã¦³ TVS_EX_AUTOHSCROLL ©µ¦ù­·®æªº¾ðª¬À˵ø¤¤¨Ï¥Î¡C ªð¦^ TRUE¡C
TVM_SETBKCOLOR0 clrBk ³]©w¾ðª¬À˵øªº­I´ºÃC¦â¬° clrBk¡AclrBk ªº¸ê®Æ§ÎºA¬O COLORREF¡A­Y clrBk ¬° ¡Ð1¡Aªí¥Ü¨Ï¥Î¨t²Î¤º©w­È¡C ªð¦^­È¬°¥ý«eªº­I´ºÃC¦â¡C
TVM_SETEXTENDEDSTYLEhwnd messageID ³]©w¾ðª¬À˵øªº©µ¦ù­·®æ¡Ahwnd ¬O¾ðª¬À˵ø¥N½X¡AmessageID ¬O­n³]©wªº©µ¦ù­·®æ¡A°Ñ¦Ò¤W­±ªº»¡©ú¡C ³]©w¦¨¥\ªð¦^ S_OK¡F¨ä¥L­Èªí¥Ü¥¢±Ñ¡C
TVM_SETIMAGELISTiImage himl °Ñ¦Ò¦b¶µ¥Ø«e¥[¤J¹Ï¤ù ªð¦^­ì¥ýªº image list ¥N½X¡C
TVM_SETINDENTindent 0 ³]©w¤l¶µ¥Ø¬Û¶Z¤÷¶µ¥ØªºÁY±ÆªºÂI¼Æ¡A­Y¦¹ÂI¼Æ¤p©ó¨t²Î¹w©w³Ì¤pÁY±ÆÂI¼Æ¡A«h¥H¨t²Î¹w©w³Ì¤pÁY±ÆÂI¼Æ¬°·Ç¡C¤@¯ë¦Ó¨¥¡A¨t²Î¹w©w³Ì¤pÁY±ÆÂI¼Æ¬° 5 ÂI¡A¦ý¤]¥i¯à¤£¬O¡C­n¨ú±o½T¤Áªº³Ì¤pÁY±ÆÂI¼Æ¡A¥i¥H¥ýµo¥X¨Ï undent ³]¦¨ 0¡Aµo¥X TVM_SETINDENT ¤§«á¡A¦Aµo¥X TVM_GETINDENT °T®§¡Aªð¦^­È§Y¬°³Ì¤pÁY±ÆÂI¼Æ¡C µL¡C
TVM_SETINSERTMARKfAfter htiInsert ¦pªG·Q§â¬Y­Ó¶µ¥Ø©ì¦²¨ì¾ðª¬À˵øªº³Ì¤U­±¶µ¥Ø¤§¤U¡A³o®É­Ô¦pªG¯à¦b³Ì«á¤@­Ó¶µ¥Ø¤§¤U¥X²{¤@­Ó°O¸¹ªí©ú¶µ¥Ø±N¦w´¡¦b³oùØ¡A¬O¤Íµ½¬É­±ªº°µªk¡A³o¤]´N¬O´¡¤J°O¸¹ ( insert mark ) ¥¥¨|¦Ó¥Íªº­ì¦]¡CTVM_SETINSERTMARK ¥u¯àÅã²{¥X´¡¤J°O¸¹¨Ã¤£·|¯u¥¿·s²K¶µ¥Ø¡A­n¯u¥¿²K¥[¶µ¥Ø­nµo¥X TVM_INSERTITEM¡CTVM_SETINSERTMARK °T®§ªº htiInsert °Ñ¼Æ¬O«ü´¡¤J°O¸¹·|Åã¥Ü¦b³o­Ó¶µ¥Ø©Ò¦b¤§³B¡A¦Ó fAfter ¬° TRUE¡Aªí¥Ü´¡¤J°O¸¹¦b³o­Ó¶µ¥Ø¤§«á¡F­Y¬° FALSE¡Aªí¥Ü¤§«á¡C ªð¦^«D¹s¡Aªí¥Ü¦¨¥\¡F§_«h¥¢±Ñ¡C
TVM_SETINSERTMARKCOLOR0 clrInsertMark ³]©w´¡¤J°O¸¹ªºÃC¦â¡A¸ÓÃC¦â¬° clrInsertMark¡Cªð¦^®É¡AEAX ªº¬°­ì¦³ªº´¡¤J°O¸¹ÃC¦â¡C °Ñ¦Ò¥ªÄæ¡C
TVM_SETITEM0 pitem ³]©w¬Y­Ó¶µ¥ØªºÄÝ©Ê¡A¦p¦WºÙ¡B¹Ï¤ùµ¥µ¥¡Cpitem ¬°µ²ºcÅé TVITEM ªº¦ì§}¡A©I¥s«e TVITEM ªº hItem «ü©w­n³]©wªº¶µ¥Ø¥N½X¡Aimask Äæ¦ì«ü©w­n³]©wªºÄæ¦ì¡A¦P®É°t¦X¬Û¹ïÀ³ªºÄæ¦ì¡C ¦¨¥\®Éªð¦^ TRUE¡F¥¢±Ñ®Éªð¦^ FALSE¡C
TVM_SETITEMHEIGHTcyItem 0 ¦b¾ðª¬À˵øùØ¡A¨C­Ó¶µ¥Ø§¡µ¥°ª¡C°£«D¨ã¦³ TVS_NONEVENHEIGHT ­·®æ¡A¨ä°ª«×¤~¯à¬°©_¼ÆÂI¡CTVM_SETITEMHEIGHT ¬O¥Î¨Ó³]©w¨C­Ó¶µ¥Øªº°ª«×¡A·sªº°ª«×¥i¦b cyItem ùØ«ü©w¡A¥HÂI¬°³æ¦ì¡C¦pªG cyItem ¬°©_¼Æ¡A¥B¤£¨ã TVS_NONEVENHEIGHT ­·®æ¡A¨º»ò¨t²Î·|¦Û°Ê¨Ï cyItem ´î¤@¡C­Y cyItem ¬° ¡Ð1¡A«h¨t²Î·|«ì´_¹w³]­È¡C ªð¦^­ì¥ý°ª«×¡A¥HÂI¬°³æ¦ì¡C
TVM_SETLINECOLOR0 clr ³]©w¶µ¥Ø¤§¶¡ªº½u¬qÃC¦â¡A¥H clr ªí¥Ü¡C­Y clr ¬° CLR_DEFAULT¡A«h³]¬°¨t²Î¹w³]ªºÃC¦â¡C­n¨ú±o©Î«ö¶sÃC¦â¡A­n¥Î TVM_SETTEXTCOLOR °T®§¡C ªð¦^­ì¥ýÃC¦â¡C
TVM_SETSCROLLTIMEuScrollTime 0 ³]©w³Ì¤j±²°Ê®É¶¡¡CuScrollTime ¬°³Ì¤j±²°Ê®É¶¡¡A¥H²@¬í¬°³æ¦ì¡Aªð¦^­ì¥ý³Ì¤j±²°Ê®É¶¡¡C °Ñ¦Ò¥ªÄæ¡C
TVM_SETTEXTCOLOR0 clrText ³]©w¤å¦rÃC¦â¡AclrText ¤å¦rÃC¦â¡Aªð¦^­ì¥ý¤å¦rÃC¦â¡C­Y clrText ¬°¡Ð1¡A«h¨t²Î·|«ì´_¹w³]­È¡C °Ñ¦Ò¥ªÄæ¡C
TVM_SETTOOLTIPShwndTooltip 0 ³]©w¾ðª¬À˵øªº¤lµøµ¡¡A¤u¨ã´£¥Ü¡A¨ä¤u¨ã´£¥Ü¥N½X¦s©ó hwndTooltip¡Cªð¦^­È¬°­ì¥ý¤u¨ã¥N½X¡A­Yªð¦^­È¬° NULL¡A«hªí¥Ü­ì¥ýµL¤u¨ã´£¥Ü¡C °Ñ¦Ò¥ªÄæ¡C
TVM_SETUNICODEFORMATfUnicode 0 ­Y fUnicode ¬°«D¹s­È¡A³]©w¾ðª¬À˵ø¨Ï¥Î¸U°ê½X¡F­Y¬°¹s¡A«h¨Ï¥Î ANSI¡Cªð¦^­È¬°­ì¥ý¦r¶°¡C °Ñ¦Ò¥ªÄæ¡C
TVM_SHOWINFOTIP0 hitem Åã¥Ü hitem ¶µ¥Øªº¤u¨ã´£¥Ü¡C«Ü¤Öµ{¦¡¥Î¦¹°T®§¡A¦]¬°¤j³¡¤Àªº±¡§Î¤U¡A¨t²Î·|¦Û°ÊÅã¥Ü¤u¨ã´£¥Ü¡C ªð¦^ 0¡C
TVM_SORTCHILDRENfRecurse hitem ¹ï«ü©wªº hitem ¶µ¥Ø¤§¤Uªº¤l¶µ¥Ø°µ±Æ§Ç¡C­Y fRecurse ¬° TRUE ®É¡A¨t²Î·|¹ï hitem ©Ò¦³¶¥¼hªº¤l¶µ¥Ø°µ±Æ§Ç¡F­Y fRecurse ¬° FALSE ®É¡A¶È¹ï¤U¤@¶¥¼hªº¤l¶µ¥Ø±Æ§Ç¡C ¦¨¥\®Éªð¦^ TRUE¡F¥¢±Ñ®Éªð¦^ FALSE¡C
TVM_SORTCHILDRENCB0 psort ¥Hµ{¦¡³]­p®v©Ò©w¸qªº call back ¨ç¦¡±Æ§Ç¡A¦¹¨ç¦¡ºÙ¤ñ¸û¨ç¦¡¡A¨ä¦ì§}¦s©ó TVSORTCB µ²ºcÅ餤ªº lpfnCompare Äæ¦ì¡A¦Ó psort «h¬° TVSORTCB ªº¦ì§}¡CTVSORTCB ªº¦UÄæ¦ì¬O¡G
TVSORTCB        STRUCT
hParent         HTREEITEM       ?
lpfnCompare     PFNTVCOMPARE    ?
lParam          LPARAM          ?
TVSORTCB        ENDS
hParent ¤÷¶µ¥Ø¥N½X¡A¦b¦¹¤÷¶µ¥Ø¤§¤U¤@¶¥¼hªº¤l¶µ¥Ø·|³Q±Æ§Ç¡F²Ä¤T­ÓÄæ¦ì¡Alparam¡A·|¶Çµ¹¤ñ¸û¨ç¦¡ªº²Ä¤T­Ó°Ñ¼Æ¡AlParamSort¡A§@¬°±Æ§Ç¤è¦¡¡C¤ñ¸û¨ç¦¡ªº­ì«¬¬O¡G
  CompareFunc  PROTO  lParam1:LPARAM, lParam2:LPARAM, lParamSort:LPARAM
¨ä¥L§ó²Ó¸`ªº³¡¥÷¥i°Ñ¦Ò²Ä 22 ³¹²M³æÀ˵øªº±Æ§Ç³¡¥÷¡C
¦¨¥\®Éªð¦^ TRUE¡F¥¢±Ñ®Éªð¦^ FALSE¡C

¾ðª¬À˵øªº³qª¾½X ( Notifications )

¾ðª¬À˵øµ¥³q¥Î±±¨î¶µ¬O¥H WM_NOTIFY °T®§»P¤÷µ{¦¡·¾³q¡A¨ä°T®§¤¤ªº wParam ¬Oµo¥X WM_NOTIFY ªº±±¨î¶µÃѧO½X¡A¤£¹LÃѧO½X¥i¥H­«½Æ¡A¦]¦¹³Ì¦nÁÙ¬O­nÀˬdµo¥X WM_NOTIFY ªº±±¨î¶µ¥N½X¤~¦n¡ClParam ¬O¤@­Ó«ü¼Ð¡A¦¹«ü¼Ð«ü¦V¬Y­Óµ²ºcÅ骺¦ì§}¡A³o­Óµ²ºcÅé»P³qª¾½X¦³Ãö¡A¤£¹L¦¹µ²ºcÅ骺«e¤T­ÓÂù¦r²ÕÄæ¦ì¦XºÙ NMHDR¡A¨ä«á¤]¥i¯àÁÙ¥]§t¨ä¥LÄæ¦ì¡A©³¤U¬O²²¤¤º®e¡G

NM_CLICK¡BNM_DBLCLK¡BNM_KILLFOCUS¡BNM_SETFOCUS¡BNM_RCLICK¡BNM_RDBLCLK¡BNM_RETURN¡BNM_OUTOFMEMORY

³o¤K­Ó³qª¾½X¬O©Ò¦³³q¥Î±±¨î¶µ¡A¥]§t¾ðª¬À˵ø¡A³£¯àµo¥Xªº¡A½Ð°Ñ¦Ò²Ä¤G¤Q¤@³¹ªºWM_NOTIFY °T®§¡C

NM_SETCURSOR

­Y·Æ¹«´å¼Ð¦b¬Y­Óµøµ¡²¾°Ê¥B·Æ¹«¥¼³Q®·Àò®É ( ©I¥s SetCapture ¥i®·Àò·Æ¹«°T®§ )¡A¨t²Î´N·|§â WM_SETCURSOR °T®§µo°eµ¹¸Óµøµ¡ªºµøµ¡¨ç¦¡¡C¦ý¾ðª¬À˵ø³q±`¬O¬Y­Óµøµ¡ªº¤lµøµ¡¡A©Ò¥H¾ðª¬À˵øÅÜ·|µo¥X WM_NOTIFY °T®§µ¹¾ðª¬À˵øªº¤÷µøµ¡¡A¦Ó WM_NOTIFY °T®§ªº³qª¾½X§Y¬° NM_SETMOUSE¡CWM_NOTIFY ªº lParam °Ñ¼Æ¬O«ü¦V NMMOUSE µ²ºcÅ骺¦ì§}¡ANMMOUSE µ²ºcÅ骺¦UÄæ¦ì¬O¡G

NMMOUSE         STRUCT
hdr             NMHDR   <>
dwItemSpec      DD      ?
dwItemData      DD      ?
pt              POINT   <>
dwHitInfo       DD      ?
NMMOUSE         ENDS

TVN_ASYNCDRAW

·í¾ðª¬À˵ø´yø¹Ï¥Ü©Î­«Å|¹Ï¥Ü¥X¿ù¥B¨ã¦³ TVS_EX_DRAWIMAGEASYNC ©µ¦ù­·®æ®É¡Aµo¥X¦¹³qª¾½Xµ¹¤÷µøµ¡¡C§¹¦¨¦¹³qª¾½X«á¤£»Ýªð¦^­È¡A§Y¥iªð¦^¡C¦¹³qª¾½Xªº lParam °Ñ¼Æ«ü¦V NMTVASYNCDRAW µ²ºcÅé¡A¨äÄæ¦ì¬O¡G

NMTVASYNCDRAW   STRUCT
hdr             NMHDR                   <>
pimldp          IMAGELISTDRAWPARAMS     <>
hr              HRESULT                 ?
hItem           HTREEITEM               ?
lParam          LPARAM                  ?
dwRetFlags      DWORD                   ?
iRetImageIndex  DWORD                   ?
NMTVASYNCDRAW   ENDS

TVN_BEGINDRAG

¨Ï¥ÎªÌ¤w¸gÀ£¦í·Æ¹«¥ªÁ䤣©ñ¡A·Ç³Æ©ì¦²°Ê§@®É¡A¾ðª¬À˵ø´N·|µo¥X TVN_BEGINDRAG ³qª¾½Xµ¹¨ä¤÷µøµ¡¡C¨ä lParam °Ñ¼Æ«ü¦V NMTREEVIEW µ²ºcÅé¦ì§}¡CNMTREEVIEW µ²ºcÅéº٬O NM_TREEVIEW µ²ºcÅé¡A¨äÄæ¦ì¬O¡G

NMTREEVIEW      STRUCT
hdr             NMHDR   <>
action          DWORD   ?
itemOld         TVITEM  <>
itemNew         TVITEM  <>
ptDrag          POINT   <>
NMTREEVIEW      ENDS

hdr µ²ºcÅéÀ³¤£¥Î¦A»¡©ú¤F¡A½Ð°Ñ¦Ò²Ä 21 ³¹¡AWM_NOTIFY ªº³¡¥÷¡Caction ¥u¥Î©ó TVN_ITEMEXPANDING¡BTVN_ITEMEXPANDED¡BTVN_SELCHANGING¡BTVN_SELCHANGED ³qª¾½X¡A¦b TVN_BEGINDRAG ¤¤¤£¨Ï¥Î¡CitemOld ©M itemNew ¨â­Óµ²ºcÅé¡A¤À§O¬O­ì¨Ó¶µ¥Ø©M·s¶µ¥Øªºª¬ºA¡A¨ä¤¤ itemNew ¤¤ªº hItem¡Bstate ©M lParam ¦b¶}©l©ì¦²®É¡A¥i´£¨Ñ¤@¨Ç¸ê°T ( TVITEM ½Ð°Ñ¦Ò³oùØ )¡CptDrag ¥i¦b¶}©l©ì¦²®É¡A´£¨Ñ·Æ¹«¬Û¹ï©ó¿Ã¹õ¥ª¤W¨¤ªº®y¼Ð¡C³B²z§¹¦¹³qª¾½X¡Aªð¦^­È·|³Q¨t²Î©¿²¤¡C­Y¬O¾ðª¬À˵ø¨ã¦³ TVS_DISABLEDRAGDROP ­·®æ¡A«h¨ä¤÷µøµ¡¤£¯à±µ¦¬¨ì TVN_BEGINDRAG¡C¦Ü©ó¹ê»Ú³B²z©ì¦²°Ê§@ªº¨BÆJ¡A½Ð°Ñ¦Ò©ì¦²¶µ¥Ø¡C

TVN_BEGINLABELEDIT¡BTVN_ENDLABELEDIT

°Ñ¦Ò´N¦a½s¿è¶µ¥Ø¦WºÙ¡C

TVN_BEGINRDRAG

¨Ï¥ÎªÌ¤w¸gÀ£¦í·Æ¹«¥kÁ䤣©ñ¡A·Ç³Æ©ì¦²°Ê§@®É¡A¾ðª¬À˵ø´N·|µo¥X TVN_BEGINDRAG ³qª¾½Xµ¹¨ä¤÷µøµ¡¡C¨ä¾l§¡»P TVN_BEGINDRAG ¬Û¦P¡C

TVN_DELETEITEM

·í¾ðª¬À˵ø§R°£¬Y­Ó¶µ¥Ø®É¡A´N·|µo¥X TVN_DELETEITEM ³qª¾½Xµ¹¤÷µøµ¡¡C³B²z§¹¦¹³qª¾½X¡Aªð¦^­È·|³Q¨t²Î©¿²¤¡C¦¹³qª¾½Xªº lParam «ü¦V NMTREEVIEW µ²ºcÅé¡A¨ä itemOld ¤¤ªº hItem¡BlParam ¥]§t¤F³Q§R°£¶µ¥Øªº¸ê®Æ¡C

TVN_GETDISPINFO

¦b¤j³¡¥÷®É­Ô¡A¾ðª¬À˵ø¤ºªº¶µ¥Ø¸ê®Æ¡A¨Ò¦p¹Ï¥Ü¡B¦WºÙµ¥µ¥¡A¬O¥Ñ§@·~¨t²Î­t³dºûÅ@¡A¦ý¬O¤]¥i¥H¥æ¥Ñµ{¦¡¦Û¦æºûÅ@¡C¦pªG¥æ¥Ñµ{¦¡¦Û¦æºûÅ@¶µ¥Øªº¸ê®Æ¡A¨º»ò·í¾ðª¬À˵ø­nÅã¥Ü³o¨Ç¸ê®Æ®É¡A´N·|µo¥X TVN_GETDISPINFO ³qª¾½X¡A­n¨Dµ{¦¡´£¨Ñ³o¨Ç¸ê®Æ¡C³o¨Ç¸ê®ÆÀ³¥Ñ¤÷µøµ¡ªºµøµ¡¨ç¦¡¡A¶ñ¤J NMTVDISPINFO µ²ºcÅ餺¡C¦Ó NMTVDISPINFO µ²ºcÅ骺¦ì§}«h¦s©ó lParam °Ñ¼ÆùØ¡C¨ä¤¤ item Äæ¦ì¬O¤@­ÓºÙ¬° TVITEM ªºµ²ºcÅé¡ATVITEM ùتº imask¡BhItem¡Bstate ©M lParam ¥²¶·¶ñ¤J¾A·íªº¼Æ­È¡C¦^À³§¹ TVN_GETDISPINFO ³qª¾½X¡A¨t²Î·|©¿²¤ªð¦^­È¡C

©³¤U¬O´XºØ¾ðª¬À˵ø·|µo¥X TVN_GETDISPINFO ³qª¾½Xªº±¡§Î¡G

  1. TVITEM µ²ºcÅ骺 pszText Äæ¦ì¬O LPSTR_TEXTCALLBACK ®É¡A¾ðª¬À˵øµo¥X TVN_GETDISPINFO¡A¥HÀò±o¶µ¥Ø¦WºÙ¡A¦¹®É¡A imask ¬° TVIF_TEXT¡C
  2. TVITEM µ²ºcÅ骺 iImage ©Î iSelectedImage Äæ¦ì¬O I_IMAGECALLBACK ®É¡A¾ðª¬À˵ø­n¥Ñ¤÷µøµ¡Àò±o image list ªº¹Ï¤ù¯Á¤Þ¡C³o®É­Ô¡A¦pªG¦¹¶µ¥Ø¬°³Q¿ï©wªº¡A«h¦b NMTVDISPINFO µ²ºcÅ骺 TVITEM ùتº imask Äæ¦ì·|³Q¨t²Î³]¬° TVIF_SELECTEDIMAGE¡F­Y¬O¨S³Q¿ï©w¡A«h¬° TVIF_IMAGE¡C
  3. TVITEM µ²ºcÅ骺 cChildren Äæ¦ì¬O I_CHILDRENCALLBACK ®É¡A¾ðª¬À˵øµo¥X TVN_GETDISPINFO¡A¥HÀò±o¶µ¥Ø¤§¤U¬O§_ÁÙ¦³¤l¶µ¥Ø¡A³o®É­Ô imask ¬° TVIF_CHILDREN¡C

TVN_GETINFOTIP

¨ã¦³ TVS_INFOTIP ­·®æªº¾ðª¬À˵ø¡A¦b·Æ¹«²¾¹L¬Y­Ó¶µ¥Ø¤WªÅ®É¡A¾ðª¬À˵ø·|µo°e TVN_GETINFOTIP ³qª¾½Xµ¹¤÷µøµ¡¡C¦¹³qª¾½Xªº lParam «ü¦V NMTVGETINFOTIP µ²ºcÅé¦ì§}¡CNMTVGETINFOTIP µ²ºcÅ骺¦UÄæ¦ì¬O¡G

NMTVGETINFOTIP  STRUCT
hdr             NMHDR           <>
pszText         LPTSTR          ?
cchTextMax      DWORD           ?
hItem           HTREEITEM       ?
lParam          LPARAM          ?
NMTVGETINFOTIP  ENDS

NMTVGETINFOTIP µ²ºcÅ餤ªº pszText ¬O«ü¦V¥H 0 µ²§Àªº¦r¦ê¦ì§}¡A³o­Ó¦r¦ê±N·|Åã¥Ü¦b¤u¨ã´£¥Üªº¤º®eùØ¡CcchTextMax «h¬O¸Ó¦r¦êªºªø«×¡A¦pªG¥H 0 µ²§À¡A«h cchTextMax ·|³Q©¿²¤¡ChItem ¬O·Æ¹«´å¼Ð©Ò¦bªº¶µ¥Øªº¶µ¥Ø¥N½X¡A¥Ñ§@·~¨t²Î¶ñ¦n¡C³B²z§¹ TVN_GETINFOTIP «á¡Aªð¦^®É¡A¨t²Î©¿²¤ªð¦^­È¡C

TVN_ITEMCHANGING¡BTVN_ITEMCHANGED

·í¾ðª¬À˵ø¤ºªº¬Y­Ó¶µ¥Ø¸ê®Æ±N­n§ïÅܮɡA¾ðª¬À˵ø·|µo¥X TVN_ITEMCHANGING ³qª¾½Xµ¹¤÷µøµ¡¡F¤w¸g§ïÅܧ¹¦¨«á¡A«hµo¥X TVN_ITEMCHANGED ³qª¾½X¡C¨âªÌªð¦^®É¡Aªð¦^ TRUE ªí¥Ü©Úµ´§ïÅÜ¡FFALSE ªí¥Ü±µ¨ü§ïÅÜ¡C³o¨â­Ó³qª¾½Xªº lParam «ü¦V NMTVITEMCHANGE µ²ºcÅé¡A¨äÄæ¦ì¬O¡G

NMTVITEMCHANGE  STRUCT
hdr             NMHDR           <>
uChanged        DWORD           ?
hItem           HTREEITEM       ?
uStateNew       DWORD           ?
uStateOld       DWORD           ?
lParam          LPARAM          ?
NMTVITEMCHANGE  ENDS

Äæ¦ì¤¤ªº uChanged ¬O«ü§ïÅÜ­þ¤@ºØ¸ê®Æ¡AÁöµM»¡¡A¬Y­Ó¶µ¥Ø¸ê®Æ±N­n§ïÅÜ«e¡B«á¡Aµo¥X TVN_ITEMCHANGING ©Î TVN_ITEMCHANGED¡A¦ý¬O¥u¦³ª¬ºA§ïÅܮɡA¤~·|µo¥X³o¨â­Ó³qª¾½X¡A¨ä¾l¸ê®Æ§ïÅܨ䣷|µo¥X³o¨â­Ó³qª¾½X¡A¦]¦¹ uChanged ¥u¯à¬O TVIF_STATE¡ChItem ¬Oª¬ºA¾D¨ì§ïÅܪº¶µ¥Ø¥N½X¡CuStateNew¡BuStateOld ¬O§ïÅܫ᪬ºA¤Î§ïÅÜ«eª¬ºA¡C

TVN_ITEMEXPANDING¡BTVN_ITEMEXPANDED

·í¨Ï¥ÎªÌ¥H·Æ¹«ÂIÀ»¶µ¥Ø«eªº©Î®É¡A·|¨Ï¸Ó¶µ¥Ø¤Uªº¤l¶µ¥Ø®i¶}©Î¦¬Ãl°_¨Ó¡A¦b§Y±N®i¶}©Î¦¬Ãl°_¨Ó¡A©|¥¼Åã¥Ü·sªºµe­±«e¡A¾ðª¬À˵ø·|µo¥X TVN_ITEMEXPANDING ³qª¾½Xµ¹¤÷µøµ¡¡F¦b®i¶}©Î¦¬Ãlµe­±§¹¦¨«á¡A«hµo¥X TVN_ITEMEXPANDED ³qª¾½X¡C³o¨â­Ó³qª¾½Xªº lParam §¡«ü¦V NMTREEVIEW µ²ºcÅé ( ¤]ºÙ¬° NM_TREEVIEW¡A¨ä¦U­ÓÄæ¦ì¥i°Ñ¦Ò«e­±ªº»¡©ú )¡A¨ä¤¤ itemNew ¤º§t®i¶}©Î¦¬Ãlªº¤÷¶µ¥Ø¸ê®Æ¡A¦ý¥u¦³ itemNew ùتº hItem¡Bstate ¤Î lParam Äæ¦ì¦³¥Î¡Caction ¬° TVE_EXPAND¡Aªí¥Ü¶µ¥Ø³Q®i¶}¡F­Y¬° TVE_COLLAPSE¡Aªí¥Ü¶µ¥Ø³Q¦¬Ãl¡C

TVN_ITEMEXPANDED ªºªð¦^­È¡A·|³Q¨t²Î©¿²¤¡C¦Ó TVN_ITEMEXPANDING ªºªð¦^­È¬° TRUE ®É¡Aªí¥Ü¸T¤î®i¶}©Î¦¬Ãl¡FFALSE ªí¥Ü¤¹³\®i¶}©Î¦¬Ãl¡C

TVN_KEYDOWN

·í¾ðª¬À˵ø¨ã¦³¿é¤JµJÂI®É¡A¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº«öÁä¡A¾ðª¬À˵ø·|µo¥X TVN_KEYDOWN ³qª¾½Xµ¹¤÷µøµ¡¡A¦pªG¤÷µøµ¡ªºµøµ¡¨ç¦¡¤£³B²z TVN_KEYDOWN¡A¦Ó¨Ï¥ÎªÌ«ö¤Uªº¤S¬O¥i¥Nªí¤å¦rªº«öÁä¡A¨Ò¦p A¡BB¡BC¡Kµ¥«öÁä¡A«h¾ðª¬À˵ø·|¨Ï½ü¬y¨Ï¶µ¥Ø¦WºÙ²Ä¤@­Ó¦r¥À¬°¸Ó«öÁ䪺¶µ¥ØÅܬ°³Q¿ï©wªº¶µ¥Ø¡C¦ý¤]¥i¥H¨Ï¾ðª¬À˵ø¤£¶i¦æ¤W­z°Ê§@¡A¨Ïªð¦^­È¬°«D¹s´N¯à¹F¨ì¦¹¥Øªº¡C( ªð¦^­È¥²¶·©I¥s SetWindowLong¡A¨Ã¥B³]©w DWL_MSGRESULT ºX¼Ð¤~¯à¶Ç¦^¨t²ÎùØ )

TVN_KEYDOWN ³qª¾½Xªº lParam «ü¦V¤@­ÓºÙ¬° NMTVKEYDOWN µ²ºcÅé ( º٬° TV_KEYDOWN )¡A¨äÄæ¦ì¬O¡G

NMTVKEYDOWN     STRUCT
hdr             NMHDR   <>
wVKey           WORD    ?
flags           DWORD   ?
NMTVKEYDOWN     ENDS

NMTVKEYDOWN ¤¤ªº flags ³q±`¬O 0¡CwVKey ¬OµêÀÀÁä½X ( virtual-key codes )¡C

TVN_SELCHANGED

·í¨Ï¥ÎªÌ°µ¥H¤U¨â¥ó¨Æ¤¤ªº¥ô¤@ºØ¡A´N·|¨Ï¾ðª¬À˵ø¤¤ªº¬Y­Ó¶µ¥Ø³Q¿ï¨ú¡G

  1. ¥H·Æ¹«ÂIÀ»¾ðª¬À˵ø¤¤ªº¬Y­Ó¶µ¥Ø
  2. «ö¤UÁä½L¤W¥Nªí¤å¦rªº¥ô¤@«öÁä ( ¦p­^¤å¦r¥À©Îªü©Ô§B¼Æ¦rÁä¡AF1¡ãF12 ¤£¦b¦¹¤º ) ¥B¶µ¥Ø¤¤¤]¦³¦WºÙªº²Ä¤@­Ó¦r«ê¦n¬°¦¹«öÁä©Ò¥Nªíªº¦r

·í³Q¿ï¨úªº¶µ¥Ø¡A¤w¸g§ó´«¦¨¥t¤@­Ó¶µ¥Ø«á¡A«hµo¥X TVN_SELCHANGED ³qª¾½Xµ¹¤÷µøµ¡¡ClParam «ü¦V NMTREEVIEW µ²ºcÅé¡A¦¹µ²ºcÅ餤ªº itemOld »P itemNew ¨âÄæ¦ì¡A¤À§Oªí¥Ü­ì¥ý³Q¿ï©wªº¶µ¥Ø©M·sªº¿ï©w¶µ¥Ø¡C¦Ó¥B itemOld »P itemNew ùØ¡A¥u¦³ mask¡BhItem¡Bstate »P lParam Äæ¦ì¦³®Ä¥i¥Î¡Caction Äæ¦ìªí¥Ü¥H­þºØ¤è¦¡¿ï©w¶µ¥Ø¡A¥i¥H¬O¤U­±¤TºØ¨ä¤¤¤§¤@¡GTVC_BYKEYBOARD ( ¥HÁä½L¿ï©w )¡BTVC_BYMOUSE ( ¥H·Æ¹«ÂIÀ»¿ï©w ) ©M TVC_UNKNOWN ( ¥¼ª¾¤è¦¡ )¡C³Ì«á¡Aªð¦^­È·|³Q¨t²Î©¿²¤¡C

TVN_SELCHANGING

·í³Q¿ï¨úªº¶µ¥Ø¡A±N­n§ó´«¦¨¥t¤@­Ó¶µ¥Ø¡A©|¥¼Åã¥Ü·s¿ï©wªº¶µ¥Ø«e¡A¾ðª¬À˵ø·|µo¥X TVN_SELCHANGING ³qª¾½Xµ¹¤÷µøµ¡¡ClParam «ü¦V NMTREEVIEW µ²ºcÅé¡A¦¹µ²ºcÅ餤ªº itemOld »P itemNew ¨âÄæ¦ì¡A¤À§Oªí¥Ü­ì¥ý³Q¿ï©wªº¶µ¥Ø©M·sªº¿ï©w¶µ¥Ø¡Caction Äæ¦ìªí¥Ü¥H­þºØ¤è¦¡¿ï©w¶µ¥Ø¡A»P TVN_SELCHANGED ¬Û¦P¡C³B²z³o­Ó³qª¾½X®É¡A¤£¥i±N­ì¨Ó³Q¿ï©w©Î·sªº¿ï©w¶µ¥Ø§R°£¡C

³B²z TVN_SELCHANGING «á¡A­Yªð¦^ TRUE¡Aªí¥Ü¤£±µ¨üÅܧó¿ï©w¶µ¥Ø¡Fªð¦^ FALSE¡Aªí¥Ü±µ¨ü¿ï©w¶µ¥Ø¡C¦pªG TVN_SELCHANGING ¬Oµo°e¨ì¹ï¸Ü²°ªºµøµ¡¨ç¦¡¡A¨º»ò¥²¶·©I¥s SetWindowLong API ³]©wªð¦^­È¡C

TVN_SETDISPINFO

·í¾ðª¬À˵ø»Ý­nÅã¥Ü¶µ¥Ø¦WºÙ¡B¹ï¶µ¥Ø¦WºÙ±Æ§Ç¡B½s¿è¶µ¥Ø¦WºÙ©ÎªÌ·í¶µ¥Ø¦WºÙ§ïÅܮɡA·|µo°e TVN_SETDISPINFO ³qª¾½Xµ¹¤÷µøµ¡¡A¤÷µøµ¡¶·¶ñ¦n lParam ©Ò«üªº NMTVDISPINFO µ²ºcÅ餺 item Äæ¦ìùØ imask ©Ò«ü¥ÜªºÄæ¦ì¡C¨Ò¦p¡A¦pªG NMTVDISPINFO.item.imask ¬° TVIF_TEXT¡A¨º»ò¤÷µøµ¡ªºµøµ¡¨ç¦¡´NÀ³¸Ó§â NMTVDISPINFO.item.psaText ¶ñ¤J¦r¦ê¦ì§}¡A¥H§ó§ï¶µ¥Ø¦WºÙ¡C

TVN_SINGLEEXPAND

·í¨Ï¥ÎªÌ¥H·Æ¹«³æÀ»¨ã¦³ TVS_SINGLEEXPAND ­·®æªº¾ðª¬À˵ø¤¤ªº¬Y­Ó¶µ¥Ø®É¡A¾ðª¬À˵ø·|µo¥X TVN_SINGLEEXPAND ³qª¾½Xµ¹¤÷µøµ¡¡C¤£¨ã TVS_SINGLEEXPAND ­·®æªº¾ðª¬À˵ø¡A¤£·|µo¥X TVN_SINGLEEXPAND ³qª¾½X¡ClParam «ü¦V NMTREEVIEW µ²ºcÅé¡A³o­Óµ²ºcÅé¥]§t©Ò»Ý¸ê®Æ¡C

ªð¦^­È¬° TVNRET_DEFAULT ®É¡Aªí¥Ü¥H¤º©wªº¤è¦¡°õ¦æ®i¶}©Î¦¬Ãl¡A§Y¶µ¥Ø³£·|³Q¦¬Ãl°_¨Ó¡A¥u¦³³Q¿ï¨ú¶µ¥Ø©³¤Uªº¤l¶µ¥Ø®i¶}¡F¦Ó¥B·Æ¹«ÂIÀ»¬Y¶µ¥Ø¤@¦¸´N¯à®i¶}¤l¶µ¥Ø¡A¦AÂIÀ»¸Ó¶µ¥Ø´N¦¬Ãl¡C­Yªð¦^­È¬° TVNRET_SKIPOLD ®É¡Aªí¥Ü¸õ¹L¥¼³Q¿ï©w¶µ¥Ø¦¬Ãlªº¨BÆJ¡F­Yªð¦^­È¬° TVNRET_SKIPNEW ®É¡Aªí¥Ü¸õ¹L³Q¿ï©w¶µ¥Ø®i¶}ªº¨BÆJ¡C


¤@­Ó½d¨Ò¡GHDINFO2

¨Ì©¹¨Ò¡A¤p¤ì°¸¼¶¼g¤@­Ó¾ðª¬À˵øªº¨Ò¤l¡AHDINFO2¡A®i¥Ü¾ðª¬À˵øªº°ò¥»¥Îªk¡CHDINFO2 ¥i¥H§â¹q¸£¤Wªº¹êÅéºÏºÐ·í¦¨¶µ¥ØÅã¥Ü¦b¾ðª¬À˵ø¤º¡A¨Ã§â¨C­Ó¹êÅéºÏºÐ¤À³Î¦Ó¦¨ªºÅÞ¿èºÏºÐ¬°¨ä¤l¶µ¥Ø¡C¦Ó¨C­ÓÅÞ¿èºÏºÐªº¥Ø¿ý©ÎÀɮסA¬°ÅÞ¿èºÏºÐªº¤l¶µ¥Ø¡A¦p¤U¹Ï¡G

HDINFO2 ªº­ì©lµ{¦¡

©³¤U¬O¸ê·½´y­zÀÉ¡AHDINFO2.RC ªº¤º®e¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "c:\masm32\include\resource.h"
 
#define  RT_MANIFEST     24
 
#define  IDC_TREEVIEW    1600
#define  IDC_TEXT        1601
#define  IDK_RENAME      1602
#define  TVS_NOHSCROLL   0x8000
 
Hd_Info  DIALOG  100,100,200,150
STYLE    WS_CAPTION|WS_VISIBLE|WS_SYSMENU
FONT     10,"·s²Ó©úÅé"
CAPTION  "µwºÐ¸ê°T"
BEGIN
CONTROL "",IDC_TREEVIEW,"SysTreeView32",WS_BORDER|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT|TVS_INFOTIP|TVS_EDITLABELS,
         5,5,110,140
LTEXT   "",IDC_TEXT  ,120,5,75,140
END
 
1        RT_MANIFEST MOVEABLE PURE "HDINFO2.EXE.MANIFEST"
 
COMPUTER        ICON    COMPUTER.ICO
HARDDISK        ICON    HARDDISK.ICO
FOLDER          ICON    FOLDER.ICO
FILE            ICON    FILE.ICO

©³¤U¬O HDINFO2.EXE.MANIFEST ªº¤º®e¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
  <dependentAssembly>
      <assemblyIdentity type='win32'
                        name='Microsoft.Windows.Common-Controls'
                        version='6.0.0.0'
                        processorArchitecture='*'
                        publicKeyToken='6595b64144ccf1df'
                        language='*'
      />
  </dependentAssembly>
</dependency>
</assembly>

­ì©l½X¡AHDINFO2.ASM ¦p¤U¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
        .586
        .MODEL  FLAT,STDCALL
        OPTION  CASEMAP:NONE
 
INCLUDE         WINDOWS.INC
INCLUDE         COMCTL32.INC
INCLUDE         KERNEL32.INC
INCLUDE         USER32.INC
INCLUDELIB      COMCTL32.LIB
INCLUDELIB      KERNEL32.LIB
INCLUDELIB      USER32.LIB
INCLUDELIB      HD.LIB          ;°Ñ¦Òªþ¿ý¤»©Ò»s¦¨ªº°ÊºA³sµ²µ{¦¡®w
 
GetLogicalDriveFromPhysicalDrive        PROTO   :LPSTR
 
IDC_TREEVIEW                            EQU     1600
IDC_TEXT                                EQU     1601
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX        EQU     700a0h
 
MEDIA_TYPE      TYPEDEF DWORD
TVINSERTSTRUCT  TYPEDEF TV_INSERTSTRUCT ;°t¦X1.60ª©ªºWINDOWS.INC¡A¦¹ª©¥]§t¦bMASM32 v11ùØ
 
;DISK_GEOMETRY¡BDISK_GEOMETRY_EX³o¨â­Óµ²ºcÅé¡A¨S¦³¦b1.60ª©ªº
;WINDOWS.INC¤¤©w¸q¡A¬G¦b¦¹©w¸q¡A¥L­Ì»P¨ú±o¹êÅéºÏºÐªº¸ê®Æ¦³Ãö
DISK_GEOMETRY           STRUCT
Cylinders               LARGE_INTEGER   <>
MediaType               MEDIA_TYPE      ?
TracksPerCylinder       DWORD           ?
SectorsPerTrack         DWORD           ?
BytesPerSector          DWORD           ?
DISK_GEOMETRY           ENDS
 
DISK_GEOMETRY_EX        STRUCT
Geometry                DISK_GEOMETRY   <>
DiskSize                LARGE_INTEGER   <>
DataOne                 BYTE            ?
DISK_GEOMETRY_EX        ENDS
 
;***************************************************************************************************
.CONST
szDlgName       BYTE    "HdInfo",0      ;¹ï¸Ü²°¦WºÙ
szIconComputer  BYTE    "COMPUTER",0    ;¹q¸£¹Ï¥Ü
szIconHardisk   BYTE    "HARDDISK",0    ;µwºÐ¹Ï¥Ü
szIconFolder    BYTE    "FOLDER",0      ;¤l¥Ø¿ý¹Ï¥Ü
szIconFile      BYTE    "FILE",0        ;Àɮ׹ϥÜ
szIconOpnFolder BYTE    "OPENFOLDER",0  ;¶}±Òªº¤l¥Ø¿ý¹Ï¥Ü
szRootItem      BYTE    "¹q¸£¤¤ªºµwºÐ",0
szHdInfoFmt     BYTE    "¹êÅéºÏºÐ %d",0dh,0ah
                BYTE    "ºÏ¬W¼Æ¡G%I64d",0dh,0ah,"ºÏÀY¼Æ¡G%d",0dh,0ah,"¨CºÏ­yªººÏ°Ï¼Æ¡G%d",0dh,0ah
                BYTE    "¨CºÏ°Ï¦ì¤¸²Õ¼Æ¡G%d",0dh,0ah,"ºÏºÐ®e¶q¡G%d GB",0
szLogInfoFmt0   BYTE    "ºÏºÐ%c:",0dh,0ah,"Á`¦@®e¶q¡G%d GB",0dh,0ah,"³Ñ¤U%d GB ¥i¥Î",0
szLogInfoFmt1   BYTE    "ºÏºÐ%c:",0dh,0ah,"Á`¦@®e¶q¡G%d MB",0dh,0ah,"³Ñ¤U%d MB ¥i¥Î",0
szFileInfoFmt   BYTE    "Àɮפj¤p¡G",0dh,0ah,"%I64d¦ì¤¸²Õ",0dh,0ah,0dh,0ah,0
szDate0Fmt      BYTE    "«ØÀɮɶ¡¡G",0dh,0ah,"yyyy/MM/dd",0
szDate1Fmt      BYTE    "³Ì«á¦s¨ú®É¶¡¡G",0dh,0ah,"yyyy/MM/dd",0
szDate2Fmt      BYTE    "³Ì«á­×§ï®É¶¡¡G",0dh,0ah,"yyyy/MM/dd",0
szTimeFmt       BYTE    " HH:mm:ss",0dh,0ah,0dh,0ah,0
szThisIsCmputer BYTE    "³o¬O¹q¸£¡C",0
szThisIsDrv     BYTE    "³o¬OºÏºÐ¾÷¡C",0
szThisIsDir     BYTE    "³o¬O¥Ø¿ý¡C",0
szThisIsFile    BYTE    "³o¬OÀɮסC",0
szThisIsUnknown BYTE    "¤£ª¾¹D³o¬O¤°»ò¡I",0
szInfoTipTitle  BYTE    "¸ê°T",0
szCantDnDHere   BYTE    "µLªk©ì©ñ¨ì"
;***************************************************************************************************
.DATA
hInstance       HINSTANCE       ?       ;°õ¦æ¹ê¨Ò¥N½X
hImageList      HANDLE          ?       ;¾ðª¬À˵øªº image list ¥N½X
hTreeView       HANDLE          ?       ;¾ðª¬À˵ø¥N½X
hStatic         HANDLE          ?       ;ÀRºAÀ˵ø¥N½X¡A¥Î©óÅã¥Ü¾ðª¬À˵ø¤ºªº¶µ¥Ø¸ê®Æ
hComputer       HTREEITEM       ?       ;®Ú¶µ¥Ø¥N½X
hEdit           HANDLE          ?       ;¾ðª¬À˵ø¶i¦æ´N¦a½s¿è®É¡A½s¿è®Ø¥N½X
lpOldEditProc   DWORD           ?
hDragImage      HANDLE          ?
DragMode        DWORD           FALSE   ;¬O§_¶i¦æ©ì¦²°Ê§@¡C¬O¬°TRUE¡F§_¬°FALSE
dwCx            DWORD           ?       ;¾ðª¬À˵ø¶ZÂ÷¹ï¸Ü²°¦h»·¡GX®y¼Ð
dwCy            DWORD           ?       ;¾ðª¬À˵ø¶ZÂ÷¹ï¸Ü²°¦h»·¡GY®y¼Ð
szPhyHD         BYTE            "¹êÅéºÏºÐ "
szPhyHDNo       BYTE            "0",0
szPhyDrv        BYTE            "\\.\PhysicalDrive0",0
szInfo          BYTE            200 DUP (0)
szPath          BYTE            512 DUP (0)
;***************************************************************************************************
.CODE
;---------------------------------------------------------------------------------------------------
;·sªº½s¿è®Øµøµ¡¨ç¦¡¡A¶È³B²zWM_CHAR¡BWM_GETDLGCODE
new_edit_proc   PROC    USES ebx esi edi hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg==WM_CHAR
                mov     eax,wParam
        .IF al==VK_RETURN
                INVOKE  SendMessage,hTreeView,TVM_ENDEDITLABELNOW,FALSE,0
        .ELSEIF al==VK_ESCAPE
                INVOKE  SendMessage,hTreeView,TVM_ENDEDITLABELNOW,TRUE,0
        .ELSE
                INVOKE  CallWindowProc,lpOldEditProc,hWnd,uMsg,wParam,lParam
                ret
        .ENDIF
 
.ELSEIF uMsg==WM_GETDLGCODE
                mov     eax,DLGC_WANTALLKEYS
                ret
.ELSE
                INVOKE  CallWindowProc,lpOldEditProc,hWnd,uMsg,wParam,lParam
                ret
.ENDIF
                xor     eax,eax
                ret
new_edit_proc   ENDP
;---------------------------------------------------------------------------------------------------
;¦b¶µ¥Ø¤¤²K¥[¤l¶µ¥Ø¡A¦¹¶µ¥Ø¬°¤@¤l¥Ø¿ý¡A©Ò²K¥[ªº¤l¶µ¥Ø¤D¬O¦¹¤l¥Ø¿ý¤ºªºÀɮשΤl¥Ø¿ý
;¿é¤J¡GpDir¡Ð¶µ¥Ø©Ò¥Nªíªº¤l¥Ø¿ý¸ô®|
;¡@¡@¡@hItm¡Ð¶µ¥Ø¥N½X
add_item_from_subdir    PROC    USES edi pDir:LPSTR,hItm:HTREEITEM
                LOCAL   w32fd:WIN32_FIND_DATA
                LOCAL   hSearch:HANDLE
                LOCAL   tvis:TVINSERTSTRUCT
                mov     al,0
                mov     edi,pDir
                mov     ecx,MAX_PATH
                repne   scasb
                mov     DWORD PTR[edi-1],2a2e2a5ch      ;"\*.*,0"¦r¦ê
                mov     BYTE PTR[edi+3],0
                cld
                INVOKE  FindFirstFile,pDir,ADDR w32fd
                mov     hSearch,eax
                cmp     eax,INVALID_HANDLE_VALUE
                je      finish
        .WHILE eax!=0
                mov     ecx,hItm
                mov     tvis.hInsertAfter,TVI_LAST
                mov     tvis.hParent,ecx
                mov     tvis.itemex.imask,TVIF_CHILDREN or TVIF_TEXT or TVIF_IMAGE or TVIF_SELECTEDIMAGE or TVIF_PARAM
                lea     edx,w32fd.cFileName
            .IF (WORD PTR [edx]!=2e2eh)&&(BYTE PTR [edx]!=2eh)
                mov     tvis.itemex.pszText,edx
                mov     tvis.itemex.cChildren,0
                mov     tvis.itemex.iImage,3
                mov     tvis.itemex.iSelectedImage,3
                mov     tvis.itemex.lParam,454c4946h    ;"FILE"¦r¦ê
            ;Àˬd¬O§_¬°¤l¥Ø¿ý¡A­Y¬O«htvis.itemexÄæ¦ì¤¤ªºcChildren¡BiImage¡BiSelectedImage¤À§O»Ý­×§ï¦¨1¡B2¡B4
                test    w32fd.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY
                jz      @f
                mov     tvis.itemex.cChildren,1
                mov     tvis.itemex.iImage,2
                mov     tvis.itemex.iSelectedImage,4
                mov     tvis.itemex.lParam,44425553h    ;"SUBD"¦r¦ê
@@:             INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis
            .ENDIF
                INVOKE  FindNextFile,hSearch,ADDR w32fd
        .ENDW
finish:         INVOKE  FindClose,hSearch
                ret
add_item_from_subdir    ENDP
;---------------------------------------------------------------------------------------------------
;­pºâ¶µ¥Ø¦WºÙªºªø«× ( ¶µ¥Ø¦WºÙ¦ì§}¦s©óEDI )¡A¨Ã¦s©óECXùØ¡A¦¹ªø«×¥]§t¡u0¡v
get_len         PROC
                mov     al,0
                mov     ecx,MAX_PATH
                repne   scasb
                sub     ecx,MAX_PATH
                neg     ecx
                ret
get_len         ENDP
;---------------------------------------------------------------------------------------------------
;¨ú±o¬Y¶µ¥Øªº¸ô®|¦WºÙ¡A¦s©ószPath¦r¦êùØ
;¿é¤J¡GhItm¡Ð¬Y¶µ¥Øªº¥N½X
;¡@¡@¡@pName¡Ð¬Y¶µ¥Øªº¦WºÙ©Ò¦b¦ì§}
get_path        PROC    USES ebx esi edi hItm:HTREEITEM,pName:LPSTR
                LOCAL   pFullname:LPSTR
                LOCAL   tvi:TVITEM
                LOCAL   buffer[MAX_PATH]:BYTE
                LOCAL   szFullname[512]:BYTE
                cld
                mov     edx,hItm
                mov     tvi.lParam,0
                mov     tvi.hItem,edx
            ;§â¿ï©w¶µ¥Ø¦WºÙ²¾¨ìszFullname³Ì°ª¦ì§}¡A¥ç§Y¦r¦ê³Ì«á­±
                mov     edi,pName
                call    get_len
                lea     edi,szFullname
                mov     esi,pName
                add     edi,SIZEOF szFullname
                sub     edi,ecx
                mov     pFullname,edi
                rep     movsb
        .WHILE tvi.lParam!=4448474ch    ;"LGHD"¦r¦ê
            ;¨ú±o¤÷¶µ¥Ø¥N½X
                INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_PARENT,tvi.hItem
                lea     edx,buffer
                mov     tvi.imask,TVIF_TEXT or TVIF_HANDLE or TVIF_PARAM
                mov     tvi.hItem,eax
                mov     tvi.pszText,edx
                mov     tvi.cchTextMax,SIZEOF buffer
            ;¨ú±o¤÷¶µ¥Ø¦WºÙ
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvi
                lea     edi,buffer
                mov     ecx,MAX_PATH
                call    get_len
                mov     edi,pFullname
                sub     edi,ecx
                lea     esi,buffer
                mov     pFullname,edi
                rep     movsb
                mov     BYTE PTR [edi-1],'\'
        .ENDW
                lea     ecx,szFullname
                mov     esi,pFullname
                add     ecx,512
                mov     edi,OFFSET szPath
                sub     ecx,esi
                rep     movsb
                ret
get_path        ENDP
;---------------------------------------------------------------------------------------------------
;Àò±oÀɮ׸ê®Æ¡A¥]§tÀɮפj¤p¡B«ØÀɮɶ¡¡B³Ì«á¦s¨ú¤é´Á¤Î®É¶¡¡B³Ì«á­×§ï¤é´Á¤Î®É¶¡¡A¦s©ószInfoùØ
;¿é¤J¡GszPath¡Ð§¹¾ãªºÀɮצWºÙ¦r¦ê
;¿é¥X¡GszInfo¡ÐÀɮ׸ê®Æªº¦r¦ê
;¡@¡@¡@EAX¡ÐszInfo¦ì§}
get_file_info   PROC    USES ebx esi edi
                LOCAL   hFile:HFILE
                LOCAL   fi:BY_HANDLE_FILE_INFORMATION
                LOCAL   ft:FILETIME
                LOCAL   syst:SYSTEMTIME
                LOCAL   pszInfo:LPSTR
                LOCAL   dwSizeSzInfo:DWORD
                INVOKE  CreateFile,OFFSET szPath,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,0
        .IF eax==INVALID_HANDLE_VALUE
                mov     eax,OFFSET szInfo
                mov     BYTE PTR [eax],0
        .ELSE
                mov     hFile,eax
                mov     pszInfo,OFFSET szInfo
                mov     dwSizeSzInfo,SIZEOF szInfo
                INVOKE  GetFileInformationByHandle,hFile,ADDR fi
                INVOKE  FileTimeToLocalFileTime,ADDR fi.ftCreationTime,ADDR ft
                INVOKE  FileTimeToSystemTime,ADDR ft,ADDR syst
                INVOKE  wsprintf,OFFSET szInfo,OFFSET szFileInfoFmt,fi.nFileSizeLow,fi.nFileSizeHigh
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
            ;Åã¥Ü«ØÀɤé´Á¤Î®É¶¡
                INVOKE  GetDateFormat,LOCALE_USER_DEFAULT,0,ADDR syst,OFFSET szDate0Fmt,pszInfo,dwSizeSzInfo
                dec     eax
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
                INVOKE  GetTimeFormat,LOCALE_USER_DEFAULT,0,ADDR syst,OFFSET szTimeFmt,pszInfo,dwSizeSzInfo
                dec     eax
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
            ;Åã¥Ü³Ì«á¦s¨ú¤é´Á¤Î®É¶¡
                INVOKE  FileTimeToLocalFileTime,ADDR fi.ftLastAccessTime,ADDR ft
                INVOKE  FileTimeToSystemTime,ADDR ft,ADDR syst
                INVOKE  GetDateFormat,LOCALE_USER_DEFAULT,0,ADDR syst,OFFSET szDate1Fmt,pszInfo,dwSizeSzInfo
                dec     eax
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
                INVOKE  GetTimeFormat,LOCALE_USER_DEFAULT,0,ADDR syst,OFFSET szTimeFmt,pszInfo,dwSizeSzInfo
                dec     eax
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
            ;Åã¥Ü³Ì«á­×§ï¤é´Á¤Î®É¶¡
                INVOKE  FileTimeToLocalFileTime,ADDR fi.ftLastWriteTime,ADDR ft
                INVOKE  FileTimeToSystemTime,ADDR ft,ADDR syst
                INVOKE  GetDateFormat,LOCALE_USER_DEFAULT,0,ADDR syst,OFFSET szDate2Fmt,pszInfo,dwSizeSzInfo
                dec     eax
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
                INVOKE  GetTimeFormat,LOCALE_USER_DEFAULT,0,ADDR syst,OFFSET szTimeFmt,pszInfo,dwSizeSzInfo
                dec     eax
                add     pszInfo,eax
                sub     dwSizeSzInfo,eax
                INVOKE  CloseHandle,hFile
                mov     eax,OFFSET szInfo
        .ENDIF
                ret
get_file_info   ENDP
;---------------------------------------------------------------------------------------------------
;¨ú±oÅÞ¿èºÏºÐ¸ê®Æ¡A¥]§tÅÞ¿èºÏºÐ¤j¤p¤Î³Ñ¾l©ó¤j¤p
;¿é¤J¡GpLogHdName¡ÐÅÞ¿èºÏºÐ¦W¡A¨Ò¦p¡u"C:",0¡v¦r¦ê
;¿é¥X¡GszInfo¡ÐÅÞ¿èºÏºÐ¸ê®Æªº¦r¦ê
;¡@¡@¡@EAX¡ÐszInfo¦ì§}
get_log_drv     PROC    USES ebx pLogHdName:LPSTR
                LOCAL   hAvailable,lAvailable:DWORD
                LOCAL   hTotal,lTotal:DWORD
                LOCAL   hFree,lFree:DWORD
                mov     eax,pLogHdName
                mov     WORD PTR [eax+2],5ch    ;§ï¦¨¡u"C:\",0¡v¦r¦ê
                INVOKE  GetDiskFreeSpaceEx,pLogHdName,ADDR lAvailable,ADDR lTotal,ADDR lFree
                mov     eax,lTotal
        .IF (eax>=40000000h&&hTotal==0)||(hTotal>0)
                ;¶W¹L1GB
                mov     ecx,1000*1000*1000
                mov     ebx,OFFSET szLogInfoFmt0
        .ELSE
                ;¤£¨¬1GB¡A§ï¥ÎMB¬°³æ¦ì
                mov     ecx,1000*1000
                mov     ebx,OFFSET szLogInfoFmt1
        .ENDIF
                mov     edx,hTotal
                div     ecx
                mov     lTotal,eax
                mov     eax,lAvailable
                mov     edx,hAvailable
                div     ecx
                mov     edx,pLogHdName
                mov     lAvailable,eax
                movzx   eax,BYTE PTR [edx]      ;EAX¡×ÅÞ¿èºÏºÐ¦WºÙ
                INVOKE  wsprintf,OFFSET szInfo,ebx,eax,lTotal,lAvailable
                mov     eax,OFFSET szInfo
                ret
get_log_drv     ENDP
;---------------------------------------------------------------------------------------------------
;¨ú±o¹êÅéµwºÐªº¸ê®Æ¡A¦pºÏ¬W¼Æ¡BºÏÀY¼Æµ¥µ¥
;¿é¤J¡GpPhyHdName¡Ð¦r¦ê¡u"¹êÅéºÏºÐ ?",0¡vªº¦ì§}
;¿é¥X¡GszInfo¦ì§}¡ÐszInfo¦r¦ê¦s¦³¹êÅéµwºÐªº¸ê®Æ¡A¦pºÏ¬W¼Æ¡BºÏÀY¼Æµ¥µ¥
;¡@¡@¡@EAX¡ÐszInfo¦ì§}
get_phy_drv     PROC    USES esi edi pPhyHdName:LPSTR
                LOCAL   hPhyDrv:HANDLE
                LOCAL   dwReturnBytes:DWORD
                LOCAL   dgex:DISK_GEOMETRY_EX
                mov     edi,pPhyHdName          ;EDI«ü¦VÃþ¦ü¡u"¹êÅéºÏºÐ 0",0¡v¦r¦ê
                mov     al,0
                mov     ecx,MAX_PATH
                cld
                repne   scasb
                sub     edi,2
                mov     edx,OFFSET szPhyDrv+17  ;EDX«ü¦V¡u"\\.\PhysicalDrive0",0¡v¤¤ªº"0"
                mov     al,[edi]
                mov     [edx],al
                movzx   esi,al
                sub     esi,"0"
                INVOKE  CreateFile,OFFSET szPhyDrv,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or \
                        FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
                mov     hPhyDrv,eax
                INVOKE  DeviceIoControl,hPhyDrv,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,0,0,\
                        ADDR dgex,SIZEOF dgex,ADDR dwReturnBytes,0
                mov     eax,dgex.DiskSize.LowPart
                mov     edx,dgex.DiskSize.HighPart
                mov     ecx,1000*1000*1000
                div     ecx
                INVOKE  wsprintf,OFFSET szInfo,OFFSET szHdInfoFmt,esi,\
                        dgex.Geometry.Cylinders.LowPart,dgex.Geometry.Cylinders.HighPart,\      ;ºÏ¬W¼Æ
                        dgex.Geometry.TracksPerCylinder,\                                       ;ºÏÀY¼Æ
                        dgex.Geometry.SectorsPerTrack,\                                         ;ºÏ­y¼Æ
                        dgex.Geometry.BytesPerSector,eax                                        ;ºÏ°Ï¤Î®e¶q
                INVOKE  CloseHandle,hPhyDrv
                mov     eax,OFFSET szInfo
                ret
get_phy_drv     ENDP
;---------------------------------------------------------------------------------------------------
DlgProc         PROC    hDlg:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
                LOCAL   hIcon,hInfoTip:HANDLE
                LOCAL   tvis:TVINSERTSTRUCT
                LOCAL   tvhti:TVHITTESTINFO     ;©ì¦²¹Ï¹³®É¡A´ú¸Õ¼öÂI¦b­þ¤@­Ó¶µ¥Ø¤W(µo°eTVM_HITTEST°T®§)
                LOCAL   hMem,hPhyHD:HANDLE,lphMem:LPSTR
                LOCAL   buffer[MAX_PATH]:BYTE
 
.IF uMsg==WM_INITDIALOG
        ;«Ø¥ßImageList
                INVOKE  ImageList_Create,16,16,ILC_COLOR32 or ILC_MASK,4,0
                mov     hImageList,eax
        ;¸ü¤J¹Ï¥Ü¨ì image list¡A¨Ã§R°£¹Ï¥Ü
                INVOKE  LoadIcon,hInstance,OFFSET szIconComputer
                mov     hIcon,eax
                INVOKE  ImageList_ReplaceIcon,hImageList,-1,eax ;0-COMPUTER
                INVOKE  SendMessage,hDlg,WM_SETICON,ICON_SMALL,hIcon
                INVOKE  DestroyIcon,hIcon
                INVOKE  LoadIcon,hInstance,OFFSET szIconHardisk
                mov     hIcon,eax
                INVOKE  ImageList_ReplaceIcon,hImageList,-1,eax ;1-HARDDISK
                INVOKE  DestroyIcon,hIcon
                INVOKE  LoadIcon,hInstance,OFFSET szIconFolder
                mov     hIcon,eax
                INVOKE  ImageList_ReplaceIcon,hImageList,-1,eax ;2-FOLDER
                INVOKE  DestroyIcon,hIcon
                INVOKE  LoadIcon,hInstance,OFFSET szIconFile
                mov     hIcon,eax
                INVOKE  ImageList_ReplaceIcon,hImageList,-1,eax ;3-FILE
                INVOKE  DestroyIcon,hIcon
                INVOKE  LoadIcon,hInstance,OFFSET szIconOpnFolder
                mov     hIcon,eax
                INVOKE  ImageList_ReplaceIcon,hImageList,-1,eax ;4-OPEN FILE
                INVOKE  DestroyIcon,hIcon
        ;¨ú±o¾ðª¬À˵ø±±¨î¶µ¤Î½s¿è®Ø¥N½X
                INVOKE  GetDlgItem,hDlg,IDC_TEXT
                mov     hStatic,eax
                INVOKE  GetDlgItem,hDlg,IDC_TREEVIEW
                mov     hTreeView,eax
        ;±NImageList»P¾ðª¬À˵ø³sµ²°_¨Ó
                INVOKE  SendMessage,hTreeView,TVM_SETIMAGELIST,TVSIL_NORMAL,hImageList
        ;¦b¾ðª¬À˵ø±±¨î¶µ¤¤¥[¤J¡u¹q¸£¤¤ªºµwºÐ¡v
                mov     tvis.hParent,TVI_ROOT
                mov     tvis.hInsertAfter,TVI_FIRST
                mov     tvis.itemex.imask,TVIF_TEXT or TVIF_IMAGE or TVIF_SELECTEDIMAGE or TVIF_CHILDREN or TVIF_PARAM
                mov     tvis.itemex.pszText,OFFSET szRootItem
                mov     tvis.itemex.iImage,0
                mov     tvis.itemex.iSelectedImage,0
                mov     tvis.itemex.cChildren,1
                mov     tvis.itemex.lParam,504d5e43h            ;"COMP"¦r¦ê
                INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis
                mov     hComputer,eax
        ;¨ú±o¦U¹êÅéºÏºÐ¤¤©Ò§tªºÅÞ¿èºÏºÐ¥N½X
                INVOKE  GetLogicalDriveFromPhysicalDrive,NULL   ;©Ò»Ý¸ê®Æ¤j¤p
                INVOKE  GlobalAlloc,GPTR,eax                    ;°t¸m©Ò»Ý°O¾ÐÅé
                mov     hMem,eax
                mov     lphMem,eax
                INVOKE  GetLogicalDriveFromPhysicalDrive,eax
        ;¦b¾ðª¬À˵øùØ¡A²K¥[¦U­Ó¡u¹êÅéµwºÐ X¡v¶µ¥Ø¡A¨Ã¦b¸Ó¶µ¥Ø¤U²K¥[¡uX:¡vÅÞ¿èºÏºÐ¤l¶µ¥Ø
   .WHILE TRUE
                mov     ecx,lphMem
                add     ecx,17  ;«ü¦V"\\.\PhysicalDrive0"¦r¦êªº¡u0¡v
                mov     edx,OFFSET szPhyHDNo
                mov     al,[ecx]
                mov     [edx],al
                add     lphMem,19
        ;³]©w¹êÅéºÏºÐ¨Ï¥ÎªºTVINSERTSTRUCT
                mov     ecx,hComputer
                mov     tvis.hParent,ecx
                mov     tvis.hInsertAfter,TVI_LAST
                mov     tvis.itemex.pszText,OFFSET szPhyHD
                mov     tvis.itemex.cchTextMax,11
                mov     tvis.itemex.iImage,1
                mov     tvis.itemex.iSelectedImage,1
                mov     tvis.itemex.cChildren,1
                mov     tvis.itemex.lParam,44485946h            ;"FYHD"¦r¦ê
        ;¦b¾ðª¬À˵ø±±¨î¶µ¤¤¥[¤J¡u¹êÅéºÏºÐ X¡v
                INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis
                mov     hPhyHD,eax
        ;³]©wÅÞ¿èºÏºÐ¨Ï¥ÎªºTVINSERTSTRUCT
      .WHILE TRUE
                mov     edx,lphMem
      .BREAK .IF BYTE PTR [edx]==5ch            ;Àˬd¦¹®ÉÅéºÏºÐ¬O§_ÁÙ¦³¨ä¥LÅÞ¿èºÏºÐ
                cmp     BYTE PTR [edx],0
                jz      finish                  ;Àˬd¬O§_¤w§¹¦¨©Ò¦³¹êÅéºÏºÐ¤ÎÅÞ¿èºÏºÐ
                mov     ecx,hPhyHD
                mov     tvis.itemex.pszText,edx
                mov     tvis.itemex.cChildren,1 ;ÅÞ¿èºÏºÐ¤U¡AÁÙ¦³¤l¶µ¥Ø
                mov     tvis.hParent,ecx
                mov     tvis.itemex.iImage,1
                mov     tvis.itemex.iSelectedImage,1
                mov     tvis.itemex.lParam,4448474ch            ;"LGHD"¦r¦ê
                INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis
                add     lphMem,3                ;«ü¦V¤U¤@­ÓÅÞ¿èºÏºÐ¦ì§}
      .ENDW
   .ENDW
finish:         INVOKE  GlobalFree,hMem
 
.ELSEIF uMsg==WM_NOTIFY
                push    ebx
                ASSUME  ebx:PTR NMTREEVIEW
                mov     ebx,lParam
                mov     ecx,[ebx].hdr.hwndFrom  ;ECX¡×µo¥XWM_NOTIFYªº±±¨î¶µ¥N½X
   .IF [ebx].hdr.hwndFrom==ecx                  ;µo¥XWM_NOTIFYªº±±¨î¶µ¥N½X
      ;³B²zTVN_SELCHANGED³qª¾½X¡A·í¨Ï¥ÎªÌ¿ï©w¬Y­Ó¶µ¥Ø®É¡A¥ý¨ú±o¶µ¥Ø¦WºÙ¤ÎlParam¡A¥ÑlParam§PÂ_¸Ó¶µ¥Ø¬O¡u¹q¸£¤¤ªºµwºÐ¡v
      ;¡B¹êÅéºÏºÐ¡BÅÞ¿èºÏºÐ¡BÀÉ®×ÁÙ¬O¤l¥Ø¿ý¡C¦pªG¬O«e¥|ªÌ¡A«h¦bÀRºA±±¥óhStatic¤¤Åã¥Ü¤@¨Ç¸ê®Æ¡F§_«h¤£Åã¥Ü¸ê®Æ
      .IF [ebx].hdr.code==TVN_SELCHANGED
                ;¨ú±o³Q¿ï©w¶µ¥Øªº¦WºÙ»PlParam¡A¦s©ótvis.itemex
                mov     edx,[ebx].itemNew.hItem
                lea     eax,buffer
                mov     tvis.itemex.hItem,edx
                mov     tvis.itemex.imask,TVIF_TEXT or TVIF_PARAM
                mov     tvis.itemex.pszText,eax
                mov     tvis.itemex.cchTextMax,SIZEOF buffer
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvis.itemex
         .IF tvis.itemex.lParam==504d5e43h      ;"COMP"¦r¦ê
                mov     eax,OFFSET szRootItem
         .ELSEIF tvis.itemex.lParam==44485946h  ;"PHYHD"¦r¦ê
                INVOKE  get_phy_drv,ADDR buffer
         .ELSEIF tvis.itemex.lParam==4448474ch  ;"LGHD"¦r¦ê
                INVOKE  get_log_drv,ADDR buffer
         .ELSEIF tvis.itemex.lParam==454c4946h  ;"FILE"¦r¦ê¡A¥ý¨ú±o¸ÓÀɮתº§¹¾ã¸ô®|¡A¦A©I¥sget_file_infoÀò±o¸ê®Æ
                INVOKE  get_path,tvis.itemex.hItem,ADDR buffer
                call    get_file_info
         .ELSE
                mov     eax,OFFSET szIconFile+4 ;«ü¦VNULL¦r¦ê
         .ENDIF
                INVOKE  SetWindowText,hStatic,eax
      ;³B²zTVN_ITEMEXPANDING³qª¾½X¡A¥u¦³ÅÞ¿èºÏºÐ©Î¤l¥Ø¿ý®i¶}©Î¦¬Ãl®É¡A¤~»Ý³B²z¦¹³qª¾½X¡C·í®i¶}®É¡A»Ý¨ú±o¸Ó¥Ø¿ý¤º¦U
      ;ÀɮשΨ䤺ªº¤l¥Ø¿ý¬°¨ä¤l¶µ¥Ø¡C·í¦¬Ãl®É¡Aµo¥XTVM_DELETEITEM§R¥h¸Ó¶µ¥Ø¤Î¨ä¤Uªº©Ò¦³¤l¶µ¥Ø¡A¦ý³o¤£²Å¦X­n¨D¡A©Ò¥H
      ;ÁÙ±o§â¸Ó¶µ¥ØÁÙ­ì¡A¦]¦¹¥ý¨ú±o¸Ó¶µ¥Øªº¸ê®Æ¡B¦A§R°£¡B¦A¨Ì­è­è±o¨ìªº¸ê®Æ­«·s²K¥[¸Ó¶µ¥Ø
      .ELSEIF [ebx].hdr.code==TVN_ITEMEXPANDING
                mov     edx,[ebx].itemNew.hItem
                lea     eax,buffer
                mov     tvis.itemex.hItem,edx
                mov     tvis.itemex.imask,TVIF_TEXT or TVIF_PARAM or TVIF_SELECTEDIMAGE or TVIF_IMAGE or TVIF_CHILDREN
                mov     tvis.itemex.pszText,eax
                mov     tvis.itemex.cchTextMax,SIZEOF buffer
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvis.itemex    ;¨ú±o³Q¿ï©w¶µ¥Øªº¸ê®Æ¡A¦s©ótvis.itemex
         .IF [ebx].itemNew.lParam==44425553h            ;"SUBD"¦r¦ê
            .IF [ebx].action==TVE_EXPAND
                INVOKE  get_path,tvis.itemex.hItem,ADDR buffer
                INVOKE  add_item_from_subdir,OFFSET szPath,[ebx].itemNew.hItem
            .ELSEIF [ebx].action==TVE_COLLAPSE
get_parents:    INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_PARENT,[ebx].itemNew.hItem
                mov     tvis.hParent,eax
                INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_PREVIOUS,[ebx].itemNew.hItem
                or      eax,eax
                jnz     @f
                mov     eax,TVI_FIRST
@@:             mov     tvis.hInsertAfter,eax
                INVOKE  SendMessage,hTreeView,TVM_DELETEITEM,0,[ebx].itemNew.hItem
                INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis
            .ENDIF
         .ELSEIF [ebx].itemNew.lParam==4448474ch        ;"LGHD"¦r¦ê
            .IF [ebx].action==TVE_EXPAND
                INVOKE  add_item_from_subdir,ADDR buffer,[ebx].itemNew.hItem
            .ELSEIF [ebx].action==TVE_COLLAPSE
                jmp     get_parents
            .ENDIF
         .ENDIF
      ;³B²z·Æ¹«©ì¦²°Ê§@¡A«Ø¥ß©ì¦²¹Ï¹³¡B«ü©w¼öÂI¡BÅã¥Ü©ì¦²¹Ï¹³¡B¨Ï¹ï¸Ü²°®·Àò·Æ¹«°T®§¡B³]©w²{¦b¥¿¶i¦æ©ì¦²°Ê§@
      .ELSEIF [ebx].hdr.code==TVN_BEGINDRAG
                INVOKE  SendMessage,hTreeView,TVM_CREATEDRAGIMAGE,0,[ebx].itemNew.hItem
                mov     hDragImage,eax
                INVOKE  ImageList_BeginDrag,hDragImage,0,0,0
                INVOKE  ImageList_DragEnter,hTreeView,[ebx].ptDrag.x,[ebx].ptDrag.y
                INVOKE  SetCapture,hDlg
                mov     DragMode,TRUE
      ;³B²zTVN_GETINFOTIP³qª¾½X¡A¨Ï¤u¨ã´£¥Ü¯à¨Ì¡u¹q¸£¤¤ªºµwºÐ¡v¡B¹êÅéºÏºÐ¡BÅÞ¿èºÏºÐ¡BÀɮשάO¤l¥Ø¿ý¦ÓÅã¥Ü¤£¦Pªº¤å¦r
      .ELSEIF [ebx].hdr.code==TVN_GETINFOTIP
                ASSUME  ebx:PTR NMTVGETINFOTIP
         .IF [ebx].lParam==504d5e43h
                mov     eax,OFFSET szThisIsCmputer
         .ELSEIF [ebx].lParam==4448474ch
                mov     eax,OFFSET szThisIsDrv
         .ELSEIF [ebx].lParam==44485946h
                mov     eax,OFFSET szThisIsDrv
         .ELSEIF [ebx].lParam==44425553h
                mov     eax,OFFSET szThisIsDir
         .ELSEIF [ebx].lParam==454c4946h
                mov     eax,OFFSET szThisIsFile
         .ELSE
                mov     eax,OFFSET szThisIsUnknown
         .ENDIF                      
                mov     [ebx].pszText,eax
                ;³]©w¾ðª¬À˵øªº¤lµøµ¡¡A¤u¨ã´£¥Ü¡Aªº­·®æ
                INVOKE  SendMessage,hTreeView,TVM_GETTOOLTIPS,0,0
                mov     hInfoTip,eax
                INVOKE  SendMessage,hInfoTip,TTM_SETTITLE,TTI_INFO,OFFSET szInfoTipTitle
                INVOKE  GetWindowLong,hInfoTip,GWL_STYLE
                or      eax,TTS_BALLOON or TTS_CLOSE
                INVOKE  SetWindowLong,hInfoTip,GWL_STYLE,eax
                INVOKE  SendMessage,hInfoTip,TTM_SETMAXTIPWIDTH,0,400
      ;³B²zTVN_BEGINLABELEDIT³qª¾½X¡A¸T¤î¨Ï¥ÎªÌ´N¦a½s¿è¡u¹q¸£¤¤ªºµwºÐ¡v¡B¡u¹êÅéºÏºÐ¡v¡B¡uÅÞ¿èºÏºÐ¡v¡A¦ý­ã³\½s¿èÀÉ®×
      ;©Î¤l¥Ø¿ý¡A¤£¹L¦³­­¨î¡A·s¦WºÙ¦b32¦ì¤¸²Õ¥H¤º
      .ELSEIF [ebx].hdr.code==TVN_BEGINLABELEDIT
                ASSUME  ebx:PTR NMTVDISPINFO
         .IF ([ebx].item.lParam==504d5e43h)||([ebx].item.lParam==4448474ch)||([ebx].item.lParam==44485946h)
                INVOKE  SetWindowLong,hDlg,DWL_MSGRESULT,TRUE
         .ELSE
                INVOKE  SendMessage,hTreeView,TVM_GETEDITCONTROL,0,0
                mov     hEdit,eax
                INVOKE  SendMessage,eax,EM_SETLIMITTEXT,20h,0
                INVOKE  SetWindowLong,hEdit,GWL_WNDPROC,OFFSET new_edit_proc
                mov     lpOldEditProc,eax
         .ENDIF
      ;³B²zTVN_ENDLABELEDIT³qª¾½X¡A­Y½s¿è®Ø¤ºµL¦r¤¸¡A«h«ì´_­ì¶µ¥Ø¦WºÙ¡F­Y¦³¦r¤¸¡A«h¥H½s¿è®Ø¤º®e¬°¶µ¥Ø·s¦WºÙ
      .ELSEIF [ebx].hdr.code==TVN_ENDLABELEDIT
                INVOKE  GetWindowTextLength,hEdit               ;EAX¡×½s¿è®Ø¤º¦r¤¸ªø«×
         .IF eax==0
                mov     ecx,FALSE
         .ELSE
                mov     ecx,TRUE
         .ENDIF
                INVOKE  SetWindowLong,hDlg,DWL_MSGRESULT,ecx
      ;³B²zTVN_KEYDOWN³qª¾½X¡A¶È³B²z¨Ï¥ÎªÌ«ö¤UF2Áä¡A¶i¦æ´N¦a½s¿è
      .ELSEIF [ebx].hdr.code==TVN_KEYDOWN
                ASSUME  ebx:PTR NMTVKEYDOWN
         .IF [ebx].wVKey==VK_F2
                INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_CARET,0
                INVOKE  SendMessage,hTreeView,TVM_EDITLABEL,0,eax
         .ENDIF
      .ENDIF
   .ENDIF
                pop     ebx
                ASSUME  ebx:NOTHING
 
.ELSEIF uMsg==WM_MOUSEMOVE
    .IF DragMode==TRUE
                mov     eax,lParam
                mov     ecx,eax
                and     eax,0ffffh
                shr     ecx,16
                sub     eax,dwCx
                sub     ecx,dwCy
                mov     tvhti.pt.x,eax
                mov     tvhti.pt.y,ecx
                INVOKE  ImageList_DragMove,eax,ecx
                INVOKE  ImageList_DragShowNolock,FALSE
                INVOKE  SendMessage,hTreeView,TVM_HITTEST,NULL,ADDR tvhti
         .IF eax!=NULL
                INVOKE  SendMessage,hTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,eax
         .ENDIF
                INVOKE  ImageList_DragShowNolock,TRUE
    .ENDIF
 
.ELSEIF uMsg==WM_LBUTTONUP
    .IF DragMode==TRUE
                INVOKE  ImageList_DragLeave,hTreeView
                INVOKE  ImageList_EndDrag
                INVOKE  ImageList_Destroy,hDragImage
                INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_DROPHILITE,0
                mov     tvis.itemex.hItem,eax
                INVOKE  SendMessage,hTreeView,TVM_SELECTITEM,TVGN_CARET,eax
                INVOKE  SendMessage,hTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,0
                INVOKE  ReleaseCapture
                mov     DragMode,FALSE
                mov     esi,OFFSET szCantDnDHere
                lea     edi,buffer
                mov     ecx,SIZEOF szCantDnDHere
                rep     movsb
                mov     tvis.itemex.imask,TVIF_TEXT
                mov     tvis.itemex.pszText,edi
                mov     tvis.itemex.cchTextMax,SIZEOF buffer-SIZEOF szCantDnDHere
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvis.itemex
                INVOKE  MessageBox,hTreeView,ADDR buffer,OFFSET szInfoTipTitle,MB_OK or MB_ICONERROR               
    .ENDIF
 
.ELSEIF uMsg==WM_CLOSE
                INVOKE  ImageList_Destroy,hImageList
                INVOKE  EndDialog,hDlg,NULL
 
.ELSE           ;¨ä¥L°T®§
                mov     eax,FALSE
                ret
.ENDIF
                mov     eax,TRUE
                ret
DlgProc         ENDP
;---------------------------------------------------------------------------------------------------
START:          INVOKE  GetModuleHandle,NULL
                mov     hInstance,eax
                INVOKE  DialogBoxParam,hInstance,OFFSET szDlgName,NULL,OFFSET DlgProc,NULL
                INVOKE  ExitProcess,eax
                INVOKE  InitCommonControls
;***************************************************************************************************
END             START

¥H¤å®Ñ³B²z³nÅé¡A¿é¤J¤W­±¤T­ÓÀɮסA¨Ã¦s¦¨¯Â¤å¦rÀÉ¡A¤U¸ü HDINFO2.RAR¡A¦¹À£ÁYÀɧt¦³©Ò»Ýªº¹Ï¥ÜÀÉ ( ¥]§t COMPUTER.ICO¡BFILE.ICO¡BFOLDER.ICO¡BHARDDISK.ICO »P OPENFLD.ICO ) ¤Î°ÊºA³sµ²µ{¦¡®w ( HD.DLL »P HD.LIB )¡A±N¨ä¸ÑÀ£ÁY«á¡A»P«e­±ªº¤T­Ó¯Â¤å¦rÀÉ©ñ¦b¦P¤@¥Ø¿ýùØ¡CµM«á¿é¤J¤U­±«ü¥O¡G

E:\HomePage\SOURCE\Win32\HD_Info>rc hdinfo2.rc [Enter]

E:\HomePage\SOURCE\Win32\HD_Info>ml hdinfo2.asm /link hdinfo2.res [Enter]
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: hdinfo2.asm

***********
ASCII build
***********

Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/SUBSYSTEM:WINDOWS
"hdinfo2.obj"
"/OUT:hdinfo2.exe"
"hdinfo2.res"

E:\HomePage\SOURCE\Win32\HD_Info>

³o¼Ë´N¥i¥H²£¥Í HDINFO2.EXE ¤F¡C


¸Ñ»¡ HDINFO2.ASM

HDINFO2 ¤¤¡A¦b¾ðª¬À˵ø¥[¤J¡u¹q¸£¤¤ªºµwºÐ¡v§@¬°®Ú¶µ¥Ø¡B¡u¹êÅéºÏºÐ¡v§@¬°¤l¶µ¥Ø¡B¡uÅÞ¿èºÏºÐ¡v§@¬°®]¶µ¥Ø

Æ[¹î¨Ã¾ã²z HDINFO2 ¾ðª¬À˵øªº¶µ¥Ø¡A¤À¬°¤­ºØ¡G¡u¹q¸£¤¤ªºµwºÐ¡v¡B¡u¹êÅéºÏºÐ¡v¡B¡uÅÞ¿èºÏºÐ¡v¡B¡u¥Ø¿ý¡v»P¡uÀɮסv¡A«e­±¤TºØ¦b HDINFO2 °õ¦æ«á´N¥Ñ WM_INITDIALOG °T®§¤¤¥[¤J¨ì¾ðª¬À˵øùØ¡C²K¥[¡u¹q¸£¤¤ªºµwºÐ¡v¨ì¾ðª¬À˵øùا@¬°®Ú¶µ¥Øªºµ{¦¡¤ù¬q¦b²Ä 390¡ã400 ¦æ¡A¨Ã¨Ï¨ä¶µ¥Ø¥N½X«O¦s¦b hComputer ùØ¡C­È±o¤@´£ªº¬O¦b TVINSERTSTRUCT ¤¤ªº TVITEM µ²ºcÅ餤³]©w¤F lParam Äæ¦ì¬° 504d5e43h¡A¥ç§Y¡uCOMP¡v¦r¦ê¡C³]©wªº­ì¦]¬O¬°¤Fµ{¦¡¤è«K°Ï¤À¤W­z¤­ºØ¶µ¥Ø¡A¦]¦¹¨ä¥Lªº¶µ¥Ø¡G¡u¹êÅéºÏºÐ¡v¡B¡uÅÞ¿èºÏºÐ¡v¡B¡u¥Ø¿ý¡v»P¡uÀɮסv¡A¤]³£³]©w¤F lParam¡A¤À§O¬° 44485946h (¡uFYHD¡v¦r¦ê )¡B4448474ch (¡uLGHD¡v¦r¦ê )¡B44425553h (¡uSUBD¡v¦r¦ê )¡B454c4946h (¡uFILE¡v¦r¦ê )¡C

¦Ü©ó¨ú±o¹q¸£¤ºªº¹êÅéºÏºÐ¡A¤Î¨C­Ó¹êÅéºÏºÐ³Q¤À­Ó¦¨­þ¨ÇÅÞ¿èºÏºÐªºµ{¦¡½X¦b²Ä 401¡ã406¡C©I¥s GetLogicalDriveFromPhysicalDrive ( °Ñ¦Òªþ¿ý¤» ) ¥iÀò±o¨C­Ó¹êÅéºÏºÐ§t¦³­þ¨ÇÅÞ¿èºÏºÐ¡A¨ä­ì«¬¬O¡G

        INVOKE  GetLogicalDriveFromPhysicalDrive,lpBuffer

¦pªG lpBuffer ¬° NULL¡A«h¨t²Î·|­pºâ¥X»Ý­n¦h¤Ö¦ì¤¸²Õ¡A¥H®e¯Ç¸ê®Æ¡C¦pªG lpBuffer ¬°¬Y­Ó¦ì§}¡A¨t²Î·|±N¸ê®Æ¶ñ¨ì lpBuffer ©Ò«üªº¦ì§}¡A®æ¦¡Ãþ¦ü©³¤Uªº¼Ë¤l¡G

00156D28  5C 5C 2E 5C 50 68 79 73 69 63 61 6C 44 72 69 76  \\.\PhysicalDriv
00156D38  65 30 00 43 3A 00 45 3A 00 48 3A 00 49 3A 00 5C  e0.C:.E:.H:.I:.\
00156D48  5C 2E 5C 50 68 79 73 69 63 61 6C 44 72 69 76 65  \.\PhysicalDrive
00156D58  31 00 46 3A 00 47 3A 00 4A 3A 00 5C 5C 2E 5C 50  1.F:.G:.J:.\\.\P
00156D68  68 79 73 69 63 61 6C 44 72 69 76 65 32 00 44 3A  hysicalDrive2.D:
00156D78  00 00                                            ..

µ{¦¡²Ä 407¡ã444 ¦æ¡A¨Ì¾Ú¤W­±ªº¸ê®Æ¡A§â¦U­Ó¹êÅéºÏºÐ¥[¤J¨ì¡u¹q¸£¤¤ªºµwºÐ¡v¤§¤U¡A§@¬°¨ä¤l¶µ¥Ø¡F¦A©ó¦U­Ó¹êÅéºÏºÐ¤§¤U¡A¥[¤J©Ò¤À³Î¥X¨ÓªºÅÞ¿èºÏºÐ¡A§@¬°¡u¹q¸£¤¤ªºµwºÐ¡vªº®]¶µ¥Ø¡C¨ì³oùØ¡AWM_INITDIALOG °T®§¤w³B²z§¹¦¨¡A¦b¾ðª¬À˵øùؤw²K¥[¤F¤T¼h¶µ¥Ø¡G¡u¹q¸£¤¤ªºµwºÐ¡v¡B¡u¹êÅéºÏºÐ¡v¡B¡uÅÞ¿èºÏºÐ¡v¡A³o¤T¼h¶µ¥Ø¡A¦b¥ô¦ó±¡§Î¤U¡A³£¤£·|³Q§R°£¡A¤]¤£·|¦A·s¼W¡C

³B²z TVN_ITEMEXPANDING ³qª¾½X¡A¥[¤JÀɮשΥؿý§@¬°¤l¶µ¥Ø¡A©Î§R°£¨ä¤l¶µ¥Ø

±µ¤U¨Ó¡A¥»À³¸Ó§â¦UÅÞ¿èºÏºÐ¤ºªº©Ò¦³ÀÉ®×»P¤l¥Ø¿ý¥[¤J¡A¦¨¬°ÅÞ¿èºÏºÐªº¤l¶µ¥Ø¡C¦ý³o¼Ë·|¦³°ÝÃD¡C²{¤µ ( ¤¤µØ¥Á°ê 103 ¦~¡A¦è¤¸ 2014 ¦~ ) ªºµwºÐ¤w¸g¥H TB ¬°³æ¦ì¡A¨ä¤º©Ò§tÀɮצh¦p¤û¤ò¡A¤£¥i³Ó¼Æ¡A¦]¦¹ HDINFO2 ¨Ã¤£¬O¤@¶}©l¡A´N§â©Ò¦³ÅÞ¿èºÏºÐ©³¤Uªº©Ò¦³ÀɮשM¤l¥Ø¿ý³£¥[¶i¨Ó¡A³o¼Ë¥i¯à«Ü¨S¦³®Ä²v¡C

¥ý»¡¤@¨Ç­I´ºª¾ÃÑ¡C·í¨Ï¥ÎªÌÂùÀ»¬Y­ÓÅÞ¿èºÏºÐ©Î¬Y­Ó¤l¥Ø¿ý¡A©ÎÂIÀ»¶µ¥Ø«eªº®É¡A¾ðª¬À˵ø·|§â TVN_ITEMEXPANDING ³qª¾½X¶Çµ¹¹ï¸Ü²°¨ç¦¡¡A³o®É­Ôªº NMTREEVIEW ªº action Äæ¦ì¥i¯à¬O TVE_EXPAND ©Î TVE_COLLAPSE¡A¤À§Oªí¥Ü±N­n®i¶}©Î¦¬Ãl¡C¤p¤ì°¸©Ò±Ä¥Îªº¤èªk¬O¡A¦pªG¬O TVE_EXPAND ¤~§â¸ÓÅÞ¿èºÏºÐ©Î¤l¥Ø¿ý¤ºªºÀɮשΧó¤U¤@¼hªº¤l¥Ø¿ý¥[¶i¨Ó¡F¦pªG¬O TVE_COLLAPSE ®É¡A«h§â¸ÓÅÞ¿èºÏºÐ©Î¸Ó¤l¥Ø¿ý¤Uªº¤l¶µ¥Ø²¾°£¡C¦]¬°¦pªG¶µ¥Ø³B©ó¦¬Ãl®É¡A§Y¨Ï¸Ó¶µ¥Ø¤U¦³³\¦h¤l¶µ¥Ø¡A¨Ï¥ÎªÌ¤´¬O¨£¤£µÛ¡A°®¯Ü§R°£¡Aµ¥¨ì­n®i¶}®É¡A¤~²K¥[¶i¥h¡C¦Ü©ó¡u¹q¸£¤¤ªºµwºÐ¡v¡B¡u¹êÅéºÏºÐ¡v©M¡uÅÞ¿èºÏºÐ¡v¡A«h¦]¼Æ¶q¤Ö¡A¦­¦b WM_INITDIALOG °T®§¤¤´N¤w¥[¤J¥B¤£§ó°Ê¡A©Ò¥H¤£¥²¦A³B²z¡C­Y¬O¨Ï¥ÎªÌÂùÀ»¬Y­ÓÀɮ׮ɡA¤]¦]¬°Àɮש³¤U¤£·|¦³¤l¥Ø¿ý©Î¨ä¥LªF¦è¡A¤]¤£³B²z¡C°ò©ó¥H¤W­ì¦]¡Aµ{¦¡²Ä 477¡ã509 ¦æ¡A³B²z TVN_ITEMEXPANDING ³qª¾½X®É¡A¶È¶È³B²zÅÞ¿èºÏºÐ©Î¤l¥Ø¿ýªº®i¶}¹Lµ{¡A¨£µ{¦¡²Ä 488 »P 503 ¦æªº .IF/ELSEIF «ü¥O¡AÀˬd TVITEM ªº lParam Äæ¦ì¡A¥H§PÂ_¬OÅÞ¿èºÏºÐÁÙ¬O¤l¥Ø¿ý¡C¾ã­Ó¬yµ{¦p¤U­±µ{¦¡¤ù¬q¡G

477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
      ;³B²zTVN_ITEMEXPANDING³qª¾½X¡A¥u¦³ÅÞ¿èºÏºÐ©Î¤l¥Ø¿ý®i¶}©Î¦¬Ãl®É¡A¤~»Ý³B²z¦¹³qª¾½X¡C·í®i¶}®É¡A»Ý¨ú±o¸Ó¥Ø¿ý¤º¦U
      ;ÀɮשΨ䤺ªº¤l¥Ø¿ý¬°¨ä¤l¶µ¥Ø¡C·í¦¬Ãl®É¡Aµo¥XTVM_DELETEITEM§R¥h¸Ó¶µ¥Ø¤Î¨ä¤Uªº©Ò¦³¤l¶µ¥Ø¡A¦ý³o¤£²Å¦X­n¨D¡A©Ò¥H
      ;ÁÙ±o§â¸Ó¶µ¥ØÁÙ­ì¡A¦]¦¹¥ý¨ú±o¸Ó¶µ¥Øªº¸ê®Æ¡B¦A§R°£¡B¦A¨Ì­è­è±o¨ìªº¸ê®Æ­«·s²K¥[¸Ó¶µ¥Ø
      .ELSEIF [ebx].hdr.code==TVN_ITEMEXPANDING
                mov     edx,[ebx].itemNew.hItem
                lea     eax,buffer
                mov     tvis.itemex.hItem,edx
                mov     tvis.itemex.imask,TVIF_TEXT or TVIF_PARAM or TVIF_SELECTEDIMAGE or TVIF_IMAGE or TVIF_CHILDREN
                mov     tvis.itemex.pszText,eax
                mov     tvis.itemex.cchTextMax,SIZEOF buffer
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvis.itemex    ;¨ú±o³Q¿ï©w¶µ¥Øªº¸ê®Æ¡A¦s©ótvis.itemex
         .IF [ebx].itemNew.lParam==44425553h            ;"SUBD"¦r¦ê
            .IF [ebx].action==TVE_EXPAND
                INVOKE  get_path,tvis.itemex.hItem,ADDR buffer
                INVOKE  add_item_from_subdir,OFFSET szPath,[ebx].itemNew.hItem
            .ELSEIF [ebx].action==TVE_COLLAPSE
get_parents:    INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_PARENT,[ebx].itemNew.hItem
                mov     tvis.hParent,eax
                INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_PREVIOUS,[ebx].itemNew.hItem
                or      eax,eax
                jnz     @f
                mov     eax,TVI_FIRST
@@:             mov     tvis.hInsertAfter,eax
                INVOKE  SendMessage,hTreeView,TVM_DELETEITEM,0,[ebx].itemNew.hItem
                INVOKE  SendMessage,hTreeView,TVM_INSERTITEM,0,ADDR tvis
            .ENDIF
         .ELSEIF [ebx].itemNew.lParam==4448474ch        ;"LGHD"¦r¦ê
            .IF [ebx].action==TVE_EXPAND
                INVOKE  add_item_from_subdir,ADDR buffer,[ebx].itemNew.hItem
            .ELSEIF [ebx].action==TVE_COLLAPSE
                jmp     get_parents
            .ENDIF
         .ENDIF

³B²zÅÞ¿èºÏºÐ©Î¤l¥Ø¿ýªº®i¶}¤è¦¡¬O¤£¦Pªº¡AÅÞ¿èºÏºÐªº¶µ¥Ø¦WºÙ¡A¥²©w¬O¹³¡uC:\¡v³o¼Ëªº¦r¦ê¡A¦]¦¹¥u­n¦b²Ä 481¡ã487 ¦æ¨ú±o¶µ¥Ø¦WºÙ§Y¥i ( §À³¡¦A¥[¤W¡u\¡v¤Î NULL ¦r¤¸ªº¹Lµ{¦b add_item_from_subdir °Æµ{¦¡¤@¶}©l )¡A´N¥i¥H©I¥s°Æµ{¦¡¡Aadd_item_from_subdir¡A¨ú±o¨ä¤UªºÀɮפΤl¥Ø¿ý°µ¬°ÅÞ¿èºÏºÐªº¤l¶µ¥Ø ( ²Ä 505 ¦æ )¡C¦ý¬O¦pªG¬O¤l¥Ø¿ýªº¸Ü¡A¶·¥ý¨ú±o§¹¾ãªº¸ô®|¦WºÙ¤~¯à¨ú±o¨ä¤UªºÀɮפΤl¥Ø¿ý¡A©Ò¥H¦b²Ä 490 ¦æ¡A­n¥ý©I¥s get_path °Æµ{¦¡¡A¦A©I¥s add_item_from_subdir °Æµ{¦¡¡C

·í¨Ï¥ÎªÌ¦¬Ãl¤l¥Ø¿ý®É¡A«h§R°£¨ä¤U©Ò¦³¤l¶µ¥Ø¡A¥i¥H¦V¾ðª¬À˵øµo¥X TVM_DELETEITEM °T®§¡C¦ý³o­Ó°T®§¡A¤£¶È¤l¶µ¥Ø·|³Q§R°£¡A³s¶µ¥Ø¥»¨­¤]·|¾D¨ì§R°£¡C¤p¤ì°¸±Ä¥Î·M²Âªº¤èªk¡A¥ý¨ú±o¶µ¥Ø¥»¨­ªº¸ê®Æ ( ²Ä 481¡ã487 )¡B¤÷¶µ¥Ø¥N½X ( ²Ä 493¡ã494 ¦æ ) ¥H¤Î¦P¤@¶¥¼hªº«e¤@­Ó¶µ¥Ø¥N½X ( ²Ä 495¡ã499 ¦æ ) ¡A¦A§R°£¶µ¥Ø¥»¨­¤Î¨ä¤U¤l¶µ¥Ø ( ²Ä 500 ¦æ )¡C±µµÛ¡A¦A·s¼W­ì¨Óªº¶µ¥Ø ( ²Ä 501 ¦æ )¡A³o®É TVINSERTSTRUCT ¤º­«­nÄæ¦ì³£¤w¬O¥ý¦s¦n¤F¡A©Ò¥H¦A·s²K­ì¶µ¥Ø¡A¨Ã«DÃø¨Æ¡C¹ï©ó¦¬ÃlÅÞ¿èºÏºÐªº¤èªk¡A§¹¥þ©M¤l¥Ø¿ý¬Û¦P¡A©Ò¥H¶È¶È¤@­Ó¸õÅD«ü¥O¡A¨ì get_parents: §Y¥i ( ²Ä 507 ¦æ )¡C

add_item_from_subdir °Æµ{¦¡¦b²Ä 109¡ã153 ¦æ¡A²Ä¤@­Ó°Ñ¼Æ¡ApDir¡A¬O¤l¥Ø¿ýªº§¹¾ã¸ô®|¦WºÙ¦ì§}¡Aµ{¦¡²Ä 117¡ã120 ¦æ±q pDir ©Ò«ü¦ì§}¤§³B¶}©l·j´M¡Aª½¨ì§ä¨ì¤l¥Ø¿ýªº§¹¾ã¸ô®|¦WºÙªºµ²§À¡AµM«á¦bµ²§À¤§³B¥[¤W¡u"\*.*",0¡v¤­­Ó¦ì¤¸²Õ¡C±µµÛ·j´M¦¹¤l¥Ø¿ý¤ºªº©Ò¦³ÀɮפΤl¥Ø¿ý¡A·j´M¤èªk¸ò¥H«e DOS ®É¥N¤@¼Ë¡A¥ý©I¥s FindFirstFile¡A§ä¨ì²Ä¤@­Ó²Å¦XªºÀɮסA¨t²Î·|±N¸ê®Æ¶ñ¤J WIN32_FIND_DATA µ²ºcÅ餺¡FµM«á¶i¤J°j°é¡A¨C°õ¦æ¤@¦¸¡A´N©I¥s FindNextFile¡A¨t²Î·j´M¤U¤@­Ó²Å¦XªºÀɮסA¤]·|§â¸ê®Æ¶ñ¤J WIN32_FIND_DATA µ²ºcÅ餺¡CWIN32_FIND_DATA µ²ºcÅ骺¦UÄæ¦ì¬O¡G

WIN32_FIND_DATA         STRUCT
dwFileAttributes        DWORD           ?               ;ÀÉ®×ÄÝ©Ê
ftCreationTime          FILETIME        <>              ;«ØÀɮɶ¡
ftLastAccessTime        FILETIME        <>              ;³Ì«á¦s¨ú®É¶¡
ftLastWriteTime         FILETIME        <>              ;³Ì«á¼g¤J®É¶¡
nFileSizeHigh           DWORD           ?               ;Àɮתø«×¡A°ª¦ì§}
nFileSizeLow            DWORD           ?               ;Àɮתø«×¡A§C¦ì§}
dwReserved0             DWORD           ?               ;«O¯dªºÄæ¦ì
dwReserved1             DWORD           ?               ;«O¯dªºÄæ¦ì
cFileName               BYTE            MAX_PATH DUP (?);¤£§t¸ô®|ªºÀɦW
cAlternateFileNa        BYTE            14 DUP (?)      ;µuÀɦW
WIN32_FIND_DATA         ENDS

¦b add_item_from_subdir °Æµ{¦¡ùØ¡AWIN32_FIND_DATA ­«­nªºÄæ¦ì¬O cFileName ©M dwFileAttributes¡CcFileName ¬OÀɦW¦r¦ê¡A§Q¥Î LEA ¨ú±o¨ä¦ì§} ( ²Ä 133 ¦æ )¡A¦A¶ñ¤J¨ì TVINSERTSTRUCT µ²ºcÅ骺 TVITEM ªº pszText Äæ¦ì ( ²Ä 135 ¦æ )¡C¦Ó dwFileAttributes «h¨M©w¦¹¶µ¥Ø¬OÀÉ®×ÁÙ¬O¥Ø¿ý ( ²Ä 141 ¦æ )¡A¦pªG¬O¥Ø¿ý«h°õ¦æ 143¡ã146¡A¿ï¾Ü¥Ø¿ýªº¹Ï¥Ü¡B³]©w lParam ¬°¡uSUBD¡v¦r¦êµ¥¡C¦pªG¤£¬O¥Ø¿ý¡A«h¿ï¾ÜÀɮ׹ϥܡB³]©w lParam ¬°¡uFILE¡v¦r¦êµ¥µ¥¡C

³B²z TVN_SELCHANGED ³qª¾½X¡A¨Ï³Q¿ï©wªº¶µ¥Ø¸ê®ÆÅã¥Ü¦bÀRºA±±¥ó¤W

HDINFO2 ­ì©lµ{¦¡ªº²Ä 453¡ã476 ¦æ¬O¥Î¨Ó³B²z TVN_SELCHANGED ³qª¾½X¡C·í¨Ï¥ÎªÌ¿ï¨ú¬Y­Ó¶µ¥Ø¦Ó¨Ï­ì¨Ó³Q¿ï¨úªº¶µ¥ØÅܧó«á¡A¨t²Î·|±N¦¹³qª¾½X¶Çµ¹µøµ¡¨ç¦¡¡Cµ{¦¡²Ä 456¡ã463 ¦æ¡A±N·s¿ï¨úªº¶µ¥Ø¦WºÙ¤Î lParam ¦s¤J buffer ¤Î tvis.itemex.lParam ùØ¡C¥»¨Óµo°e TVM_GETITEM °T®§¡A©Ò±o¨ìªº¶µ¥Ø¸ê®ÆÀ³¸Ó©ñ¦b TVITEM µ²ºcÅ餺¡A¤£¹L TVINSERTSTRUCT ¤º¤]§t¦³ TVITEM µ²ºcÅé¡A¦]¦¹³oùØ´N°½Ãi¤F¡A¨S¦³¥t¥~¦A©w¸q¤@­Óµ²ºcÅé¡A¦Óª½±µ¨Ï¥Î TVINSERTSTRUCT ùتº TVITEM ¤F ( ¨£²Ä 463 ¦æ )¡C©Ò±o¨ìªº lParam ¥Î¨Ó§PÂ_¸Ó¶µ¥ØÄÝ©ó­þ¤@Ãþ«¬¡A°Ñ¦Ò¤U­±ªº¬yµ{¡G

453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
      ;³B²zTVN_SELCHANGED³qª¾½X¡A·í¨Ï¥ÎªÌ¿ï©w¬Y­Ó¶µ¥Ø®É¡A¥ý¨ú±o¶µ¥Ø¦WºÙ¤ÎlParam¡A¥ÑlParam§PÂ_¸Ó¶µ¥Ø¬O¡u¹q¸£¤¤ªºµwºÐ¡v
      ;¡B¹êÅéºÏºÐ¡BÅÞ¿èºÏºÐ¡BÀÉ®×ÁÙ¬O¤l¥Ø¿ý¡C¦pªG¬O«e¥|ªÌ¡A«h¦bÀRºA±±¥óhStatic¤¤Åã¥Ü¤@¨Ç¸ê®Æ¡F§_«h¤£Åã¥Ü¸ê®Æ
      .IF [ebx].hdr.code==TVN_SELCHANGED
                ;¨ú±o³Q¿ï©w¶µ¥Øªº¦WºÙ»PlParam¡A¦s©ótvis.itemex
                mov     edx,[ebx].itemNew.hItem
                lea     eax,buffer
                mov     tvis.itemex.hItem,edx
                mov     tvis.itemex.imask,TVIF_TEXT or TVIF_PARAM
                mov     tvis.itemex.pszText,eax
                mov     tvis.itemex.cchTextMax,SIZEOF buffer
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvis.itemex
         .IF tvis.itemex.lParam==504d5e43h      ;"COMP"¦r¦ê
                mov     eax,OFFSET szRootItem
         .ELSEIF tvis.itemex.lParam==44485946h  ;"PHYHD"¦r¦ê
                INVOKE  get_phy_drv,ADDR buffer
         .ELSEIF tvis.itemex.lParam==4448474ch  ;"LGHD"¦r¦ê
                INVOKE  get_log_drv,ADDR buffer
         .ELSEIF tvis.itemex.lParam==454c4946h  ;"FILE"¦r¦ê¡A¥ý¨ú±o¸ÓÀɮתº§¹¾ã¸ô®|¡A¦A©I¥sget_file_infoÀò±o¸ê®Æ
                INVOKE  get_path,tvis.itemex.hItem,ADDR buffer
                call    get_file_info
         .ELSE
                mov     eax,OFFSET szIconFile+4 ;«ü¦VNULL¦r¦ê
         .ENDIF
                INVOKE  SetWindowText,hStatic,eax
  1. ¦pªG lParam ¬°¡u504d5e43h¡v¡Aªí¥Ü¡u¹q¸£¤¤ªºµwºÐ¡v¡A«h¨Ï EAX «ü¦V¡uszRootItem¡v¦r¦ê¤§¦ì§}¡C
  2. ¦pªG lParam ¬°¡u44485946h¡v¡Aªí¥Ü¹êÅéºÏºÐ¡A©I¥s get_phy_drv °Æµ{¦¡¡Aget_phy_drv ªð¦^®É¡AEAX ·|«ü¦V szInfo ¦r¦êªº¦ì§}¡A¦¹¦r¦ê§t¦³¹êÅéºÏºÐªº¸ê®Æ¡C
  3. ¦pªG lParam ¬°¡u4448474ch¡v¡Aªí¥ÜÅÞ¿èºÏºÐ¡A©I¥s get_log_drv °Æµ{¦¡¡Aget_log_drv ªð¦^®É¡AEAX ·|«ü¦V szInfo ¦r¦êªº¦ì§}¡A¦¹¦r¦ê§t¦³ÅÞ¿èºÏºÐªº¸ê®Æ¡C
  4. ¦pªG lParam ¬°¡u454c4946h¡v¡Aªí¥ÜÀɮסA¥ý©I¥s get_path °Æµ{¦¡¡A¥H¨ú±o§t¸ô®|ªº§¹¾ãÀɦW¡A¦A§â­è­è±o¨ìªº§¹¾ãÀɦW°µ¬°°Ñ¼Æ¡A©I¥s get_file_info¡Aªð¦^®É¡AEAX ·|«ü¦V szInfo ¦r¦êªº¦ì§}¡A¦¹¦r¦ê§t¦³ÅÞ¿èºÏºÐªº¸ê®Æ¡C
  5. ¦pªG lParam ¬°¡u44425553h¡v¡Aªí¥Ü¥Ø¿ý¡AEAX «ü¦VNULL¦r¦ê¡C

³o¨Ç¬yµ{¤À¦¨¤W­±¤­ºØ±¡§Î¡AHDINFO2 ¥H²Ä 464¡ã475 ¦æªº .IF/.ELSEIF/.ELSE/.ENDIF §PÂ_¤À¤ä¡A¨C¤@ºØ±¡§Î³Ì«á³£¨Ï­n¦bÀRºA±±¥ó¤WÅã¥Üªº¦r¦ê¦ì§}¡A¦s©ó EAX¡C³Ì«á 476 ¦æ¡A©I¥s SetWindowText¡A§â EAX ©Ò«ü¦ì§}ªº¦r¦êÅã¥Ü¦bÀRºA±±¥ó¤W¡C©³¤U»¡©ú³o¤­ºØ¤£¦PÃþ«¬ªº¶µ¥Ø³B²z¤è¦¡¡G

①¹q¸£¤¤ªºµwºÐ

µ{¦¡²Ä 465 ¦æ¡A¨Ï EAX «ü¦V¡uszRootItem¡v¦r¦ê¤§¦ì§}§Y¥i¡C

②¹êÅéºÏºÐ

¦b²Ä 461 ¦æ¨ú±o¶µ¥Ø¦WºÙ¡A³o¶µ¥Ø¦WºÙÃþ¦ü¡u"¹êÅéºÏºÐ X",0¡vªº¦r¦ê¡A¨ä¤¤ªº¡uX¡v´N¬O²Ä´X­Ó¹êÅéºÏºÐ¡CHDINFO2 §â¶µ¥Ø¦WºÙ·í¦¨¦r¦ê¡A§â¦¹¦r¦ê¦ì§}¶Çµ¹ get_phy_drv °Æµ{¦¡¡Cget_phy_drv ùتº²Ä 320¡ã327 ¦æ¡A´N¬O§ä¨ì²Ä´X­Ó¹êÅéºÏºÐ¡A¦A§â¥¦¦s¨ì¡u"\\.\PhysicalDriveX",0¡v¦r¦êªº¡uX¡v³B¡C¡u"\\.\PhysicalDriveX",0¡v¦r¦ê¬O«Ý·|­n©I¥s CreateFile ¥Î¨ìªº¡CCreateFile ¨Ã¤£¬O¶È¶È¯à«Ø¥ß©Î¶}±ÒÀɮסAÁÙ¯à¶}±Ò¹êÅéºÏºÐ©ÎÅÞ¿èºÏºÐ¡A½Ð°Ñ¦Òªþ¿ý¤»¡A¦³Ãö CreateFile ¥H¤Î DeviceIoControl ªº»¡©ú¡C³o¨â­Ó API ¯àÀ° get_phy_drv ¨ú±o¹êÅéºÏºÐªº¸ê®Æ¡A¨£ HDINFO2.ASM ªº²Ä 331¡ã335 ¦æ¡Cget_phy_drv ³Ñ¤U­n°µªº´N¬O¸g¥Ñ wsprintf §â¹êÅéºÏºÐªººÏ¬W¼Æ¡BºÏÀY¼Æ¡B¨CºÏ­yªººÏ°Ï¼Æ¡B¨CºÏ°Ï¦ì¤¸²Õ¼Æ¡BºÏºÐ®e¶qÅܦ¨¦r¦ê¡A¦s¨ì szInfo ¦r¦êùØ¡C¨£ HDINFO2 ²Ä 336¡ã346 ¦æ¡C

③ÅÞ¿èºÏºÐ

©M¹êÅéºÏºÐªº±¡§Î®t¤£¦h¡A§â¤w¸g¨ú±oªº¶µ¥Ø¦WºÙ¦ì§}¶Çµ¹ get_log_drv¡C¤£¹L¶µ¥Ø¦WºÙ¬OÃþ¦ü¡u"C:",0¡vªº¼Ë¤l¡A¦Ó©I¥s GetDiskFreeSpaceEx ¥²¶·¨Ï¥Î¡u"C:\",0¡vªº¦r¦ê¡A¦]¦¹ HDINFO2 ªº²Ä 285¡ã286 ¦æ°µ¤F³o¶µ§ïÅÜ¡CGetDiskFreeSpaceEx ªº­ì«¬¬O¡G

        INVOKE  GetDiskFreeSpaceEx,lpDirectoryName,lpFreeBytesAvailable,lpTotalNumberOfBytes,lpTotalNumberOfFreeBytes

GetDiskFreeSpaceEx ¯àÀò±oÅÞ¿èºÏºÐªº¥i¥Î¤j¤p¡B¥þ³¡¤j¤p¡B³Ñ¾l¤j¤p¡C²Ä¤@­Ó°Ñ¼Æ¡AlpDirectoryName¡A¬O¥Ø¿ý¦WºÙªº¦ì§}¡A¨Ò¦p¡u"C:\",0¡v¡A¦pªG¦¹°Ñ¼Æ¬° 0¡A«h¨Ï¥Î²{¦bºÏºÐªº®Ú¥Ø¿ý¡ClpFreeBytesAvailable¡BlpTotalNumberOfBytes¡BlpTotalNumberOfFreeBytes §¡¬°¦ì§}«ü¼Ð¡A¤À§O«ü¦V 64 ¦ì¤¸ªº¥¿¾ã¼Æ¡A¤À§O¥Nªí¨Ï¥ÎªÌ¥i¥Î¤j¤p¡BºÏºÐ¥þ³¡¤j¤p¡B³Ñ¾l¤j¤p¡A³æ¦ì§¡¬°¦ì¤¸²Õ¡C¦]¬°¨C­Ó¨Ï¥ÎªÌ°õ¦æ®É¡AÅv­­¤£¦P¡A¦]¦¹¨Ï¥ÎªÌ¥i¥Î¤j¤p¨Ã¤£¤@©wµ¥©ó³Ñ¾l¤j¤p¡C¤]¦]¦p¦¹¡A¨Ï¥ÎªÌ¤]»Ý­n¹ï lpDirectoryName ©Ò«ü¦Vªº¥Ø¿ý¨ã¦³ FILE_LIST_DIRECTORY ªºÅv­­¤~¥i¥H¡C¦pªG©I¥s¦¨¥\¡A¶Ç¦^«D¹s­È¡F¦pªG¥¢±Ñ¡A¶Ç¦^ 0¡A¥i©I¥s GetLastError ±o¨ì¿ù»~½X¡C

¥t¥~ lpFreeBytesAvailable¡BlpTotalNumberOfBytes¡BlpTotalNumberOfFreeBytes §¡«ü¦V 64 ¦ì¤¸ªº¾ã¼Æ¡A¨Ï¥Î¤è¦¡¦p¤U¡G

281
282
283
284
285
286
287
get_log_drv     PROC    USES ebx pLogHdName:LPSTR
                LOCAL   hAvailable,lAvailable:DWORD
                LOCAL   hTotal,lTotal:DWORD
                LOCAL   hFree,lFree:DWORD
                mov     eax,pLogHdName
                mov     WORD PTR [eax+2],5ch    ;§ï¦¨¡u"C:\",0¡v¦r¦ê
                INVOKE  GetDiskFreeSpaceEx,pLogHdName,ADDR lAvailable,ADDR lTotal,ADDR lFree
¦b²Ä 282¡ã284 ¦æ¤À§O©w¸q¤F¤T²ÕÅܼơA¨C¤@²Õ³£¬O¥Ñ¨â­ÓÂù¦r²Õ©Òºc¦¨ ( Âù¦r²Õ¬O double word¡A¤j¤p¬O 32 ¦ì¤¸¡A¨â­ÓÂù¦r²Õ´N¬O 64 ¦ì¤¸ )¡A¥Î¨Ó±µ¦¬ GetDiskFreeSpaceEx ¶Ç¨Óªº 64 ¦ì¤¸¸ê®Æ¡C¥HºÏºÐ¥þ³¡¤j¤p¬°¨Ò¡AGetDiskFreeSpaceEx ·|§âºÏºÐ¥þ³¡¤j¤p¦s¨ì hTotal¡BlTotal ùØ¡AhTotal ©M lTotal ¤À§O¬O¦ì§}¸û°ªªºÂù¦r²Õ©M¸û§CªºÂù¦r²Õ¡A¦Ó GetDiskFreeSpaceEx ªº²Ä¤T­Ó°Ñ¼Æ¡A¥u»Ý­n«ü¦V¨ì¸û§CªºÂù¦r²Õ¦ì§}¡AGetDiskFreeSpaceEx ·|¦Û¦æ§â¦ì§}¸û°ªªº hTotal ¶ñ¦n¡A¨£²Ä 287 ¦æ¡C

④ÀÉ®×

­n±o¨ì¬Y­ÓÀɮתº¸ê®Æ¡A¤@©w±oª¾¹D³o­ÓÀɮתº§¹¾ãÀɦW¡A³o¸Ì©Ò¿×ªº§¹¾ãÀɦW«üªº¬O¥]§t¸ô®|ªº¦WºÙ¡A¨Ò¦p¡uC:\WINDOWS\NOTEPAD.EXE¡v´N¬O§¹¾ãªºÀɦW¡A¨ä¤¤¡uNOTEPAD.EXE¡v¬OÀɦW¡A¦b¡u.¡v¥ªÃ䪺¡uNOTEPAD¡v¬O¥DÀɦW¡A¡uEXE¡v¬O°ÆÀɦW¡A¡uC:\WINDOWS\¡v¬°¸ô®|¦W¡C¦Ó HDINFO2 ªº¾ðª¬À˵øùØ¡A¿ï¨ú¬Y­Ó¶µ¥Ø¡A¥u¯à±o¨ìÀɦW¡A¤£¯à±o¨ì¸ô®|¦WºÙ¡A¦]¦¹²Ä 470 ¦æ½T©w¨Ï¥ÎªÌ¿ï¨úªº¶µ¥Ø¬OÀɮ׫á¡A«K©ó 471 ¦æ©I¥s get_path ±o¨ì¸ô®|¦W¡Cget_path ·|¥h­pºâ¦UÞ𪺶µ¥Ø¦WºÙ¡A³Ì«á§â§¹¾ãÀɦW°O¿ý©ó szPath ¦r¦êùØ¡C

­è¶i¤J get_path °Æµ{¦¡®É¡A177¡ã185 ¦æ¬O§â¶µ¥Ø¦WºÙ²¾¨ì szFullname ¦r¦êªº³Ì°ª¦ì§}¡CszFullname ¬O¤@­Ó 512 ¦ì¤¸²Õªøªº¦r¦ê¡A·í¨Ï¥ÎªÌ¿ï©w¶µ¥Ø®É¡AHDINFO2 ¤W¤£ª¾¹D«e­±¸ô®|¦³¦h¤Ö¡A¦]¦¹¥ý§â«e­±§C¦ì§}ªº¦a¤è¯dµ¹¸ô®|¦W¡A³Ì«á°ª¦ì§}¯dµ¹ÀɦW¡C²Ä 179 ¦æ©I¥s get_len ´N¬O¥Î¨Ó­pºâ¶µ¥Ø¦WºÙ¦³¦h¤Ö¦ì¤¸²Õ¡A¦s©ó ECX «áªð¦^¡AµM«á§â szFullname ¤§¦ì§}¥[¤W szFullname ¤j¤p ( ²Ä 182 ¦æ )¡A¦A´î¥h ECX ( ²Ä 183 ¦æ )¡A´N¥i¥Hª¾¹D¶µ¥Ø¦WºÙÀ³¸Ó¥Ñ szFullname ¦r¦êªº­þ¤@­Ó¦ì§}¶}©l¶ñ¤J¡A³Ì«á¥H¡urep movsb¡v«ü¥O²¾°Ê¶µ¥Ø¦WºÙ§Y¥i¡C°Ñ¦Ò¤U­±µ{¦¡½X¡G

165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
;¨ú±o¬Y¶µ¥Øªº¸ô®|¦WºÙ¡A¦s©ószPath¦r¦êùØ
;¿é¤J¡GhItm¡Ð¬Y¶µ¥Øªº¥N½X
;¡@¡@¡@pName¡Ð¬Y¶µ¥Øªº¦WºÙ©Ò¦b¦ì§}
get_path        PROC    USES ebx esi edi hItm:HTREEITEM,pName:LPSTR
                LOCAL   pFullname:LPSTR
                LOCAL   tvi:TVITEM
                LOCAL   buffer[MAX_PATH]:BYTE
                LOCAL   szFullname[512]:BYTE
                cld
                mov     edx,hItm
                mov     tvi.lParam,0
                mov     tvi.hItem,edx
            ;§â¿ï©w¶µ¥Ø¦WºÙ²¾¨ìszFullname³Ì°ª¦ì§}¡A¥ç§Y¦r¦ê³Ì«á­±
                mov     edi,pName
                call    get_len
                lea     edi,szFullname
                mov     esi,pName
                add     edi,SIZEOF szFullname
                sub     edi,ecx
                mov     pFullname,edi
                rep     movsb
²Ä 184 ¦æªº pFullname ¬O¥Î¨Ó°O¿ý¨C­Ó¥Ø¿ý¦WºÙ¡AÀ³±q szFullname ¦r¦êªº­þ­Ó¦ì§}¶}©l¶ñ¤J¡A¦ý¤£¬O¥Ñ szFullname ªº¬Û¹ï°_©l¦ì§}ºâ°_¡A¦Ó¬O¡uµ´¹ï¡v¦ì§}¡C¨C©¹¤W¤@¼h¶µ¥Ø¡ApFullname ´N·|´î±¼¶µ¥Ø¦WºÙªºªø«×¡C¤£¹L¤@¶}©l¡ApFullname ¬O«ü¦V szFullname ¿ï©w¶µ¥Øªº¦ì§} ( ²Ä 184 ¦æ )¡C

±µ¤U¨Ó¶i¤J¤@­Ó°j°é ( ²Ä 186¡ã205 ¦æ )¡C³o­Ó°j°é¡A¨C¦¸°õ¦æ®É¡A¥ý¨ú±o¤÷¶µ¥Øªº¥N½X ( ²Ä 188 ¦æ )¡AµM«á¨Ì¥N½X¨ú±o¤÷¶µ¥Øªº¦WºÙ ( ²Ä 189¡ã195 ¦æ )¡A¦s©ó buffer ¦r¦ê ( ²Ä 189¡B192 ¦æ )¡A¦A©I¥s get_len ­pºâ¦WºÙªø«× ( ²Ä 196¡ã198 ¦æ )¡A¨M©w­n²¾¨ì szFullname ªº­þ¤@­Ó¦ì§} ( ²Ä 199¡ã200 ¦æ )¡A°O¿ý¦b pFullname «á ( ²Ä 202 ¦æ )¡A³Ì«á¦A§â¤÷¶µ¥Ø¦WºÙ²¾¨ì¦¹¦ì§}¤W ( ²Ä 203 ¦æ ) ¨Ã¥[¤W¡u\¡v¡A§@¬°¥Ø¿ý»P¥Ø¿ý¤§¶¡ªº¤À¹j°O¸¹ ( ²Ä 204 ¦æ )¡C³o­Ó°j°é±N¤@ª½°õ¦æ¡Aª½¨ì¬Y­Ó¤÷¶µ¥Ø¬OÅÞ¿èºÏºÐ¬°¤î¡A­nÀˬdÅÞ¿èºÏºÐ¡A¥i¥HÀˬd¶µ¥Øªº lParam¡A¦pªG¬O 4448474CH ( 4448474CH ªº ASCII ½X´«¦¨­^¤å¦r¥À´N¬O¡uLGHD¡v¦r¦ê )¡A´N¬OÅÞ¿èºÏºÐ¡C¦p¤U¡G

186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
        .WHILE tvi.lParam!=4448474ch    ;"LGHD"¦r¦ê
            ;¨ú±o¤÷¶µ¥Ø¥N½X
                INVOKE  SendMessage,hTreeView,TVM_GETNEXTITEM,TVGN_PARENT,tvi.hItem
                lea     edx,buffer
                mov     tvi.imask,TVIF_TEXT or TVIF_HANDLE or TVIF_PARAM
                mov     tvi.hItem,eax
                mov     tvi.pszText,edx
                mov     tvi.cchTextMax,SIZEOF buffer
            ;¨ú±o¤÷¶µ¥Ø¦WºÙ
                INVOKE  SendMessage,hTreeView,TVM_GETITEM,0,ADDR tvi
                lea     edi,buffer
                mov     ecx,MAX_PATH
                call    get_len
                mov     edi,pFullname
                sub     edi,ecx
                lea     esi,buffer
                mov     pFullname,edi
                rep     movsb
                mov     BYTE PTR [edi-1],'\'
        .ENDW

get_path ªº³Ì«á´X¦æ¡A¬O§â¦s¦b szFullname ¦r¦êùتº§¹¾ãÀɦW²¾¨ì szPath ùØ¡C¦b szFullname ¦r¦êùتº§¹¾ãÀɦW¹ê»Ú¤W¤£¤@©w¬O±q szFullname ©Ò¦b¦ì§}¤@¶}©l¦s©ñ¡A¨ä¦s©ñ¦ì§}¬O°O¿ý¦b pFullname ÅܼÆùØ¡C²Ä 207 ¦æ´N¬O¨ú±o§¹¾ãÀɦWªº¯u¥¿¦s©ñ¦ì§}¡C¦Ü©ó§¹¾ãÀɦWªºªø«×¡A«h¬O°O¿ý¦b ECX ùØ¡A¥¦¬O¥Ñ szFullname ªº³Ì«á¦ì§}´î¥h§¹¾ãÀɦWªº¯u¥¿¦s©ñ¦ì§} ( ²Ä 206¡B208¡B210 ¤T¦æ )¡Cµ{¦¡½X¦p¤U¡G

206
207
208
209
210
211
212
213
                lea     ecx,szFullname
                mov     esi,pFullname
                add     ecx,512
                mov     edi,OFFSET szPath
                sub     ecx,esi
                rep     movsb
                ret
get_path        ENDP
¨ú±o§¹¾ãÀɦW«á¡A§Y¥iªð¦^¹ï¸Ü²°¨ç¦¡¡C±µµÛ°õ¦æ²Ä 472 ¦æ©I¥s get_file_info °Æµ{¦¡¡A±o¨ìÀɮ׸ê®Æ¡A¥]§tÀɮפj¤p»PÀɮ׫إ߮ɶ¡¡B³Ìªñ­×§ï®É¶¡¡B³Ìªñ¦s¨ú®É¶¡¡C

¦b Win32 ¨t²ÎùØ¡A­nÀò±oÀɮ׫إ߮ɶ¡¡B³Ìªñ­×§ï®É¶¡¡B³Ìªñ¦s¨ú®É¶¡¡A¥i¥H©I¥s GetFileTime¡BGetFileInformationByHandle µ¥ Win32 API¡A©³¤U¬O GetFileTime API ªº­ì«¬¡G

        INVOKE  GetFileTime,hFile,lpCreationTime,lpLastAccessTime,lpLastWriteTime

GetFileTime ªº«á¤T­Ó°Ñ¼Æ¡AlpCreationTime¡BlpLastAccessTime¡BlpLastWriteTime ¤À§O¬O hFile ©Ò¥NªíÀɮתº«Ø¥ß®É¶¡¡B³Ìªñ¦s¨ú®É¶¡¡B³Ìªñ­×§ï®É¶¡¡A¤TªÌ§¡¬°¤@­Ó¦ì§}«ü¼Ð¡A«ü¦V¤@­ÓºÙ¬° FILETIME µ²ºcÅé¡A¦¹Äæ¦ìÀx¦s¤FÀɮ׮ɶ¡¡A¦³Ãö FILETIME µ²ºcÅ骺¸Ô²Ó»¡©ú¡A½Ð°Ñ¦Òªþ¿ý¤C FILETIME ªº»¡©ú¡C¦ý¬O¦b HDINFO2 ùØ¡A°£¤F­n±o¨ìÀɮ׮ɶ¡¥~¡AÁÙ·QÀò±o¨ä¥L¸ê®Æ¡A¦pÀɮפj¤p¡BÄݩʵ¥¡A¦]¦¹¶È©I¥s GetFileTime ¬O¤£°÷ªº¡C©Ò¥H¤p¤ì°¸¦b HDINFO2 ùØ©I¥s GetFileInformationByHandle ¦Ó¤£¬O GetFileTime¡A¥HÀò±oÀɮ׸û¦hªº¸ê®Æ¡AGetFileInformationByHandle ªº­ì«¬¬O¡G

        INVOKE  GetFileInformationByHandle,hFile,lpFileInformation

©I¥s GetFileInformationByHandle «e¡A¶·©ó hFile «ü©wÀÉ®×¥N½X¡A¨Ã±N lpFileInformation ¶ñ¦n¡ClpFileInformation °Ñ¼Æ¬O¤@­Ó«ü¦V BY_HANDLE_FILE_INFORMATION µ²ºcÅ骺¦ì§}«ü¼Ð¡A©I¥s§¹¦¨«á¨t²Î·|©ó¦¹¦ì§}¶ñ¤J hFile ªº¸ê®Æ¡ABY_HANDLE_FILE_INFORMATION ªºÄæ¦ì¬O¡G

BY_HANDLE_FILE_INFORMATION      STRUCT
dwFileAttributes                DWORD           ?
ftCreationTime                  FILETIME        <>
ftLastAccessTime                FILETIME        <>
ftLastWriteTime                 FILETIME        <>
dwVolumeSerialNumber            DWORD           ?
nFileSizeHigh                   DWORD           ?
nFileSizeLow                    DWORD           ?
nNumberOfLinks                  DWORD           ?
nFileIndexHigh                  DWORD           ?
nFileIndexLow                   DWORD           ?
BY_HANDLE_FILE_INFORMATION      ENDS

©³¤U»¡©ú BY_HANDLE_FILE_INFORMATION ªº¦UÄæ¦ì¡G

⑤¥Ø¿ý

¦pªG¬O¥Ø¿ý¡A«hª½±µ«ü¦VªÅ¦r¦ê¡A¨ÏÀRºAªÅ¥ó¨S¦³¸ê®Æ¥iÅã¥Ü¡C( ·íµM¡A¦pªG­nÅã¥Ü¥Ø¿ýªº¸ê®Æ¡A¤]¤£¬O°µ¤£¨ì¡A½Ð°Ñ¦Òªþ¿ý¤Cªþµù¡G¥Ø¿ýªº®É¶¡ )


¨ì²Ä¤G¤Q¤T³¹¡A ¦^¨ì­º­¶¡A¨ì²Ä¤G¤Q¤­³¹