MFC項目實戰(1)文件管理器--準備篇

本程序主要實現如下功能:

程序通過左邊的樹形控件顯示本地計算機中目錄的結構,右邊的列表控件則負責響應樹形控件中選擇的目錄節點并把此節點中的所有項在列表框中顯示出來,列表框支持奇偶行顏色設置,選中顏色設置和熱點顏色設置;

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

同時支持地址欄跳轉功能。支持屬性欄的時間顯示

程序主界面:

?

image

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

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

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

,然后點擊添加類(Add class)新建一個CModeDlg類(即在彈出的MFC類向導對話中,在對話框的“類名”欄中輸入CModeDlg,并選擇該類的基類為CDialog類。單擊“完成”按鈕以新建CModeDlg類。)如圖:

image

?

同樣,在NonModeDlg對話框中右鍵,選擇類向導(Class Wizard)然后添加一個CNonModeDlg類。然后打開IDD_DEMO_DIALOG對話框,在它上面添加兩個按鈕,分別命名為ModeDlgNonModeDlg ,同時這兩個按鈕的ID號分別換成IDC_MDlg ,IDC_NMDlg。然后右鍵點擊ModeDlg按鈕選擇添加事件句柄(Add Event Handler...image,在彈出的事件句柄向導對話框中,為按鈕選擇單擊事件,所以消息類型選擇BN_CLICKED,按鈕是在IDD_DEMO_DIALOG對話框上,所以它的消息事件應該建立在CDemoDlg這個類里面,最后函數句柄的名稱默認即可。具體如圖:?

image

?

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

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

#include"ModeDlg.h"

#include"NonModeDlg.h"

然后回到DemoDlg.cpp文件,在剛添加的ModeDlg按鈕響應函數中,創建CModeDlg類的實例,并調用DoModal函數顯示對話框,代碼如下:

void CDemoDlg::OnBnClickedMdlg()

{

??? CModeDlg dlg;? //創建CModeDlg類實例dlg

??? dlg.DoModal();? //調用DoModal()函數顯示對話框

}

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

void CDemoDlg::OnBnClickedNmdlg()

{

??? CNonModeDlg *pDlg = new CNonModeDlg();// 創建一個CNonModeDlg類的實例

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

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

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

}

?

注意Create()函數中的第一個參數是無模式對話框的ID號,當編寫完

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

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

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

void CNonModeDlg::PostNcDestroy()

{

??? delete this;

??? CDialog::PostNcDestroy();

}

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

?

控件名稱

MFC

說明

靜態控件

CStatic

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

按鈕

CButton

用于產生某些命令消息,包括單選,復選和按鍵按鈕

編輯框

CEdit

用于完成文本和數字的輸入和編輯

列表框

CListBox

顯示一個列表,讓用戶從中選取一個或多個項

組合框

CComboBox

是一個列表框和編輯框組合的控件

列表控件

CListCtrl

包含圖標,標簽顯示內容的控件

樹形控件

CTreeCtrl

以樹結構形式顯示一組信息,能夠反映這些信息的結構

?

默認情況下,所有靜態控件的ID標識符都是IDC_STATIC,其表示是靜態的并且顯示的內容不能夠改變,不能夠為這類控件添加成員變量,消息響應函數等。如果需要動態地改變靜態控件上的顯示,則需要為這些控件重新指定一個非IDC_STATICID標識符,然后才能在程序中為靜態控件添加成員變量,消息響應函數等。

可以調用CWnd類的GetDlgItem成員函數來獲取該控件的CWnd指針,或者通過調用GetDlgItemTextSetDlgItemText函數來改變靜態控件顯示的文本內容。

?

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

void SetCheck(int nCheck);

int GetCheck() const;

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

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

int GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton);

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

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

在創建位圖按鈕時,首先需要為按鈕定義CBitmapButton類型的變量,然后調用CWnd類的成員函數SubclassDlgItem將變量關聯到按鈕控件上,再調用該類的的成員函數LoadBitmaps為按鈕加載相應狀態的位圖,最后還可以調用SizeToContent函數來調整按鈕的大小以適合位圖。這些函數的聲明如下:

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);

在創建位圖按鈕時,需要設置按鈕的OwnerDraw屬性為TRUE.

?

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

消息列表:

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

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

EN_KILLFOCUS 編輯框失去鍵盤輸入焦點時發送此消息

EN_MAXTEXT 文本數目達到了限制值時發送此消息

EN_SETFOCUS 編輯框得到鍵盤輸入焦點時發送此消息

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

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

?

當編輯框顯示多行文本內容時,通常需要使用LineScroll 成員函數來滾動顯示文本,使用GetLineCount來獲取多行文本的行數。

int GetLineCount() const;

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

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

?

列表框可分為單選,多選,擴展多選以及非選擇四種類型,默認風格下的單選列表框讓用戶一次只能選擇一個項;多選列表框則一次可以選擇多個項,而擴展多選列表框則充許用戶用鼠標拖動或其他特殊組合鍵進行選擇;非選列表框則不提供選擇功能。

?

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

AddString? 向列表框中添加一個字符串

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

DeleteString? 從列表框中刪除一個字符串

ResetContent 清空列表框所有入口

FindString 在列表框中刪除一個字符串

GetCurSel 返回列表框中當前選擇項的索引

SetCurSel 選擇一個列表框字符串

GetText? 從列表框中獲取某項的字符串

?

組合框是一個列表框和編輯框組合的控件。組合框大致可分為兩類,一類是對組合框中的列表框進行操作,另一類是對組合框中的編輯框進行操作,這些操作都可以調用CComboBox成員函數來實現,常用的成員函數如下:

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

DeleteString 刪除組合框中列表框中的一個字符串

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

ResetContent 刪除組合框中列表框和編輯框中的所有項

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

GetCurSel 取得組合框的列表框中當前選中項的索引

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

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

GetCount 取得組合框的項數

?

最后再來談談DDXDDV技術

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

在為對話框資源創建對話框類時,MFC類向導將會自動為對話框類中添加數據交換函數DoDataExchange, 并在該函數中添加相應的數據交換函數或數據校驗函數。

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

?

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

轉載于:https://www.cnblogs.com/AI-Algorithms/p/3337745.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器tomcat配置教程

2018年上學期期末課程設計做了一個留言板,但是我需要把這個Jave Web弄到我的服務器上 首先我們可以安裝jdk tomcat在啟動時,會讀取環境變量的信息,需要一個CATALINA_HOME 與JAVA_HOME的信息 CATALINA_HOME即tomcat的主目錄, JAVA_…

使用tab鍵分割的文章能快速轉換成表格。( )_EXCEL的163種使用技巧集錦-42~62

本文主要講述了EXCEL的163種使用技巧其中20條技巧,待163種使用技巧全部講述完成后,如有需要,各位看官可在評論中留下郵箱,小編會將整理的WORD版發給大家。42. 快速查找工作簿 你可以利用在工作表中的任何文字進行搜尋,…

負載測試工具Ripplet

負載測試工具RippletRipplet的最新版本:0.8bRipplet特征:1)基于Apache License 2.0許可證;2)軟件程序性能和負載測試工具;3)有四個分布式的Java組件:測試注入引擎、服務器/產品監視器…

解決ubuntu中vi不能正常使用方向鍵與退格鍵的問題

方案一: 問題: ubuntu中vi在編輯狀態下方向鍵不能用,還有回格鍵不能刪除等我們平時習慣的一些鍵都不能使用。 解決辦法: 可以安裝vim full版本,在full版本下鍵盤正常,安裝好后同樣使用vi命令。 安裝vim&…

android通過代碼設置鈴聲_第六十四回:Android中UI控件之SeekBar

各位看官們,大家好,上一回中咱們說的是Android中UI控件之ProgressBar的例子,這一回咱們的例子是UI控件之SeekBar。閑話休提,言歸正轉。讓我們一起Talk Android吧!看官們,SeekBar通常翻譯為拖動條&#xff0…

轉帖:組策略

1.什么是組策略 注冊表是Windows系統中保存系統軟件和應用軟件配置的數據庫,而隨著Windows功能越來越豐富,注冊表里的配置項目也越來越多,很多配置都可以自定義設置,但這些配置分布在注冊表的各個角落,如果是手工配置&…

SQL中的left outer join,inner join,right outer join用法 (左右內連接)

SQL語句中的left outer join,inner join,right outer join用法left outer joinleft join , right outer joinright join, inner joinjoin.使用關系代數合并數據 1 關系代數 合并數據集合的理論基礎是關系代數,它是由E.F.Codd于1970年提出的。 在關系代數的形式…

利舊IBM X3650m2 安裝esxi5.1提供云桌面(備忘)

上面左邊是我的個人微信,如需進一步溝通,請加微信。 右邊是我的公眾號“Openstack私有云”,如有興趣,請關注。公司有一臺舊服務器,原來的IBM X3650m2 服務器,2物理CPU,24G內存,8塊3…

asp登錄頁面跳轉到注冊頁面_Java 添加頁面跳轉按鈕到PDF文檔

概述當我們在查閱含有大量頁面的PDF時,可通過在頁面上添加跳轉按鈕來實現頁面轉換,以達到節約時間,提高效率的目的。本文將通過Java程序來演示如何給PDF文檔添加頁面跳轉按鈕。通常來說跳轉可分為兩種情況:一是跳轉至特殊頁面(首頁…

和我一起學WCF(6):宿主(Hosting)

WCF所支持的宿主服務: 1.Self-hosting:控制臺應用程序,Windows應用程序,Windows服務,HTTP,TCP,named pipes,MSMQ 2.IIS/ASP.NET 3.Windows Activation Service ServiceHost實例必須進行初始化為服務暴露出端點(endpoint) 每個ServiceHost與指定的服務類型相關聯 核心方法: Open…

.Net FrameWork

.NET Micro Framework白皮書http://download.microsoft.com/download/3/1/9/319f7469-70bd-4e7c-a6cc-e5ad96939af4/net_micro_framework_whitepaper_v_1.0.docWhat is "Type" in managed heap?http://www.cnblogs.com/artech/archive/2007/06/04/769805.html轉載于…

Retrofit+RxJava聯網工具類

在python 進程、線程 (一)中簡單的說過,CPython中的GIL使得同一時刻只能有一個線程運行,即并發執行。并且即使是多核CPU,GIL使得同一個進程中的多個線程也無法映射到多個CPU上運行,這么做最初是為了安全著想,慢慢的也成…

確定最佳聚類數matlab代碼_詳解DBSCAN聚類

使用DBSCAN標識為員工分組照片由Ishan seefromthesky 在 Unsplash拍攝基于密度的噪聲應用空間聚類(DBSCAN)是一種無監督的ML聚類算法。無監督的意思是它不使用預先標記的目標來聚類數據點。聚類是指試圖將相似的數據點分組到人工確定的組或簇中。它可以替代KMeans和層次聚類等流…

Arrays.asList 使用細節

通常初始化后使用如下,但是報錯 UnsupportOperationException.... 根據提示信息,就是調用add()方法時拋出了異常。順著堆棧信息往上找,提示的是AbstractList類的108行出了異常,這一行所在方法的具體實現如下: //108行 …

[分享] 精神崩潰的老鼠

李國棟床上堆著書,每天晚上睡在榻榻米上,讀書讀到凌晨一兩點,讀到兩眼充血,像針扎一樣痛苦,才把書放開。蜷縮到榻榻米上,用繩子把左腿跟一只桌腳綁在一起,熄了燈睡覺。 “這樣一來&#xff0…

(七)整合spring cloud云服務架構 - common-service 項目構建過程

我們將對common-service整個項目進行剖析,將整個構建的流程給記錄下來,讓更多的關注者來參考學習。首先在構建spring cloud的common-service之前,我們需要準備的技術:Maven(項目構建)、Spring Boot、Spring…

python list元素合并_python list 合并連接字符串的方法

python list 合并連接字符串的方法 更新時間:2013年03月09日 22:02:18 作者: python 列表合并字符串,我們一般會用到字符串的join方法來操作。下面通過代碼的形式,詳細的說下list怎么拼成字符串? 相關文章這篇文章主要…

修改citrix 默認偵聽端口的命令和XML Service端口

修改citrix 默認偵聽端口的命令: 在命令行下輸入icaport /port:2494,或你所想改成的端口 如果輸入 icaport /reset 恢復默認偵聽端口 ctxxmlss /r8080 在citrix的外部客戶端通過web方式登陸時,提示“the alternate address cannot…

spfa算法

1 轉載于:https://www.cnblogs.com/Emcikem/p/11346073.html

集成方法-概念理解

集成方法(ensemble method)又叫元算法(meta-algorithm):將不同的分類器組合起來。 通俗的說:就是三個臭皮匠賽過諸葛亮。做決定時,考慮多個人的意見,不是一個人的意見 集成方法&…