創建基於對話框的Win32應用程式(三) —— Checkbox的應用、窗體置頂、設置圖標 上一節創建的窗體應用程式中,我們用到了Button和StaticText這兩個控制項。這一節中我們將學習使用Checkbox控制項,並實現將窗體置頂的功能。 17、首先切換到Reasource View(Ctrl ...
創建基於對話框的Win32應用程式(三) —— Checkbox的應用、窗體置頂、設置圖標
上一節創建的窗體應用程式中,我們用到了Button和StaticText這兩個控制項。這一節中我們將學習使用Checkbox控制項,並實現將窗體置頂的功能。
17、首先切換到Reasource View(Ctrl+Shift+E),找到待修改的主窗體,並從Toolbox(Ctrl+Atl+X)中添加Checkbox控制項如下:
18、右鍵選中的控制項點擊Propertise修改相關內容。
19、在被調用的命令消息響應函數(Dlg_OnCommand)中添加對新增控制項的響應操作。
其中HWND_TOPMOST將使窗體具備置頂屬性。
20、此時按下F5 Start Debugging,再點擊“On Top”覆選框,可以發現對話框已被置頂,再次點擊則取消。
接下來考慮讓對話框預設具備置頂屬性,同時“On Top”覆選框預設被點選。
21、定義對話框的初始化消息響應函數(Dlg_OnInitDialog),併在對話框的回調函數(Dlg_Proc)中利用上一節的巨集替換調用該函數。
22、在初始化消息響應函數(Dlg_OnInitDialog)中,我們還可以為對話框設置圖標。
1 #include <Windows.h> 2 #include <windowsx.h> 3 #include <tchar.h> 4 #include "Resource.h" 5 6 // Sets the dialog box icons 7 inline void chSETDLGICONS(HWND hWnd, int idi) { 8 SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM) 9 LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), 10 MAKEINTRESOURCE(idi))); 11 SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM) 12 LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), 13 MAKEINTRESOURCE(idi))); 14 } 15 16 // The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog 17 // boxes because DlgProc returns a BOOL instead of an LRESULT (like 18 // WndProcs). This chHANDLE_DLGMSG macro corrects the problem: 19 #define chHANDLE_DLGMSG(hWnd, message, fn) \ 20 case (message): return (SetDlgMsgResult(hWnd, uMsg, \ 21 HANDLE_##message((hWnd), (wParam), (lParam), (fn)))) 22 23 INT_PTR WINAPI NewDlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 24 switch (uMsg) 25 { 26 case WM_CLOSE: 27 EndDialog(hWnd, 0); 28 break; 29 } 30 31 return(FALSE); 32 } 33 34 void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) { 35 switch (id) { 36 case IDC_CHECKONTOP: 37 SetWindowPos(hWnd, IsDlgButtonChecked(hWnd, IDC_CHECKONTOP) 38 ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 39 break; 40 case IDNEW: 41 DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_NEWDIALOG), 42 hWnd, NewDlg_Proc, NULL); 43 break; 44 case IDCANCEL: 45 SendMessage(hWnd, WM_CLOSE, 0, 0); 46 break; 47 48 } 49 } 50 51 BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) { 52 chSETDLGICONS(hWnd, IDI_ICON1); 53 54 SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 55 CheckDlgButton(hWnd, IDC_CHECKONTOP, BST_CHECKED); 56 57 return(TRUE); 58 } 59 60 INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 61 switch (uMsg) 62 { 63 chHANDLE_DLGMSG(hWnd, WM_INITDIALOG, Dlg_OnInitDialog); 64 chHANDLE_DLGMSG(hWnd, WM_COMMAND, Dlg_OnCommand); 65 case WM_CLOSE: 66 EndDialog(hWnd, 0); 67 break; 68 } 69 70 return(FALSE); 71 } 72 73 int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) { 74 DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_DIALOG), 75 NULL, Dlg_Proc, _ttoi(pszCmdLine)); 76 77 return(0); 78 }Win32WindowsApplication.cpp
23、此時再按下F5 Start Debugging,可以發現“On Top”覆選框預設被點選,同時對話框已被置頂,對話框左上角以及.exe文件出現了我們添加的圖標。
————————————————
本文為本人原創,轉載請註明出處。