日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC项目实战(1)文件管理器--准备篇

發(fā)布時(shí)間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC项目实战(1)文件管理器--准备篇 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本程序主要實(shí)現(xiàn)如下功能:

程序通過左邊的樹形控件顯示本地計(jì)算機(jī)中目錄的結(jié)構(gòu),右邊的列表控件則負(fù)責(zé)響應(yīng)樹形控件中選擇的目錄節(jié)點(diǎn)并把此節(jié)點(diǎn)中的所有項(xiàng)在列表框中顯示出來,列表框支持奇偶行顏色設(shè)置,選中顏色設(shè)置和熱點(diǎn)顏色設(shè)置;

本程序支持顯示或不顯示隱藏文件和系統(tǒng)文件,支持文件的重命名、打開、復(fù)制、移動和刪除操作,刪除操作支持刪除到回收站和徹底刪除選擇。

同時(shí)支持地址欄跳轉(zhuǎn)功能。支持屬性欄的時(shí)間顯示

程序主界面:

?

1.?????? 模式與無模式對話框

本程序是基于對話框而設(shè)計(jì)的,對話框分為模式對話框和無模式對話框。對于模式對話框,當(dāng)該對話框在關(guān)閉之前,用戶不能夠在同一應(yīng)用程序中進(jìn)行其它的操作,這類對話框如“打開文件”對話框等;而對于無模式對話框,當(dāng)該對話框顯示后用戶可以進(jìn)行其它的操作,這類對話框僅僅是一個(gè)彈出窗口,如“替換查找”對話框等。

新建一個(gè)MFCDemo對話框程序,默認(rèn)設(shè)置,Finished 完成新建。然后在資源視圖中再新建兩個(gè)Dialog,右鍵這新建的Dialog 把它們的Caption,改為ModeDlg NonModeDlg ID號分別改為IDD_MODEDLG IDD_NONMODEDLG ,改好后,ModeDlg NonModeDlg對話框模版就新建好了,那么如何來使用它們呢?若要在這些新建的對話框上進(jìn)行消息響應(yīng),就要為這些對話框模版生成一個(gè)CDialog派生類才行,那么如何為ModeDlgNonModeDlg生成它們的派生類呢?ModeDlg對話框點(diǎn)擊右鍵,選擇類向?qū)?#xff08;Class Wizard

,然后點(diǎn)擊添加類(Add class)新建一個(gè)CModeDlg類(即在彈出的MFC類向?qū)υ捴?#xff0c;在對話框的“類名”欄中輸入CModeDlg,并選擇該類的基類為CDialog類。單擊“完成”按鈕以新建CModeDlg類。)如圖:

?

同樣,在NonModeDlg對話框中右鍵,選擇類向?qū)?#xff08;Class Wizard)然后添加一個(gè)CNonModeDlg類。然后打開IDD_DEMO_DIALOG對話框,在它上面添加兩個(gè)按鈕,分別命名為ModeDlgNonModeDlg ,同時(shí)這兩個(gè)按鈕的ID號分別換成IDC_MDlg ,IDC_NMDlg。然后右鍵點(diǎn)擊ModeDlg按鈕選擇添加事件句柄(Add Event Handler...,在彈出的事件句柄向?qū)υ捒蛑?#xff0c;為按鈕選擇單擊事件,所以消息類型選擇BN_CLICKED,按鈕是在IDD_DEMO_DIALOG對話框上,所以它的消息事件應(yīng)該建立在CDemoDlg這個(gè)類里面,最后函數(shù)句柄的名稱默認(rèn)即可。具體如圖:?

?

單擊添加并編輯以新建ModeDlg按鈕響應(yīng)函數(shù)OnBnClickedMdlg以同樣的方式為NonModeDlg按鈕在CDemoDlg類中添加BN_CLICKED事件句柄函數(shù)OnBnClickedNmdlg

為了在CDemoDlg類中使用ModeDlg對話框和NonModeDlg的類,首先需要將它們的頭文件包含到DemoDlg.h文件中,即在DemoDlg.h文件添加:

#include"ModeDlg.h"

#include"NonModeDlg.h"

然后回到DemoDlg.cpp文件,在剛添加的ModeDlg按鈕響應(yīng)函數(shù)中,創(chuàng)建CModeDlg類的實(shí)例,并調(diào)用DoModal函數(shù)顯示對話框,代碼如下:

void CDemoDlg::OnBnClickedMdlg()

{

??? CModeDlg dlg;? //創(chuàng)建CModeDlg類實(shí)例dlg

??? dlg.DoModal();? //調(diào)用DoModal()函數(shù)顯示對話框

}

下面在添加的NonModeDlg按鈕函數(shù)OnBnClickedNmdlg()來創(chuàng)建并顯示無模式對話框,創(chuàng)建無模式對話框,首先生成一個(gè)CNonModeDlg類的實(shí)例,然后調(diào)用Create()函數(shù)來創(chuàng)建無模式對話框,最后調(diào)用ShowWindow()來顯示無模式對話框,添加代碼如下:

void CDemoDlg::OnBnClickedNmdlg()

{

??? CNonModeDlg *pDlg = new CNonModeDlg();// 創(chuàng)建一個(gè)CNonModeDlg類的實(shí)例

??? pDlg->Create(IDD_NONMODEDLG,this); // 創(chuàng)建無模式對話框

??? pDlg->CenterWindow();? //對話框居中顯示

??? pDlg->ShowWindow(SW_SHOW); //顯示對話框

}

?

注意Create()函數(shù)中的第一個(gè)參數(shù)是無模式對話框的ID號,當(dāng)編寫完

pDlg->Create(IDD_NONMODEDLG,this); 這行代碼后,提示IDD_NONMODEDLG 沒有定義,這是因?yàn)闆]有包含Resouce.h頭文件,導(dǎo)致它找不到這個(gè)ID號,所以在DemoDlg.cpp中包含這個(gè)頭文件即可。

還需要注意的是,關(guān)閉調(diào)用DoModal()函數(shù)創(chuàng)建的模式對話框時(shí),系統(tǒng)會自動回收模式對話框申請的資源,但是當(dāng)關(guān)閉無模式對話框時(shí),系統(tǒng)不會自動回收和釋放創(chuàng)建無模式對話框時(shí)所申請的資源,所以在無模式對話框被關(guān)閉時(shí)需要手動回收它創(chuàng)建時(shí)申請的資源,否則會造成內(nèi)存泄露!那么如何手動來回收它申請的資源呢?

在“類視圖“窗口中選擇CNonModeDlg類,并單擊屬性窗口中的屬性按鈕,然后重寫PostNcDestroy函數(shù)。在該函數(shù)中添加一條delete語句以銷毀對話框,回收資源,代碼如下:

void CNonModeDlg::PostNcDestroy()

{

??? delete this;

??? CDialog::PostNcDestroy();

}

下面介紹一下本程序需要程序的控件,在后面的程序中用到時(shí)再做更詳細(xì)的使用說明。

?

控件名稱

MFC

說明

靜態(tài)控件

CStatic

用于顯示一些固定不變的文字或圖形

按鈕

CButton

用于產(chǎn)生某些命令消息,包括單選,復(fù)選和按鍵按鈕

編輯框

CEdit

用于完成文本和數(shù)字的輸入和編輯

列表框

CListBox

顯示一個(gè)列表,讓用戶從中選取一個(gè)或多個(gè)項(xiàng)

組合框

CComboBox

是一個(gè)列表框和編輯框組合的控件

列表控件

CListCtrl

包含圖標(biāo),標(biāo)簽顯示內(nèi)容的控件

樹形控件

CTreeCtrl

以樹結(jié)構(gòu)形式顯示一組信息,能夠反映這些信息的結(jié)構(gòu)

?

默認(rèn)情況下,所有靜態(tài)控件的ID標(biāo)識符都是IDC_STATIC,其表示是靜態(tài)的并且顯示的內(nèi)容不能夠改變,不能夠?yàn)檫@類控件添加成員變量,消息響應(yīng)函數(shù)等。如果需要?jiǎng)討B(tài)地改變靜態(tài)控件上的顯示,則需要為這些控件重新指定一個(gè)非IDC_STATICID標(biāo)識符,然后才能在程序中為靜態(tài)控件添加成員變量,消息響應(yīng)函數(shù)等。

可以調(diào)用CWnd類的GetDlgItem成員函數(shù)來獲取該控件的CWnd指針,或者通過調(diào)用GetDlgItemTextSetDlgItemText函數(shù)來改變靜態(tài)控件顯示的文本內(nèi)容。

?

常見的按鈕主要有三種類型:按鍵按鈕、單選按鈕和復(fù)選按鈕。一般而言,需要為按鈕添加單擊事件BN_CLICKED消息的消息響應(yīng)函數(shù)。同時(shí)可以調(diào)用CButton類的成員函數(shù)SetCheckGetCheck分別來設(shè)置或獲取指定按鈕的選中狀態(tài),原型如下:

void SetCheck(int nCheck);

int GetCheck() const;

其中nCheckGetCheck函數(shù)返回的值可是:0表示不選中,1表示選中,2表示不確定(僅用于三態(tài)按鈕)。對于同組多個(gè)單選按鈕的選中狀態(tài)的設(shè)置或獲取,需要調(diào)用窗口類Cwnd的成員函數(shù)CheckRadioButton GetCheckedRadioButton ,原型如下:

void CheckRadioButton (int nIDFirstButton, int nIDLastButton,int nIDCheckButton);

int GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton);

其中nIDFirstButton nIDLastButton 分別指定同組單選按鈕的第一個(gè)和最后一個(gè)按鈕的ID值;nIDCheckButton 用來指定要設(shè)置選中狀態(tài)的按鈕的ID值;函數(shù)GetCheckedRadioButton返回被選中的按鈕ID值。

MFC中提供支持位圖按鈕的CBitmapButton類,它是CButton類的派生類,最多可以為位圖按鈕指定按鈕的正常、按下、獲得焦點(diǎn)和被禁用的四副狀態(tài)位圖。

在創(chuàng)建位圖按鈕時(shí),首先需要為按鈕定義CBitmapButton類型的變量,然后調(diào)用CWnd類的成員函數(shù)SubclassDlgItem將變量關(guān)聯(lián)到按鈕控件上,再調(diào)用該類的的成員函數(shù)LoadBitmaps為按鈕加載相應(yīng)狀態(tài)的位圖,最后還可以調(diào)用SizeToContent函數(shù)來調(diào)整按鈕的大小以適合位圖。這些函數(shù)的聲明如下:

BOOL SubclassDlgItem(UINT ID,CWnd* pParent);

BOOL LoadBitmaps(LPCTSTR lpszBitmapResource,

??????????????? LPCTSTR lpszBitmapResourceSel = NULL,

?????? ????????? LPCTSTR lpszBitmapResourceFocus = NULL,

??????????????? LPCTSTR lpszBitmapResourceDisabled =NULL);

?

BOOL LoadBitmaps(UINT nIDBitmapResource,

??????????????? UINT nIDBitmapResourceSel = 0,

??????????????? UINT nIDBitmapResourceFocus = 0,

??????????????? UINT nIDBitmapResourceDisabled = 0);

在創(chuàng)建位圖按鈕時(shí),需要設(shè)置按鈕的OwnerDraw屬性為TRUE.

?

編輯框,作為一個(gè)讓用戶從鍵盤輸入和編輯文本的矩形框,當(dāng)文本被修改或唄滾動時(shí),會向父窗口發(fā)送一些消息,由此可以在屬性窗口中為編輯框控件添加這些消息的響應(yīng)函數(shù)。

消息列表:

EN_CHANGE ?當(dāng)編輯框中的文本已被修改,在新的文本顯示之后發(fā)送此消息

EN_HSCROLL 當(dāng)編輯框的水平滾動條被使用,在更新顯示之前發(fā)送此消息

EN_KILLFOCUS 編輯框失去鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息

EN_MAXTEXT 文本數(shù)目達(dá)到了限制值時(shí)發(fā)送此消息

EN_SETFOCUS 編輯框得到鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息

EN_UPDATE 編輯框的文本已被修改,新的文本顯示之前發(fā)送此消息

EN_VSCROLL 當(dāng)編輯框的垂直滾動條被使用,在更新顯示之前發(fā)送此消息

?

當(dāng)編輯框顯示多行文本內(nèi)容時(shí),通常需要使用LineScroll 成員函數(shù)來滾動顯示文本,使用GetLineCount來獲取多行文本的行數(shù)。

int GetLineCount() const;

void LineScroll( int nLine, int nChars = 0);

其中, nLine 指定了縱向滾動的行數(shù),nChars指定了水平滾動的字符數(shù)。但是如果指定了編輯框的對齊屬性,則nChars值無效。

?

列表框可分為單選,多選,擴(kuò)展多選以及非選擇四種類型,默認(rèn)風(fēng)格下的單選列表框讓用戶一次只能選擇一個(gè)項(xiàng);多選列表框則一次可以選擇多個(gè)項(xiàng),而擴(kuò)展多選列表框則充許用戶用鼠標(biāo)拖動或其他特殊組合鍵進(jìn)行選擇;非選列表框則不提供選擇功能。

?

當(dāng)列表框創(chuàng)建之后,往往要添加、刪除、修改或獲取列表框中的列表項(xiàng),這些操作都可調(diào)用MFCCListBox類成員函數(shù)來實(shí)現(xiàn)。此外,列表框的項(xiàng)除了用字符串來標(biāo)識外,還常常通過索引來確定。索引表明項(xiàng)目在列表框中排列的位置,它是以0為基準(zhǔn),即列表框中的第一項(xiàng)的索引是0,第二項(xiàng)為1等。列表框控件類CListBox常用的成員函數(shù)如下:

AddString? 向列表框中添加一個(gè)字符串

InsertString? 在列表框中指定位置插入一個(gè)字符串

DeleteString? 從列表框中刪除一個(gè)字符串

ResetContent 清空列表框所有入口

FindString 在列表框中刪除一個(gè)字符串

GetCurSel 返回列表框中當(dāng)前選擇項(xiàng)的索引

SetCurSel 選擇一個(gè)列表框字符串

GetText? 從列表框中獲取某項(xiàng)的字符串

?

組合框是一個(gè)列表框和編輯框組合的控件。組合框大致可分為兩類,一類是對組合框中的列表框進(jìn)行操作,另一類是對組合框中的編輯框進(jìn)行操作,這些操作都可以調(diào)用CComboBox成員函數(shù)來實(shí)現(xiàn),常用的成員函數(shù)如下:

AddString 在組合框中列表框的列表末尾添加一個(gè)字符串

DeleteString 刪除組合框中列表框中的一個(gè)字符串

InsertString 在組合框的列表框中插入一個(gè)字符串

ResetContent 刪除組合框中列表框和編輯框中的所有項(xiàng)

FindString 在組合框的列表框中查找具有指定前綴的第一個(gè)字符串

GetCurSel 取得組合框的列表框中當(dāng)前選中項(xiàng)的索引

SetCurSel 在組合框的列表框中選擇一個(gè)字符串

GetLBText 從組合框的列表框中取得第一個(gè)字符串

GetCount 取得組合框的項(xiàng)數(shù)

?

最后再來談?wù)?/span>DDXDDV技術(shù)

MFC提供的DDXDDV技術(shù)使用戶方便地對控件中的數(shù)據(jù)進(jìn)行操作。DDX將數(shù)據(jù)成員變量與對話框中的控件相關(guān)聯(lián),使得數(shù)據(jù)在控件之間或者控件與對話框之間能夠直接交換;DDV用于對控件中的數(shù)據(jù)進(jìn)行校驗(yàn),以保證數(shù)據(jù)的合法性和有效性。

在為對話框資源創(chuàng)建對話框類時(shí),MFC類向?qū)詣訛閷υ捒蝾愔刑砑訑?shù)據(jù)交換函數(shù)DoDataExchange, 并在該函數(shù)中添加相應(yīng)的數(shù)據(jù)交換函數(shù)或數(shù)據(jù)校驗(yàn)函數(shù)。

需要注意的是,用戶不能直接調(diào)用DoDataExchange 函數(shù),數(shù)據(jù)交換和校驗(yàn)是由MFC負(fù)責(zé)處理的。數(shù)據(jù)交換和校驗(yàn)機(jī)制都是由MFC框架實(shí)現(xiàn)的,MFC通過一組DDX交換函數(shù)和DDV驗(yàn)證函數(shù)來實(shí)現(xiàn)控件數(shù)據(jù)的交換和數(shù)據(jù)的驗(yàn)證。根據(jù)不同的控件類型,MFC提供了不同的數(shù)據(jù)交換函數(shù),它們都是以DDX_作為前綴的。同樣數(shù)據(jù)校驗(yàn)函數(shù)也都是以DDV_作為前綴,這些函數(shù)都不需要用戶自己添加,MFC會自動添加的。

?

需要注意的是: DoDataExchange 數(shù)據(jù)交換和數(shù)據(jù)校驗(yàn)函數(shù)都具有雙向性。當(dāng)為控件定義了數(shù)據(jù)變量后,可以通過CWnd::UpdateData函數(shù)實(shí)現(xiàn)對控件數(shù)據(jù)的輸入和讀取。當(dāng)以TRUE參數(shù)調(diào)用UpdateData函數(shù)時(shí),控件中的數(shù)據(jù)被保存到相關(guān)聯(lián)的成員變量中;如果以FALSE為參數(shù)調(diào)用UpdateData函數(shù)時(shí),則成員變量的值將被傳遞到控件上。

轉(zhuǎn)載于:https://www.cnblogs.com/AI-Algorithms/p/3337745.html

總結(jié)

以上是生活随笔為你收集整理的MFC项目实战(1)文件管理器--准备篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。