版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、樹型視圖控件詳解 本課中,我們將學(xué)習(xí)如何使用樹型視圖控件。另外還要學(xué)習(xí)如何在樹型視圖中完成拖-拉動作,以及如何使用圖象列表。 理論:樹型視圖是一種特別的窗口,我們可以使用它一目了然地表示某種層次關(guān)系。譬如象在資源管理器中左邊窗口中的就是樹型視圖。您可以調(diào)用CreateWindowEx來創(chuàng)建樹型視圖,傳遞一個類名“SysTreeView32”,或者您也可以把它放到一個對話框中去。不要忘了在您的代碼中加入InitCommonControls函數(shù)。 樹型視圖有幾種特有的風(fēng)格。下面是幾種經(jīng)常使用的。 TVS_HASBUTTONS = 在父項目中顯示(+)或(-)。用戶可以通過點擊該符號來展開或收起該父
2、項目下的子項目。如果想在根目錄下也有這個符號必須指定TVS_LINESATROOT風(fēng)格。TVS_HASLINES = 在層次中用線條來連接各個項目名稱。 TVS_LINESATROOT = 在根目錄下的項目也用線連接。如果沒有指定TVS_HASLINES風(fēng)格,該風(fēng)格也就會被忽略。 像其它的通用控件一樣,樹型視圖用消息來完成通信。父窗口發(fā)送一系列的消息給樹型視圖,而樹型視圖發(fā)送notification消息給它的父窗口。在這方面,樹型視圖和其它的通用控制沒什么兩樣。當(dāng)有事件發(fā)生時,樹型視圖發(fā)送一個WM_NOTIFY消息個父窗口,并在消息中附帶傳遞一些附加信息。 WM_NOTIFY wParam =
3、控件的ID。因為該值不是唯一的,故我們不用它。我們使用NMHDR結(jié)構(gòu)體中的hwndFrom或IDFrom成員變量。lParam = 指向NMHDR結(jié)構(gòu)體的指針。有一些控件可能傳遞一個指向更大一點的結(jié)構(gòu)體的指針。但該結(jié)構(gòu)體必須保證它的第一個成員變量是一個NMHDR型的變量。這樣,您在處理lParam變量時,至少可以得到一個NMHDR型的變量。 下面我們來看NMHDR: NMHDR struct DWORD hwndFrom DWORD ? idFrom DWORD ? code DWORD ? NMHDR ends hwndFrom是發(fā)送WM_NOTIFY消息的控件的窗口句柄。idFrom是發(fā)送
4、WM_NOTIFY消息的控件的ID。 code是控件發(fā)送給父窗口的數(shù)據(jù)。樹型視圖發(fā)送給父窗口的通知消息以TVN_打頭。 樹型視圖接收到的消息以TVM_打頭,譬如:TVM_CREATEDRAGIMAGE。 樹型視圖發(fā)送TVN_XXX消息時在code變量中放入NMHDR型變量。父窗口發(fā)送TVM_消息來控制樹型視圖。 在樹型視圖中加入項目在創(chuàng)建完樹型視圖后可以通過發(fā)送TVM_INSERTITEM消息往其中加入項目了。 TVM_INSERTITEM wParam = 0; lParam = 指向結(jié)構(gòu)體TV_INSERTSTRUCT的指針; 您應(yīng)當(dāng)知道一些關(guān)于樹型視圖中的項目之間關(guān)系的一些術(shù)語。 一個項
5、目可能是一個父親、兒子或兩者都是。父項目下含有子項目,而該父項目又有可能是其它項目的子項目。一個沒有父項目的項目叫根項目。在樹型視圖中可能有多個根項目?,F(xiàn)在我們來看看TV_INSERTSTRUCT結(jié)構(gòu)體:TV_INSERTSTRUCT STRUCT DWORD hParent DWORD ? hInsertAfter DWORD ? ITEMTYPE TV_INSERTSTRUCT ENDS hParent = 父項目的句柄。如果該值為TVI_ROOT value或NULL,該項目插在樹型視圖的根部。hInsertAfter = 應(yīng)該插入在起后面的項目的句柄或下面的值: TVI_FIRST =
6、 插在列表的頭部。 TVI_LAST = 插在列表的尾部。 TVI_SORT = 按字母順序插入。 ITEMTYPE UNION itemex TVITEMEX item TVITEM ITEMTYPE ENDS 我們僅使用TVITEM。 TV_ITEM STRUCT DWORD imask DWORD ? hItem DWORD ? state DWORD ? stateMask DWORD ? pszText DWORD ? cchTextMax DWORD ? iImage DWORD ? iSelectedImage DWORD ? cChildren DWORD ? lParam D
7、WORD ? TV_ITEM ENDS 該結(jié)構(gòu)體根據(jù)消息類型,用來發(fā)送或接收關(guān)于一個樹型視圖的項目的有關(guān)信息。譬如:對于消息TVM_INSERTITEM,它用來指定插入樹型視圖控件的項目的屬性。而對于消息TVM_GETITEM,該結(jié)構(gòu)體用來填充關(guān)于選定項目的信息。imask 用來指定TV_ITEM的那些成員變量有效。譬如,如果指定了TVIF_TEXT,這意味著pszText成員變量是有效的。您可以同時指定幾個標(biāo)志位。hItem 是樹型視圖項目的句柄。每一個項目都有它自己的句柄,就像窗口一樣。如果您想要操作一個項目,就必須選擇它的句柄。pszText 是一個字符串指針。它是項目的標(biāo)簽名。cchT
8、extMax僅在查詢項目的名稱時使用。由于在pszText中指定了指針,WINDOWS還要知道該緩沖去的大小。所以您必須給出該值。iImage 和 iSelectedImage用來指定圖象列表以及一個索引號。這樣就知道當(dāng)項目被選中或沒被選中時用哪個圖象來表示該項目。像資源管理器中左邊窗口中的文件夾等小圖表就是有這兩個參數(shù)來決定的。 為了在樹型視圖中插入一個項目,您必須至少設(shè)定hParent, hInsertAfter,另外您還要設(shè)定imask和pszText值。 把圖形加到圖形視圖中如果您想要在項目的名稱左邊顯示圖標(biāo)的話,您必須創(chuàng)建一個圖形列表,并且把它和樹形視圖相關(guān)聯(lián)起來。您可以調(diào)用Imag
9、eList_Create來創(chuàng)建一個圖形列表。 ImageList_Create PROTO cx:DWORD, cy:DWORD, flags:DWORD, cInitial:DWORD, cGrow:DWORD 如果創(chuàng)建成功的話,該函數(shù)返回一個空的圖象列表的句柄。cx = 以像素為單位的圖象的寬度。cy = 以像素為單位的圖象的高度。圖象列表中的每一幅的高度都必須相同。否則WINDOWS會對您的圖象進行裁剪,如果過大的話就可能裁剪成幾小塊。所以您必須指定相同大小的圖象。flags = 指定圖象列表的圖象的顏色深度。詳細(xì)情況請參考WIN32 API 指南。cInitial = 指定包含的圖象的
10、數(shù)目。WINDWOS將依此來分配合適的內(nèi)存。cGrow = 在增加新圖象是一次增加的數(shù)目。圖象列表不是窗口。僅僅是保存在那給其它的窗口使用的一種資源。 在圖象列表產(chǎn)生后,您可以調(diào)用ImageList_Add來向其中加入圖象。 ImageList_Add PROTO himl:DWORD, hbmImage:DWORD, hbmMask:DWORD 如果該函數(shù)調(diào)用失敗的話,返回-1。himl = 圖象列表的句柄。它是調(diào)用ImageList_Create時返回的值。hbmImage = 加入圖象列表的位圖的句柄。您通常把位圖保存在資源中,然后調(diào)用LoadBitmap來把它加載進來。 注意您沒有必要
11、指定該位圖中包含的圖象的數(shù)目。WINDOWS會根據(jù)它的大小,自動計算。hbmMask = 掩碼位圖的句柄。如果沒有使用掩碼位圖,可以忽略該值。 通常我們加入兩種圖象到圖象列表中。一種時被選中時顯示的圖象,另一種時沒被選中時顯示的。當(dāng)圖象列表準(zhǔn)備就緒后,您可以發(fā)送消息TVM_SETIMAGELIST給樹型視圖來讓圖象列表和樹型視圖聯(lián)系起來。 TVM_SETIMAGELIST wParam = 圖象列表的狀態(tài),一共有兩種: TVSIL_NORMAL 包含被選中和沒有被選中兩種狀態(tài)的圖象。 TVSIL_STATE 包含了用戶自定義的狀態(tài)的圖象。 lParam = 圖象列表的句柄。 檢索樹型視圖的信息
12、您可以通過發(fā)送消息TVM_GETITEM來檢索圖形視圖的信息。 TVM_GETITEM wParam = 0 lParam =指向結(jié)構(gòu)體TV_ITEM的指針。該結(jié)構(gòu)體將用來得到相關(guān)的信息。 在發(fā)送該消息前必須設(shè)置成員變量imask的值,以便WINDOWS能告訴相關(guān)的信息。當(dāng)然,最重要的是,您必須傳遞您想得到信息的項目的句柄。這就引起了一個問題,您如何得到項目的句柄?要保存所有項目的句柄嗎?答案是很簡單的:沒有必要。您可以發(fā)送消息TVM_GETNEXTITEM到樹型視圖以檢索您想要得到其屬性的項目的句柄。譬如:您可以查詢第一個子項目的句柄、根目錄的句柄、選中的項目的句柄等等。TVM_GETNEX
13、TITEM wParam = 標(biāo)志lParam = 樹型視圖的句柄(僅僅當(dāng)wParam的值是某些標(biāo)志位時才是必須的)。 wParam中的值非常重要, 我解釋如下: TVGN_CARET 選中的項目 TVGN_CHILD hitem參數(shù)指定項目的第一個子項目 TVGN_DROPHILITE 拖-拉操作的目的項目 TVGN_FIRSTVISIBLE 第一個可見項目 TVGN_NEXT 下一個同級項目 TVGN_NEXTVISIBLE 下一個可見項目,指定的項目必須可見。發(fā)送消息TVM_GETITEMRECT 來決定項目是否可見 TVGN_PARENT 指定項目的父項目 TVGN_PREVIOUS
14、前一個同級項目 TVGN_PREVIOUSVISIBLE 前一個可見項目,指定的項目必須可見。發(fā)送消息TVM_GETITEMRECT 來決定項目是否可見 TVGN_ROOT 根項目 由此您可以通過發(fā)送該消息來得到項目的句柄,然后在發(fā)送消息TVM_GETITEM時在結(jié)構(gòu)體變量TV_ITEM的成員變量hItem中放入該項目的句柄就可以得到關(guān)于該項目的有關(guān)信息了。 在樹型視圖中進行拖-拉操作也就是因為這一部分我才決定寫這課教程。當(dāng)我按照InPrise公司的WIN32幫助來運行例子時,發(fā)現(xiàn)它的幫助中缺少真正重要的信息。我只有通過自己做實驗,最后總算弄明白來個中來由。希望您不要和我一樣再去走這些彎路,下
15、面我把我所知的在樹型視圖中進行拖-拉操作的步驟描述如下: 當(dāng)用戶要拖動一個項目時,樹型視圖控件會給它的父窗口發(fā)送TVN_BEGINDRAG通知消息。您可以在此處創(chuàng)建表示項目處在拖動操作中的圖象,這可以通過發(fā)送TVM_CREATEDRAGIMAGE消息給樹型視圖,讓其為目前使用的圖象產(chǎn)生一副缺省的圖象來實現(xiàn)。樹型視圖控件將創(chuàng)建一個圖象列表,其中僅包含一副在拖動中顯示的圖象,圖象列表創(chuàng)建后,您可以得到它的句柄。 在拖拉的圖象生成后,您可以通過調(diào)用ImageList_BeginDrag來指定拖動圖象的熱點位置。 ImageList_BeginDrag PROTO himlTrack:DWORD, i
16、Track:DWORD , dxHotspot:DWORD, dyHotspot:DWORD himlTrack 是包含了拖拉時顯示的圖象的圖象列表的句柄 iTrack 是選中的圖象在圖象列表中的索引號。dxHotspot 因為在拖動中該圖象被用來取代光標(biāo),所以我們必須指定圖象中的哪一點是光標(biāo)的左上角的位置。dxHotspot是水平相對位置。 dyHotspot 是垂直相對位置。iTrack等于0。如果您要想光標(biāo)的熱點在拖拉中顯示的圖象的左上角,把dxHotspot和dyHotspot都設(shè)成0。 當(dāng)拖拉的圖象要顯示時,我們調(diào)用ImageList_DragEnter 在樹型視圖中顯示該圖象。 I
17、mageList_DragEnter PROTO hwndLock:DWORD, x:DWORD, y:DWORD hwndLock 是進行拖拉中的窗口的句柄,拖拉的動作限制在該窗口中。x 和 y是在拖拉時顯示圖象的初始位置的坐標(biāo)值。這些值是相對于窗口的左上角而不是客戶區(qū)的左上角。 既然可以顯示拖動中的圖象了,我們就要處理拖動操作了。在這里有一個小問題。我們監(jiān)視拖動是通過監(jiān)視鼠標(biāo)光標(biāo)的移動來實現(xiàn)的,譬如在移動時我們通過捕獲WM_MOUSEMOVE消息來得到移動中的坐標(biāo)位置,通過捕獲WM_LBUTTONUP消息來獲知用戶的放下操作。但這時如果鼠標(biāo)光標(biāo)移過子窗口時父窗口就無法再得到鼠標(biāo)光標(biāo)的移動以
18、及鼠標(biāo)的按鍵消息了。解決辦法是調(diào)用SetCapture函數(shù)了鎖定鼠標(biāo)事件,這樣無論鼠標(biāo)移到那里和有什么動作,我們的窗口都可以知道了。 在處理WM_MOUSEMOVE消息時,您可以調(diào)用ImageList_DragMove來更新圖象移動的軌跡。 該函數(shù)可以移動拖放操作中的圖象位置。另外,如果您想讓移動中的圖象經(jīng)過某些項目時高量度顯示,可以調(diào)用TVM_HITTEST 來確定是否經(jīng)過某個項目的上面。如果是的話,您可以發(fā)送TVM_SELECTITEM消息并設(shè)置 TVGN_DROPHILITE標(biāo)志位使得那個項目高亮度顯示。注意:在發(fā)送消息TVM_SELECTITEM前,您必須先隱藏圖象列表,否則會留下非常
19、難看的軌跡。要隱藏拖動中的圖象可以調(diào)用ImageList_DragShowNolock,在顯示完高亮度的圖象后再調(diào)用該函數(shù)以讓拖動中的圖象再正常顯示。 當(dāng)用戶釋放主鍵后,您必須做幾件事。 如果您在高亮度顯示的時候釋放鼠標(biāo)主鍵(表示您想把該項目加到此處),您必須使該項目變成正常地顯示,這可以通過發(fā)送消息TVM_SELECTITEM消息并設(shè)置標(biāo)志位TVGN_DROPHILITE來實現(xiàn),只是這時lParam必須為0。如果您不讓高亮度顯示的項目恢復(fù)正常,那就會發(fā)生一個奇怪的現(xiàn)象:當(dāng)您再選擇另外的項目時,那個項目的圖象會包含在一個正方形中,當(dāng)時高亮度顯示的項目依舊是上一個項目。接下來必須調(diào)用ImageL
20、ist_EndDrag和ImageList_DragLeave。還有調(diào)用ReleaseCapture來釋放捕獲的鼠標(biāo)。如果您創(chuàng)建了一個圖象列表,那還要調(diào)用calling ImageList來將它銷毀,在拖放操作結(jié)束后您可以進行另外其它的操作。 例子代碼:.386 .model flat,stdcall option casemap:none include masm32includewindows.inc include masm32includeuser32.inc include masm32includekernel32.inc include masm32includecomctl32
21、.inc include masm32includegdi32.inc includelib masm32libgdi32.lib includelib masm32libcomctl32.lib includelib masm32libuser32.lib includelib masm32libkernel32.lib WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .const IDB_TREE equ 4006 ; ID of the bitmap resource .data ClassName db TreeViewWinClass,0 AppN
22、ame db Tree View Demo,0 TreeViewClass db SysTreeView32,0 Parent db Parent Item,0 Child1 db child1,0 Child2 db child2,0 DragMode dd FALSE ; a flag to determine if we are in drag mode .data? hInstance HINSTANCE ? hwndTreeView dd ? ; handle of the tree view control hParent dd ? ; handle of the root tre
23、e view item hImageList dd ? ; handle of the image list used in the tree view control hDragImageList dd ? ; handle of the image list used to store the drag image .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT invoke ExitProcess,eax invo
24、ke InitCommonControls WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL
25、 push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_APPWORKSPACE mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke Crea
26、teWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName, WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT,200,400,NULL,NULL, hInst,NULL mov hwnd,eax .while TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, AD
27、DR msg invoke DispatchMessage, ADDR msg .endw mov eax,msg.wParam ret WinMain endp WndProc proc uses edi hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL tvinsert:TV_INSERTSTRUCT LOCAL hBitmap:DWORD LOCAL tvhit:TV_HITTESTINFO .if uMsg=WM_CREATE invoke CreateWindowEx,NULL,ADDR TreeViewClass,NU
28、LL, WS_CHILD+WS_VISIBLE+TVS_HASLINES+TVS_HASBUTTONS+TVS_LINESATROOT,0, 0,200,400,hWnd,NULL, hInstance,NULL ; Create the tree view control mov hwndTreeView,eax invoke ImageList_Create,16,16,ILC_COLOR16,2,10 ; create the associated image list mov hImageList,eax invoke LoadBitmap,hInstance,IDB_TREE ; l
29、oad the bitmap from the resource mov hBitmap,eax invoke ImageList_Add,hImageList,hBitmap,NULL ; Add the bitmap into the image list invoke DeleteObject,hBitmap ; always delete the bitmap resource invoke SendMessage,hwndTreeView,TVM_SETIMAGELIST,0,hImageList mov tvinsert.hParent,NULL mov tvinsert.hIns
30、ertAfter,TVI_ROOT mov tvinsert.item.imask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE mov tvinsert.item.pszText,offset Parent mov tvinsert.item.iImage,0 mov tvinsert.item.iSelectedImage,1 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert mov hParent,eax mov tvinsert.hParent,eax mov tvinsert
31、.hInsertAfter,TVI_LAST mov tvinsert.item.pszText,offset Child1 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert mov tvinsert.item.pszText,offset Child2 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert .elseif uMsg=WM_MOUSEMOVE .if DragMode=TRUE mov eax,lParam and eax,0fff
32、fh mov ecx,lParam shr ecx,16 mov tvhit.pt.x,eax mov tvhit.pt.y,ecx invoke ImageList_DragMove,eax,ecx invoke ImageList_DragShowNolock,FALSE invoke SendMessage,hwndTreeView,TVM_HITTEST,NULL,addr tvhit .if eax!=NULL invoke SendMessage,hwndTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,eax .endif invoke ImageL
33、ist_DragShowNolock,TRUE .endif .elseif uMsg=WM_LBUTTONUP .if DragMode=TRUE invoke ImageList_DragLeave,hwndTreeView invoke ImageList_EndDrag invoke ImageList_Destroy,hDragImageList invoke SendMessage,hwndTreeView,TVM_GETNEXTITEM,TVGN_DROPHILITE,0 invoke SendMessage,hwndTreeView,TVM_SELECTITEM,TVGN_CA
34、RET,eax invoke SendMessage,hwndTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,0 invoke ReleaseCapture mov DragMode,FALSE .endif .elseif uMsg=WM_NOTIFY mov edi,lParam assume edi:ptr NM_TREEVIEW .if edi.hdr.code=TVN_BEGINDRAG invoke SendMessage,hwndTreeView,TVM_CREATEDRAGIMAGE,0,edi.itemNew.hItem mov hDragIm
35、ageList,eax invoke ImageList_BeginDrag,hDragImageList,0,0,0 invoke ImageList_DragEnter,hwndTreeView,edi.ptDrag.x,edi.ptDrag.y invoke SetCapture,hWnd mov DragMode,TRUE .endif assume edi:nothing .elseif uMsg=WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret
36、.endif xor eax,eax ret WndProc endp end start 分析:在處理消息WM_CREATE的代碼中,您可以創(chuàng)建樹型視圖控件。 invoke CreateWindowEx,NULL,ADDR TreeViewClass,NULL, WS_CHILD+WS_VISIBLE+TVS_HASLINES+TVS_HASBUTTONS+TVS_LINESATROOT,0, 0,200,400,hWnd,NULL, hInstance,NULL 注意: TVS_xxxx 是樹型視圖所特有的風(fēng)格。 invoke ImageList_Create,16,16,ILC_COLO
37、R16,2,10 mov hImageList,eax invoke LoadBitmap,hInstance,IDB_TREE mov hBitmap,eax invoke ImageList_Add,hImageList,hBitmap,NULL invoke DeleteObject,hBitmap invoke SendMessage,hwndTreeView,TVM_SETIMAGELIST,0,hImageList 接下來,您可以創(chuàng)建一個空的圖像列表,該圖像列表容納的是以像素為單位16x16大小和16位深度的圖像,該圖像列表初始包含兩幅圖像,最大可以容納10幅。然后我們從資源中加載
38、圖像,并把它們放到圖像列表中去。隨后我們刪除掉圖像的句柄,因為我們不需要再用到它。設(shè)置好圖像列表后,我們通過發(fā)送消息TVM_SETIMAGELIST把它和樹型視圖控件聯(lián)系起來。 mov tvinsert.hParent,NULL mov tvinsert.hInsertAfter,TVI_ROOT mov tvinsert.u.item.imask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE mov tvinsert.u.item.pszText,offset Parent mov tvinsert.u.item.iImage,0 mov tvinsert.
39、u.item.iSelectedImage,1 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert 現(xiàn)在把項目插入到樹型視圖控件中去,首先我們從根項目開始。因為是根項目,所以成員變量hParent是NULL,hInsertAfter是TVI_ROOT。imask指定TV_ITEM結(jié)構(gòu)體變量中的pszText,iImage和iSelectedImage三個成員變量的值是有效的。我們應(yīng)該給這三個成員變量賦上正確的值。其中pszText顯示項目的名稱,iImage是圖像列表中圖像的索引號,該圖像顯示在未選中的項目名稱的左邊,i
40、SelectedImage是選中的項目的圖像索引號。設(shè)置好了這些值后,我們發(fā)送TVM_INSERTITEM消息給樹型視圖控件來把根項目加入到樹型視圖控件中去。 mov hParent,eax mov tvinsert.hParent,eax mov tvinsert.hInsertAfter,TVI_LAST mov tvinsert.u.item.pszText,offset Child1 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert mov tvinsert.u.item.pszText,offset Chil
41、d2 invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert 加入完根項目后,我們再加入子項目。這時的成員變量hParent是其父項目的句柄,hInsertAfter的值是TVI_LAST。至于選中和非選中時用的圖像是一樣的,所以我們無需更改其它變量的值。 .elseif uMsg=WM_NOTIFY mov edi,lParam assume edi:ptr NM_TREEVIEW .if edi.hdr.code=TVN_BEGINDRAG invoke SendMessage,hwndTreeView,TVM_CREA
42、TEDRAGIMAGE,0,edi.itemNew.hItem mov hDragImageList,eax invoke ImageList_BeginDrag,hDragImageList,0,0,0 invoke ImageList_DragEnter,hwndTreeView,edi.ptDrag.x,edi.ptDrag.y invoke SetCapture,hWnd mov DragMode,TRUE .endif assume edi:nothing 當(dāng)用戶拖動項目時,樹型視圖控件將發(fā)送WM_NOTIFY消息給它的父窗口,子消息號是TVN_BEGINDRAG。在lPAram中是指向結(jié)構(gòu)體NM_TREEVIEW 的指針,該結(jié)構(gòu)體包含了一些附加信息。我們把lParam的值放到edi寄存器中,這樣就可以把edi作為一個指針來使用?!癮ssume edi:ptr NM_TREEVIEW ”語句用來告訴編譯器MASM把edi作為指向NM_TREEVIEW 的結(jié)構(gòu)體的變量使用。我們通過發(fā)送消息TVM_CREATEDRAGIMAGE來創(chuàng)建一個拖動的圖像。它將返回一個新
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)境保護局安全生產(chǎn)制度
- 罕見病藥物研究的倫理加速審批策略
- 創(chuàng)意集市活動策劃方案(3篇)
- 邊境管理制度化建設(shè)(3篇)
- 2025年泰州市海陵區(qū)法院系統(tǒng)招聘真題
- 2026山東事業(yè)單位統(tǒng)考煙臺福山區(qū)招聘68人備考題庫及答案詳解參考
- 2026年商洛市商丹高級中學(xué)春季招聘備考題庫及1套參考答案詳解
- 2026內(nèi)蒙古鄂爾多斯準(zhǔn)格爾旗民族小學(xué)招聘備考題庫及一套參考答案詳解
- 2026內(nèi)蒙古呼和浩特賽罕區(qū)公益性崗位招聘100人備考題庫及1套完整答案詳解
- 2026云南昭通市鎮(zhèn)雄聯(lián)通公司招聘10人備考題庫及答案詳解1套
- 公安交警隊和車輛管理所標(biāo)識制作及設(shè)置規(guī)范
- 【高中數(shù)學(xué)競賽真題?強基計劃真題考前適應(yīng)性訓(xùn)練】 專題03三角函數(shù) 真題專項訓(xùn)練(全國競賽+強基計劃專用)原卷版
- DB33∕T 1152-2018 建筑工程建筑面積計算和竣工綜合測量技術(shù)規(guī)程
- 2025年湖南省郴州市中考模擬英語試題(含答案含聽力原文無音頻)
- SL631水利水電工程單元工程施工質(zhì)量驗收標(biāo)準(zhǔn)第1部分:土石方工程
- (二調(diào))武漢市2025屆高中畢業(yè)生二月調(diào)研考試 英語試卷(含標(biāo)準(zhǔn)答案)+聽力音頻
- 福建省龍巖市2024-2025學(xué)年高一上學(xué)期期末考試物理試卷(含答案)
- 汽車修理廠輪胎采購 投標(biāo)方案(技術(shù)標(biāo) )
- 2023年7月浙江省普通高中學(xué)業(yè)水平考試(學(xué)考)化學(xué)試題
- DB3301-T 0461-2024 電動自行車停放充電場所消防安全管理規(guī)
- NB-T 47013.15-2021 承壓設(shè)備無損檢測 第15部分:相控陣超聲檢測
評論
0/150
提交評論