1. 程式人生 > >複習MFC之clean-溫故而知新

複習MFC之clean-溫故而知新

一、新建工程

基於對話方塊

MFC標準

二、模態

拖按鈕的控制元件,雙擊進入是他的訊息程式碼

右鍵那個按鈕,新增DLG類COneDlg,其他預設

然後在主對話方塊的標頭檔案中新增新建對話方塊的頭

#include “OneDlg.h”

然後在按鈕的訊息程式碼中新增

COneDlg dlg; dlg.DoModal();

三、非模態

拖按鈕的控制元件,雙擊進入是他的訊息程式碼

右鍵那個按鈕,新增DLG類CTwoDlg,其他預設

然後在主對話方塊的標頭檔案中新增新建對話方塊的頭

#include “TwoDlg.h”

然後在按鈕的訊息程式碼中新增

CTwoDlg *dlg = new CTwoDlg; dlg->Create(IDD_DIALOG1,this); //建立非模態對話方塊 dlg->ShowWindow(SW_SHOW); //顯示

三、新增圖片並實現兩個圖片的變換

1、先拖控制元件Picture control

改屬性

type:bitmap

ID :IDC_PICTURE

IMAGE: IDB_BITMAP7

NOTIFY : TRUE

2、右鍵主dlg的圖片新增事件處理程式,單擊在主dlg

3、右鍵主dlg的圖片新增變數m_picture

4、在主dlg.h中定義變數

public:

HBITMAP m_hBitmap7; HBITMAP m_hBitmap8; bool m_bChangeBmpFlag;

5、在主dlg初始化函式中新增圖片變數的賦值

m_hBitmap7 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7)); m_hBitmap8 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP8));

6、在主dlg的構造中初始化bool變數的值

m_bChangeBmpFlag = false;

7、在點選圖片的訊息中新增變換圖片的程式碼

if(m_bChangeBmpFlag == false) m_picture.SetBitmap(m_hBitmap8); else m_picture.SetBitmap(m_hBitmap7);

m_bChangeBmpFlag = !m_bChangeBmpFlag;

四、新增tablectrl標籤

1、拖控制元件tab control

2、類檢視中新增類:CMyTabCtrl

繼承 : CTabCtrl

3、在主dlg的標頭檔案中新增

#include “MyTableCtrl.h”

然後後面

public:

CMyTableCtrl m_tab;

4、在原始檔DoDataExchange()函式中繫結,新增程式碼:

DDX_Control(pDX, IDC_TAB1, m_tab);

5、在OnInitDialog()函式中新增

m_tab.InsertItem(0,L”清掃目錄”); m_tab.InsertItem(1,L”顯示目錄”); m_tab.InsertItem(2,L”設定目錄”); m_tab.InsertItem(3,L”掃描刪除”); CSize size(0,30); m_tab.SetItemSize(size);         //設定高度和寬度

6、將其寫進函式裡面(在MyTableCtrl的標頭檔案和原始檔)

標頭檔案宣告函式:

public: void InitTableCtrl();

原始檔實現函式

void CMyTableCtrl::InitTableCtrl() { this->InsertItem(0,L”清掃目錄”); this->InsertItem(1,L”顯示目錄”); this->InsertItem(2,L”設定目錄”); this->InsertItem(3,L”掃描刪除”); CSize size(0,30); this->SetItemSize(size); }

在OnInitDialog()函式裡面呼叫函式(主dlg的函式)

m_tab.InitTableCtrl();

五、新增標籤下顯示的DLG

1、新增dlg的資源

2、給對話方塊新增一個類:CShowDlg

3、定義類的物件

在tablectrl的標頭檔案新增:

#include “ShowDlg.h”

定義物件:

public: CShowDlg m_dlgShow;

4、修改dlg的屬性

ID : IDD_SHOW_DLG

BORDER : NONE                     //去掉邊框

STYLE : CHILD                        //出現在主DLG裡面

5、初始化  (直接貼上會覆蓋標籤欄,需要向下移動30單位的大小)(非模態出現dlg)

m_dlgShow.Create(IDD_SHOW_DLG,this); CRect rect; //獲取 標籤 矩形框 this->GetClientRect(rect); rect.top+=30; rect.bottom+=30; //把 m_dlgShow 視窗相對於 標籤 向下移動30 m_dlgShow.MoveWindow(rect);

m_dlgShow.ShowWindow(SW_SHOW);

六,新增第一個按鈕的功能(顯示一個瀏覽資料夾的對話方塊)

在按鈕事件下面新增下列程式碼:

wchar_t szFolderName[MAX_PATH] = {0}; //儲存資料夾的名字 wchar_t szFolderPath[MAX_PATH] = {0}; //儲存資料夾的路徑 BROWSEINFO info; info.hwndOwner = this->m_hWnd; //哪個視窗擁有這個對話方塊 info.pidlRoot = NULL; //NULL是從桌面資料夾開始瀏覽 info.pszDisplayName = szFolderName; //接收資料夾的名字 info.lpszTitle = L”選擇一個吧!O(∩_∩)O”; //標題 info.ulFlags = NULL; //新增額外的控制元件 info.lpfn = NULL; info.lParam = NULL; info.iImage = NULL;

PCIDLIST_ABSOLUTE pa = ::SHBrowseForFolder(&info); //顯示一個瀏覽資料夾的對話方塊

::SHGetPathFromIDList(pa,szFolderPath);

將其封裝成一個函式

在app(標頭檔案)上新增函式宣告:

public: static CString GetBrowseFolderSelectPath(CWnd* pWnd); //獲取 瀏覽對話方塊的選擇的路徑

在實現裡面寫:

CString CMy26App::GetBrowseFolderSelectPath(CWnd* pWnd) { wchar_t szFolderName[MAX_PATH] = {0}; //儲存資料夾的名字 wchar_t szFolderPath[MAX_PATH] = {0}; //儲存資料夾的路徑 BROWSEINFO info; info.hwndOwner = pWnd->m_hWnd; //哪個視窗擁有這個對話方塊 info.pidlRoot = NULL; //NULL是從桌面資料夾開始瀏覽 info.pszDisplayName = szFolderName; //接收資料夾的名字 info.lpszTitle = L”選擇一個吧!O(∩_∩)O”; //標題 info.ulFlags = NULL; //新增額外的控制元件 info.lpfn = NULL; info.lParam = NULL; info.iImage = NULL;

PCIDLIST_ABSOLUTE pa = ::SHBrowseForFolder(&info); //顯示一個瀏覽資料夾的對話方塊

if(::SHGetPathFromIDList(pa,szFolderPath) == TRUE) { int a = 100; if(wcscmp(szFolderPath,L” “) != 0) //獲取成功了 { return szFolderPath; } } return L””;

}

在按鈕事件下面呼叫:

void CShowDlg::OnBnClickedButton1() { // TODO: 在此新增控制元件通知處理程式程式碼 CString strPath = CMy26App::GetBrowseFolderSelectPath(this); if(strPath != L””) { //在列表上插入 } }

七、在主檢視上顯示新增的資料夾

1、在類檢視上新增類 CShowPathListCtrl

基類CListCtrl

完成

2、在副DLG標頭檔案新增

#include “ShowPathListCtrl.h”

public: CShowPathListCtrl m_listctrlShowPath;

3、在原始檔中繫結(DoDataExchange函式)

DDX_Control(pDX,IDC_LIST1,m_listctrlShowPath);

//IDC_LIST1是副視窗上主顯示視窗的ID

4、修改副視窗上主顯示視窗的屬性,將圖示ICON顯示改為LIST列表顯示

5、第一個按鈕點選的訊息改為

void CShowDlg::OnBnClickedButton1() { // TODO: 在此新增控制元件通知處理程式程式碼 CString strPath = CMy26App::GetBrowseFolderSelectPath(this); if(strPath != L””) { //在列表上插入 m_listctrlShowPath.InsertItem(m_listctrlShowPath.GetItemCount(),strPath); } }

6、新增複選框

類檢視showdlg右鍵屬性->重寫->OnInitDialog->新增

將實現改為

BOOL CShowDlg::OnInitDialog() { CDialogEx::OnInitDialog();

m_listctrlShowPath.SetExtendedStyle(LVS_EX_CHECKBOXES); //新增複選按鈕 return TRUE; // return TRUE unless you set the focus to a control

}

八、實現第二個按鈕和第三個按鈕的功能

void CShowDlg::OnBnClickedButton2() { // TODO: 在此新增控制元件通知處理程式程式碼 for(int i = 0; i<m_listctrlShowPath.GetItemCount();i++) { //判斷i 這一項是否選中 if(m_listctrlShowPath.GetCheck(i) == TRUE) //刪除這一項 m_listctrlShowPath.DeleteItem(i); } }

void CShowDlg::OnBnClickedButton3() { // TODO: 在此新增控制元件通知處理程式程式碼

//刪除所有項 m_listctrlShowPath.DeleteAllItems();

}

九、新增右鍵事件處理

1、ShowPathListCtrl類右鍵屬性 新增滑鼠右擊事件(=NM_RCLICK)

刪掉TN和下面那行

2、資源檢視新增menu

第一行隨便填

下面寫要新增的東西

3、在標頭檔案新增右鍵列表選單

CMenu menu; //淚飆的右鍵選單

4、在構造裡面

menu.LoadMenu(IDR_MENU1); //載入選單

在右擊事件函式中寫入

//獲取游標的座標 POINT point; ::GetCursorPos(&point); //彈出選單 menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);

5、在資源檢視的MENU的物件中的每一個下拉欄目中新增事件處理程式

之前這些功能都寫過,直接複製貼上就成

將“m_listctrlShowPath.”改為“this->”

退出的函式中寫

AfxGetMainWnd()->PostMessage(WM_CLOSE);