|
【案例】給Win32程序的「關於」對話框添加一個按鈕 |
一派掌門 二十級 |
首先,在Visual Studio(我用的版本是Premium 2012)中創建一個Win32項目工程,也就是:  然後編譯運行,運行結果是如下窗口:
|
一派掌門 二十級 |
在左邊的Solution Explorer中找到Win32Project1.rc文件,雙擊打開。
|
|
一派掌門 二十級 |
 雙擊IDD_ABOUTBOX打開。並在窗口中拖入一個按鈕,上面顯示的文字(Caption)隨便寫,這裡我寫的是Check。
|
|
一派掌門 二十級 |
|
|
一派掌門 二十級 |
默認分配給這個按鈕的ID是IDC_BUTTON1,這個會在之後的程序中用到:  打開Resource.h後就可以看到,其實這個ID是一個宏定義。
|
|
一派掌門 二十級 |
最後,打開主程序文件Win32Project1.cpp,在函數About里添加如下內容:  其中IDC_BUTTON1就是用於標示剛才所創建的按鈕,滑鼠點擊按鈕後執行的內容就是調用MessageBox這個對話框函數。
|
|
一派掌門 二十級 |
然後就可以運行程序了。  點擊剛才添加的Check按鈕後彈出MessageBox對話框:  其中的圖標i是由MB_ICONINFORMATION決定的。 可以選用其他值: MB_ICONWARNING 三角形的黃色驚嘆號 MB_ICONQUESTION 問號 MB_ICONERROR 紅叉
|
|
一派掌門 二十級 |
下面我來解釋一下這句話: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 其中IDOK就是點擊OK按鈕,IDCANCEL則是手動點擊About窗口右上角的關閉按鈕,或者在標題欄右鍵菜單中點擊了Close命令(如圖所示)。
|
|
一派掌門 二十級 |
 加了About窗口滑鼠左鍵點擊次數計數代碼。
|
|
一派掌門 二十級 |
更改按鈕上的文字: SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"Checked");
|
|
一派掌門 二十級 |
修改OK按鈕上的文字: HWND okbtn = GetDlgItem(hDlg, IDOK); // 獲取OK按鈕 SendMessage(okbtn, WM_SETTEXT, NULL, (LPARAM)L"Click me");
獲取一個複選框是否被選中: HWND checkbox = GetDlgItem(hDlg, IDC_CHECK1); int checked = SendMessage(checkbox, BM_GETCHECK, NULL, NULL); if (checked) { //選中了 }
禁用按鈕: EnableWindow(okbtn, false);
|
|
一派掌門 二十級 |
啟用XP風格控制項後: (啟用方法請參閱:https://zh.arslanbar.net/post.php?t=22016)
|
|
一派掌門 二十級 |
回復:12樓 程序: // Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static int counter = 0; UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE;
case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } else if (LOWORD(wParam) == IDC_BUTTON1) { wchar_t msg[30]; wsprintf(msg, L"Hello World!\nCounter: %d", counter); MessageBox(hDlg, msg, L"Hello", MB_ICONINFORMATION); SendMessage((HWND)lParam, WM_SETTEXT, NULL, (LPARAM)L"Checked");
HWND okbtn = GetDlgItem(hDlg, IDOK); // get OK button SendMessage(okbtn, WM_SETTEXT, NULL, (LPARAM)L"Click me");
HWND checkbox = GetDlgItem(hDlg, IDC_CHECK1); int checked = SendMessage(checkbox, BM_GETCHECK, NULL, NULL); EnableWindow(okbtn, !checked); } break; case WM_LBUTTONUP: counter++; break; } return (INT_PTR)FALSE; }
|
|
一派掌門 二十級 |
關於wchar_t寬字符數組的用法,請參閱: https://zh.arslanbar.net/post.php?t=23331(適合已經學過char字符數組和char *字符串指針的讀者)
|
|