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