




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 FTP客戶端實現之二 前面的章節4實現過一個FTP客戶端程序,那么為什么這里又要實現呢?區別有二,FTP客戶端所基于的應用程序框架不同,第4章基于對話框,本章將基于SDI開發;開發時的精力分配不同,第4章的精力主要集中在與FTP服務器的“交流”上,本章將把這種底層的工作交給MFC封裝的類來實現,主要精力會集中在界面的美化上。 FTP客戶端簡介 這節將會帶領大家快速了解下本章將要實現的FTP客戶端的各種功能。包括:以樹形視圖瀏覽本地文件夾資源、列表方式顯示FTP服務器上的文件資源、用過拖動文件的方式實現文件的上傳和下載。5.1.1 樹形結構的應用 在主窗體的左側視圖中顯示選定本地文件夾內
2、的所有文件資源,結構為樹形,可以動態的改變本地文件夾的選擇,如圖所示。前方有加號說明路徑中還有子路徑,單擊加號打開此路徑,加號變減號,子文件將顯示在子樹中。鼠標移過此視圖時樹子項會加亮顯示。圖標H表示文件夾、圖標F表示文件。圖5.1. 本地文件夾資源顯示5.1.2 列表結構的應用 在主窗體的右側視圖中,將以列表圖標的形式顯示FTP服務器下的所有文件資源,如圖所示。圖5.2 FTP服務器上文件資源5.1.3 信息框的應用 在主窗體的正中央有個信息的顯示框,是用于描述用戶的一些操作,如圖所示。圖5.3 信息顯示框5.1.4 浮動對話框的應用 主程序的最頂端是用來填寫本地文件夾路徑和連接FTP服務器
3、的浮動對話框,如圖所示。圖5.4 浮動對話框 那么,最后來看一下本章FTP客戶端的全貌吧,如圖所示。圖5.5 FTP客戶端全貌5.2 關鍵技術講解 這節主要介紹本章要用到的所有關鍵技術,包括如何制作浮動對話框,然后像工具欄一樣加到菜單之下;如何將客戶區分欄;如何實現對樹形和列表視圖項目的拖動。 我們創建的工程是基于SDI的,命名為FtpClient。在向導的第6步,我們選擇CFtpClientView基于CListView類,如圖所示。圖5.6 修改CFtpClientView的基類5.2.1 制作、使用浮動對話框 浮動對話框,顧名思義就是可以浮動在主窗體之上。制作方法如下: (1)在資源視圖
4、中插入對話框資源,修改ID為IDD_FLOAT_DLG,修改屬性:去掉對話框的邊緣,將style改為child,如圖所示。圖5.7 對話框屬性設置 (2)為對話框拖放控件,然后進行設計,怎么好看怎么擺放吧!我的設計如圖所示。你們在前面見過了,但還是想讓大家看看,因為我增加了新內容。圖5.8 浮動對話框界面設計 (3)在CMainFrame中添加一個浮動對話框的變量m_myDlg。 在CMainFrame的OnCreate()成員函數中完成兩個任務:去掉由向導為我們添加的工具欄和狀態欄,它們影響到了我們程序的美觀;添加顯示我們剛才設計的對話框的代碼。 程序中去掉了工具欄和狀態欄的功能,所以你可以
5、將代表兩個工具的對象m_wndStatusBar、m_wndToolBar也注釋掉,它們就定義在類CMainFrame的頭文件中,如下: 不注釋掉也并不會影響程序的編譯執行,讀者可自由處理。 通過調用類CDialogBar的成員函數Create(),裝載我們設計的對話框資源模版、創建對話框窗口、設置它的樣式,最后關聯窗口到CDialogBar對象m_myDlg上。函數原型如下: virtual BOOL Create( CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID ); 參數含義如下: pParentWnd:指向裝載浮動對話
6、框的父窗口的指針,我們直接使用了this。 其它成員函數如EnableDocking()的使用很簡單,代碼中已經加入了注釋,就不做詳解講解了。 那么,編譯運行程序就會發現工具欄、狀態欄消失了,取而代之的是我們自己設計的浮動對話框,用鼠標嘗試拖動它,會有如圖所示效果。圖5.9 拖動浮動對話框 你當然可以任意移動它,甚至是單擊它上面的關閉按鈕來關閉它,不過關閉了以后就比較麻煩了,因為我們需要重新啟動程序來讓它再次顯示。本程序沒有實現再次顯示浮動窗口功能,讀者可以自己實現下。5.2.2 客戶區的分割 我們需要將整個客戶區分割為3個部分:用于顯示用戶操作的信息窗口、用于顯示本地文件夾資源的樹形視圖窗口
7、和用于顯示FTP服務器上文件資源的列表視圖窗口。效果如圖所示。圖5.10 窗口分割效果圖 為類CMainFrame添加兩個成員變量,如下: 類CSplitterWnd提供了分割窗口的功能,就是一個窗口包含多個窗格。 為類CMainFrame添加虛函數OnCreateClient()的實現,程序編寫如下: 調用類CSplitterWnd的成員函數CreateStatic()創建靜態的分割窗口,函數原型如下: virtual BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | W
8、S_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST ); 參數含義如下: pParentWnd:分割窗口的父框架窗口。 第一次分割窗口時,父窗口是框架CMainFrame,分割成2行1列。第二次分割窗口時,是嵌入在第一次分割的窗口中的,所以父窗口為m_splitter1,分割為1行2列,嵌套的窗口ID通過類CSplitterWnd的成員函數IdFromRowCol()獲得。 類CSplitterWnd的成員函數CreateView()為靜態分割窗口創建窗格,原型如下: virtual BOOL CreateView( int row, int col, CRunt
9、imeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext ); 參數含義如下: row:指定放置新視圖的窗口行。 調用類CSplitterWnd的成員函數SetRowInfo()和SetColumnInfo()分別設置分割窗口的行高取值范圍、列寬取值范圍。函數原型如下: void SetRowInfo( int row, int cyIdeal, int cyMin ); void SetColumnInfo( int col, int cxIdeal, int cxMin ); 參數含義如下: row、col:指定分割窗口的行
10、、列,用于定位。 在函數OnCreateClient()中,我們將3個視圖CMsgShow、CFileTree和CFtpClientView指定到相應的分割窗格中。前兩個是我們利用類向導添加的新類,分別基于類CEditView和CTreeView,最后一個是我們創建工程時由向導為我們創建的視圖類,基于類CListView。至此客戶區分割的操作代碼填加完畢。5.2.3 樹形視圖項目拖動效果 我們可以通過捕獲3個事件來添加拖動效果的代碼,他們是:鼠標左鍵選中項目并且開始拖動、鼠標移動和鼠標左鍵抬起。1.選中視圖項 我們需要用類向導添加一個新類CFileTree,基于CTreeView,如圖所示。圖
11、 添加新類CFileTree 在類CFileTree的實現文件,添加文件包含指令如下: #include MainFrm.h #include FtpClientView.h 在利用類向導為它添加函數OnBegindrag(),如圖所示。圖5.12 為類CFileTree添加消息響應 為函數OnBegindrag()添加代碼,如下: 函數OnBegindrag()中的變量是類CFileTree的公有成員變量,定義如下: 成員變量在類CFreeTree的構造函數初始化如下: 類CTreeCtrl的成員函數GetTreeCtrl()返回樹視圖控件的引用。函數OnBegindrag()中結構NM_T
12、REEVIEW定義如下: typedef struct _NM_TREEVIEW NMHDR hdr; UINT action; TV_ITEM itemOld; TV_ITEM itemNew; POINT ptDrag; NM_TREEVIEW; 參數含義如下: hdr:另一個包含通知消息信息的結構NMHDR。 我們要從這個結構中獲取兩個信息:和ptDrag。前者是個結構TV_ITEM,用來指定或返回樹視圖項的屬性。結構TV_ITEM的字段hItem放的是這個結構指向樹視圖項的句柄HTREEITEM,被保存在了m_hItemDragS變量中。 然后用到類CTreeCtrl的1個成員函數和C
13、ImageList的2個成員函數完成圖像拖動的準備工作,它們是:CreateDragImage()用來為指定的樹視圖項創建拖動時的位圖、BeginDrag()標志拖動位圖操作的開始、DragEnter()用來在拖動操作期間在指定的位置顯示位圖和鎖定更新。 函數BeginDrag()的原型如下: BOOL BeginDrag( int nImage, CPoint ptHotSpot ); 參數含義如下: nImage:索引號從0開始的位圖號,用來指定位圖。 函數DragEnter()的原型如下: static BOOL PASCAL DragEnter( CWnd* pWndLock, CPo
14、int point ); 參數含義如下: pWndLock:指向擁有拖動圖像的窗口指針。若參數賦值為NULL,這個函數拖動圖像的坐標是相對于桌面窗口的,即屏幕坐標的左上角。 所以我們在使用函數DragEnter()的時候,用到類CWnd的成員函數ClientToScreen(),將給定的客戶區點坐標轉換為屏幕點坐標。最后我們同樣調用類CWnd的成員函數SetCapture(),以后不管鼠標的位置在哪里,所有的鼠標后續輸入都會被送到當前的窗口處理。 至此,鼠標左鍵選中項目并且開始拖動事件的捕捉和處理代碼填寫和解釋完畢。2.圖像隨鼠標移動 利用類向導為類CFileTree添加下一個事件:鼠標移動。
15、如圖所示。圖5.13 添加鼠標移動事件 為函數OnMouseMove()添加代碼,如下: 函數OnMouseMove()首先調用AfxGetMainWnd(),獲取指向當前程序主框架CMainFrame的指針,保存在變量mFrm中,通過此變量調用其成員變量m_splitter2的成員函數,既類CSplitterWnd的成員函數GetPane(),得到指定行列窗格的指針。這里獲取的是列表視圖窗格的指針,保存在變量pEView中。 我們要在類CFileTree中添加一個自定義的成員函數GetCtrlRect(),如圖所示。圖5.14 添加自定義的成員函數 添加如下很簡單的一段代碼就行: 簡單的封裝
16、了兩個函數,分別完成功能:獲取樹視圖窗口的矩形大小,即窗口大小。然后將坐標轉換為相對屏幕的坐標值。同樣需要在類CFtpClientView中添加這樣一個自定義的函數GetCtrlRect(),代碼一樣,功能當然也一樣,如下: 函數OnMouseMove()接下來完成的功能是:創建兩個“區域”。實例化兩個類CRgn的對象listRgn和treeRgn,調用類CRgn的成員函數CreateRectRgn()創建兩個矩形區域,分別覆蓋了樹形結構視圖、列表結構視圖。 函數CreateRectRgn()的原型如下: BOOL CreateRectRgn( int x1, int y1, int x2,
17、int y2 ); 參數含義如下: x1、y1:指定矩形區域左上角點的坐標位置。 函數OnMouseMove()最后會判斷:鼠標是否處于拖動的狀態,是在樹形結構視圖區域或者列表結構視圖區域中嗎.通過類CRgn的成員函數PtInRegion()判斷指定的點是否在指定的區域范圍內。 在指定的區域范圍內,并且當前正處在拖動的狀態下時,就該調用拖動操作的第4個函數了,它是類CImageList的成員函數DragMove(),原型如下: static BOOL PASCAL DragMove( CPoint pt ); pt是拖動操作時,鼠標新的位置點。這個函數移動圖像到指定的新的坐標點,也就是圖像會隨
18、著鼠標移動效果的展現。 若是不滿足剛才的判斷條件呢?是不是就什么都不做了?當然不是,還有另一個有趣的效果需要實現。我們通過類CTreeCtrl的成員函數HitTest()判斷:鼠標點相對樹視圖控件的位置,若是在控件內部的話,會返回指定位置樹視圖項的句柄,當指定位置不在在任何一個樹視圖項上,則返回NULL。 即我們的鼠標在樹視圖窗口上“劃過”,相應的樹視圖項就會有“被選中”的效果。通過調用類CTreeCtrl的成員函數SelectDropTarget(),重繪樹視圖相應項,以一種表明樹視圖項被選中的樣式,參數是樹視圖項的句柄就行。 那么,鼠標移動圖像的代碼也填寫和解釋完畢了。3.鼠標圖像釋放 利
19、用類向導為類CFileTree添加最后一個事件:鼠標左鍵彈起。如圖所示。圖5.15 添加鼠標左鍵彈起事件 為函數OnLButtonUp()添加代碼,如下: 函數OnLButtonUp()會調用AfxGetMainWnd()獲取本程序主框架的指針,并保存在變量mFrm中,用mFrm通過其數據成員m_splitter2獲取列表視圖窗格的指針。 當確定鼠標是在拖動圖像的時候左鍵才彈起的,即m_bDragging為true時,我們用最后2個函數來完成拖動操作。它們是類CImageList的成員函數:DragLeave()用來解鎖參數指定的窗口、隱藏圖像、允許窗口更新;EndDrag()用來結束拖動操作
20、。函數原型如下: static BOOL PASCAL DragLeave( CWnd* pWndLock ); static void PASCAL EndDrag( ); 通過函數ReleaseCapture()釋放鼠標的捕獲。然后就是我們應該很熟悉的操作了,獲取列表視圖矩形大小、創建覆蓋列表視圖的區域、判斷鼠標點移動到了創建的區域范圍之內時,添加任意的操作。5.2.4 列表視圖項目拖動效果 與樹形視圖項目拖動效果類似,我們可以通過捕獲3個事件來添加拖動效果的代碼,他們是:鼠標左鍵選中項目并且開始拖動、鼠標移動和鼠標左鍵抬起。 首先需要在類CFtpClientView的實現文件頭部添加文件
21、包含指令如下: #include MainFrm.h #include FileTree.h 在類CFtpClientView的頭文件添加類的聲明,代碼如下: class CFtpClientDoc;1.選中視圖項 利用類向導為類CFtpClientView添加函數OnBegindrag(),如圖所示。圖5.16 為類CFileTree添加消息響應 為函數OnBegindrag()添加代碼,如下: 函數OnBegindrag()中的變量是類CFtpClientView的公有成員變量,定義如下: 成員變量在類CFtpClientView的構造函數初始化如下: 函數OnBegindrag()會調用
22、類CListCtrl的2個成員函數:GetNextItem()和CreateDragImage()。 GetNextItem()用來檢索滿足指定條件的列表項,函數原型如下: int GetNextItem( int nItem, int nFlags ) const; 參數含義如下: nItem:開始檢索時起始列表項的索引,若為-1將會匹配滿足nFlags所指條件的第一個列表項,所指定的列表項不會被檢索。 CreateDragImage()用來為指定的列表項創建拖動圖像,函數原型如下: CImageList* CreateDragImage( int nItem, LPPOINT lpPoin
23、t ); 參數含義如下: nItem:要創建拖動圖像的列表項的索引。 函數OnBegindrag()剩下的操作,我們應該很熟悉了才對,包括:調用類CImageList的成員函數BeginDrag(),標志開始拖動圖像;調用類CImageList的成員函數DragEnter(),鎖定視圖的更新;調用類CWnd的成員函數SetCapture()捕獲鼠標后續的所有事件。2.圖像隨鼠標移動 利用類向導為類CFtpClientView添加下一個事件:鼠標移動。如圖所示。圖5.17 添加鼠標移動事件 為函數OnMouseMove()添加代碼,如下: 函數OnMouseMove()的實現過程同樣包括:獲取樹
24、形視圖、列表視圖窗口矩形大小,創建覆蓋樹形視圖、列表視圖窗口的區域,檢測鼠標處于拖動圖像狀態,而且在樹形視圖或列表視圖的區域范圍內,調用類CImageList的成員函數DragMove()拖動圖像。3.鼠標圖像釋放 利用類向導為類CFtpClientView添加最后一個事件:鼠標左鍵彈起。如圖所示。圖5.18 添加鼠標左鍵彈起事件 為函數OnLButtonUp()添加代碼,如下: 函數OnLButtonUp()實現的功能包括:解鎖拖動窗口、結束拖動操作、釋放鼠標的捕獲、獲取樹視圖矩形大小、創建覆蓋樹視圖的區域、判定鼠標點在樹視圖區域之內。5.3 實現FTP客戶端 這個實例是通過WinInet
25、API來實現FTP客戶端的,因此無需考慮底層的通信協議和數據傳輸工作,所以我們把近一半的精力用在了華麗的程序界面上。5.3.1 WinInet類介紹 MFC提供的WinInet類是對WinInet API的封裝,為我們提供了更加方便的編程接口。主要用到兩個類:CInternetSession和CFtpConnection。類 用來創建或者初始化一個或多個同步的網絡會話。它的構造函數原型如下: CInternetSession( LPCTSTR pstrAgent = NULL, DWORD_PTR dwContext = 1, DWORD dwAccessType = PRE_CONFIG_I
26、NTERNET_ACCESS, LPCTSTR pstrProxyName = NULL, LPCTSTR pstrProxyBypass = NULL, DWORD dwFlags = 0 ); 我們的實例程序直接使用了所有的默認參數值。 當我們要在服務器上執行指定的服務,如FTP服務,必須要先建立連接,用到的成員函數是GetFtpConnection()。函數原型如下: CFtpConnection* GetFtpConnection( LPCTSTR pstrServer, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL,
27、 INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, BOOL bPassive = FALSE ); 參數含義如下: pstrServer:包含FTP服務器IP地址的字符串。 bPassive:為這個會話指定被動或主動的模式,默認為主動模式。 返回一個指向類CFtpConnection的指針。類 此類主要用于管理FTP服務連接,并允許用戶直接操作服務器目錄和文件。我們主要用到了此類的2個成員函數:PutFile()用來上傳文件,GetFile()用來下載文件。函數原型如下: BOOL PutFile( LPCTSTR pstrLocalFi
28、le, LPCTSTR pstrRemoteFile, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 1 ); 參數含義如下: pstrLocalFile:包含要上傳文件路徑的字符串。 依據返回值判定上傳操作是否成功。函數GetFile()的原型如下: BOOL GetFile( LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile, BOOL bFailIfExists = TRUE, DWORD dwAttributes = FILE_ATTRIBUTE_NORMAL,
29、DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD_PTR dwContext = 1 ); 參數含義如下: pstrRemoteFile:包含要接收FTP服務器上文件路徑的字符串。 讀者可以依據函數GetFile()的返回值來判定下載操作是否成功。5.3.2 FTP服務器操作 通過浮動對話框獲取用戶輸入的信息,調用類的成員連接、登錄FTP服務器,最后將FTP服務器根目錄下的所有文件顯示在列表視圖中。浮動對話框如圖所示。圖5.19 浮動對話框 我們需要在類CMainFrame中手動添加“連接服務器”和“確定”按鈕的消息響應函數OnConnect()和
30、OnChooseDisc(),步驟如下: (1)在類CMainFrame頭文件添加文件包含指令,用來支持WinInet類,如下: #include /為了使用CFtpConnect CInternetSession 在類中添加成員變量和成員函數,如下: (2)在類CMainFrame的實現文件添加文件包含指令,用來支持3個分割窗口視圖,如下: #include MsgShow.h/3個窗體的頭文件 #include FileTree.h #include FtpClientView.h 添加消息映射,即控件ID與處理事件函數建立聯系,如下: 添加了2個按鈕單擊事件的消息映射。類CMainFra
31、me的構造函數如下: 可以看到,構造函數只是初始化了一些成員變量。1.連接FTP服務器 編寫按鈕“連接服務器”按鈕的消息響應函數OnConnect(),如下: 響應函數OnConnect()功能的實現步驟包括:獲取浮動對話框上由用戶填寫的登錄信息,保存在3個字符串變量中,他們是strHost、strName和strPass,調用類CInternetSession的成員函數GetFtpConnection()連接FTP服務器,代碼中對異常的情況做了一些處理,代碼包含在try和catch的語句塊中。 為類CFtpClientView添加成員函數BrowseDir(),用來遍歷服務器根目錄下的所有文
32、件,代碼編寫如下: 函數BrowseDir()使用了類CFtpFileFind,用來輔助FTP服務器上網絡文件的檢索。主要調用了此類的5個成員函數: FindFile()用來查找FTP服務器上指定的文件。 通過while循環將滿足條件的文件全部插入到列表視圖中。用類CListCtrl的成員函數InsertItem()實現,原型如下: int InsertItem( int nItem, LPCTSTR lpszItem, int nImage ); 參數含義如下: nItem:要將列表項插入索引視圖的位置。 類CMsgShow我們提到過,是我們自己新建的基于CEditView的類。為此類添加成
33、員函數ShowMsg(),用來將指定的字符串顯示在信息顯示窗格中,代碼如下: 函數ShowMsg()中的m_editView是類CMsgShow的成員變量,在類CMsgShow的構造函數中被初始化,代碼如下: 構造函數調用了類CEditView的成員函數GetEditCtrl(),用來獲取指向編輯視圖的指針,然后保存在成員變量m_editView中。 函數ShowMsg()的功能實現過程:獲取當前編輯視圖窗格的文本內容,依據之前的內容再添加新的文本信息。函數ShowMsg()還使用到類CEditView繼承自類CWnd的2個成員函數: GetWindowText():獲取窗口的文本,并保存在傳
34、入的參數字符串中。 用于連接服務器的函數OnConnect(),在連接到服務器以后會:改變自身按鈕的文本為“斷開連接”、將浮動對話框上的文本框設置為禁用。2.斷開連接 當程序與FTP服務器處于連接狀態時,我們再次單擊“斷開連接”按鈕時,將關閉與服務器的連接,如下: 函數OnConnect()調用到了列表視圖的成員函數deleteItem(),用來清空列表視圖的所有列表項,函數deleteItem()的實現如下: 很簡單的函數封裝,只是調用了類CListCtrl的成員函數DeleteAllItems(),甚至連參數都不需要。 函數OnConnect()的后續操作包括:調用類CFtpConnect
35、ion的成員函數Close()關閉與FTP的連接,在信息顯示框中顯示文本信息“斷開與服務器的連接”,改變“斷開連接”按鈕的文本為“連接服務器”,最后將浮動對話框中被禁用的文本框設置為可用。5.3.3 遍歷本地文件夾資源 用戶需要手動填寫“文件夾路徑”文本框,在單擊“確定”按鈕,樹結構視圖中將會顯示出該文件夾下的所有文件資源。 為浮動對話框的按鈕“確定”添加消息響應函數OnChooseDisc(),功能代碼編寫如下: 函數OnChooseDisc()中,調用到類CFileTree的成員函數deleteItem(),用來清除樹結構視圖中的所有項,實現如下: 同樣是很簡單的函數封裝,只是調用了類CT
36、reeCtrl的成員函數DeleteAllItems(),甚至連參數都不需要。 類CFileTree的成員函數BrowseDir(),用來實現遍歷文件夾中文件資源,并按結構插入到樹中,實現代碼如下: 函數BrowseDir()的功能實現過程:構造遍歷文件的字符串,調用類CFileFind的6個成員函數: FindFile()用來查找本地指定路徑下的文件資源。 IsDots()用來確定找到的文件的文件名是否包含“.”或“.”,它們其實就是目錄。 IsDirectory()用來確定找到的文件是否是目錄。 類CTreeCtrl的成員函數InsertItem()用來向樹結構視圖中添加項,函數原型如下:
37、 HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST ); 參數含義如下: lpszItem:插入項的文本指針。 樹結構視圖CFileTree關聯的圖像列表是在函數OnInitialUpdate()中確定的,代碼如下: 我們當然得先在資源編輯器中插入2個圖標資源,一個用來表示文件,一個用來表示文件夾,如圖所示。圖5.20 自己制作的小圖標 類CWinApp的成員函數LoadIc
38、on(),將加載指定ID的圖標資源,返回圖標的句柄。創建圖標列表調用到類CImageList的成員函數Create(),函數原型如下: BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow ); 參數含義如下: cx、cy:圖像的長寬值,以像素為單位。 調用類CImageList的成員函數Add(),將指定的圖標句柄加入到圖像列表中,調用類CTreeCtrl的成員函數SetImageList(),用來關聯樹結構視圖與圖像列表,函數原型如下: CImageList* SetImageList( CImageList *pImageList, int nImageListType ); 參數含義如下: pImageList:指向圖像列表的指針。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 維保報價合同范本
- 學生保險合同范本
- 公司合作辦廠合同范本
- 鄰村庫房轉租合同范本
- 宣傳版制作合同范本
- 2025勞務合同模板(28篇)
- 重度肝病護理方案
- 2025年春一年級語文上冊 17 小猴子下山(+公開課一等獎創新教案+素材)
- 防護安全培訓
- 音樂專業工作總結
- 專升本計算機教學課件-第一章-計算機基礎知識(2023新版大綱)
- GB/T 23587-2024淀粉制品質量通則
- DL∕T 1120-2018 水輪機調節系統測試與實時仿真裝置技術規程
- 公積金歸集委托協議
- JTG D30-2015 公路路基設計規范
- 一年級下冊口算題卡大全(50套直接打印版)
- 慢性腎臟病英文
- 涉密文件失泄密應急預案
- 智聯招聘測評題庫2024答案
- 農業社會化服務體系課件
- WS 10013-2023 公共場所集中空調通風系統衛生規范
評論
0/150
提交評論