创建基于对话框的Win32应用程序(三) —— Checkbox的应用、窗体置顶
上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件。这一节中我们将学习使用Checkbox控件,并实现将窗体置顶的功能。
17、首先切换到Reasource View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Checkbox控件如下:
images/loading.gif' data-original="http://images2015.cnblogs.com/blog/1022478/201609/1022478-20160918155007934-2077799335.png" />
18、右键选中的控件点击Propertise修改相关内容。
19、在被调用的命令消息响应函数(Dlg_OnCommand)中添加对新增控件的响应操作。
其中HWND_TOPMOST将使窗体具备置顶属性。
20、此时按下F5 Start Debugging,再点击“On Top”复选框,可以发现对话框已被置顶,再次点击则取消。
接下来考虑让对话框默认具备置顶属性,同时“On Top”复选框默认被点选。
21、定义对话框的初始化消息响应函数(Dlg_OnInitDialog),并在对话框的回调函数(Dlg_Proc)中利用上一节的宏替换调用该函数。
1 #include <Windows.h> 2 #include <windowsx.h> 3 #include <tchar.h> 4 #include "Resource.h" 5 6 // The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog 7 // boxes because DlgProc returns a BOOL instead of an LRESULT (like 8 // WndProcs). This chHANDLE_DLGMSG macro corrects the problem: 9 #define chHANDLE_DLGMSG(hWnd, message, fn) \10 case (message): return (SetDlgMsgResult(hWnd, uMsg, \11 HANDLE_##message((hWnd), (wParam), (lParam), (fn))))12 13 INT_PTR WINAPI NewDlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {14 switch (uMsg)15 {16 case WM_CLOSE:17 EndDialog(hWnd, 0);18 break;19 }20 21 return(FALSE);22 }23 24 void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) {25 switch (id) {26 case IDC_CHECKONTOP:27 SetWindowPos(hWnd, IsDlgButtonChecked(hWnd, IDC_CHECKONTOP)28 ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);29 break;30 case IDNEW:31 DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_NEWDIALOG),32 hWnd, NewDlg_Proc, NULL);33 break;34 case IDCANCEL:35 SendMessage(hWnd, WM_CLOSE, 0, 0);36 break;37 38 }39 }40 41 BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {42 SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);43 CheckDlgButton(hWnd, IDC_CHECKONTOP, BST_CHECKED);44 45 return(TRUE);46 }47 48 INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {49 switch (uMsg)50 {51 chHANDLE_DLGMSG(hWnd, WM_INITDIALOG, Dlg_OnInitDialog);52 chHANDLE_DLGMSG(hWnd, WM_COMMAND, Dlg_OnCommand);53 case WM_CLOSE:54 EndDialog(hWnd, 0);55 break;56 }57 58 return(FALSE);59 }60 61 int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {62 DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_DIALOG),63 NULL, Dlg_Proc, _ttoi(pszCmdLine));64 65 return(0);66 }
Win32WindowsApplication.cpp
1 // Microsoft Visual C++ generated resource script. 2 // 3 #include "resource.h" 4 5 #define APSTUDIO_READONLY_SYMBOLS 6 ///////////////////////////////////////////////////////////////////////////// 7 // 8 // Generated from the TEXTINCLUDE 2 resource. 9 // 10 #include "winres.h" 11 12 ///////////////////////////////////////////////////////////////////////////// 13 #undef APSTUDIO_READONLY_SYMBOLS 14 15 ///////////////////////////////////////////////////////////////////////////// 16 // Chinese (Simplified, PRC) resources 17 18 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) 19 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED 20 21 #ifdef APSTUDIO_INVOKED 22 ///////////////////////////////////////////////////////////////////////////// 23 // 24 // TEXTINCLUDE 25 // 26 27 1 TEXTINCLUDE 28 BEGIN 29 "resource.h\0" 30 END 31 32 2 TEXTINCLUDE 33 BEGIN 34 "#include ""winres.h""\r\n" 35 "\0" 36 END 37 38 3 TEXTINCLUDE 39 BEGIN 40 "\r\n" 41 "\0" 42 END 43 44 #endif // APSTUDIO_INVOKED 45 46 47 ///////////////////////////////////////////////////////////////////////////// 48 // 49 // Dialog 50 // 51 52 IDD_DIALOG DIALOGEX 0, 0, 309, 177 53 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 54 CAPTION "Win32WindowsApplication" 55 FONT 8, "MS Shell Dlg", 400, 0, 0x1 56 BEGIN 57 DEFPUSHBUTTON "New",IDNEW,198,156,50,14 58 PUSHBUTTON "Cancel",IDCANCEL,252,156,50,14 59 CONTROL "On Top",IDC_CHECKONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,160,39,10 60 END 61 62 IDD_NEWDIALOG DIALOGEX 0, 0, 83, 26 63 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 64 CAPTION "NewDialog" 65 FONT 8, "MS Shell Dlg", 400, 0, 0x1 66 BEGIN 67 LTEXT "This is a new dialog.",IDC_STATIC,7,7,68,11 68 END 69 70 71 ///////////////////////////////////////////////////////////////////////////// 72 // 73 // DESIGNINFO 74 // 75 76 #ifdef APSTUDIO_INVOKED 77 GUIDELINES DESIGNINFO 78 BEGIN 79 IDD_DIALOG, DIALOG 80 BEGIN 81 LEFTMARGIN, 7 82 RIGHTMARGIN, 302 83 TOPMARGIN, 7 84 BOTTOMMARGIN, 170 85 END 86 87 IDD_NEWDIALOG, DIALOG 88 BEGIN 89 LEFTMARGIN, 7 90 RIGHTMARGIN, 76 91 TOPMARGIN, 7 92 BOTTOMMARGIN, 19 93 END 94 END 95 #endif // APSTUDIO_INVOKED 96 97 98 ///////////////////////////////////////////////////////////////////////////// 99 //100 // AFX_DIALOG_LAYOUT101 //102 103 IDD_DIALOG AFX_DIALOG_LAYOUT104 BEGIN105 0106 END107 108 IDD_NEWDIALOG AFX_DIALOG_LAYOUT109 BEGIN110 0111 END112 113 #endif // Chinese (Simplified, PRC) resources114 /////////////////////////////////////////////////////////////////////////////115 116 117 118 #ifndef APSTUDIO_INVOKED119 /////////////////////////////////////////////////////////////////////////////120 //121 // Generated from the TEXTINCLUDE 3 resource.122 //123 124 125 /////////////////////////////////////////////////////////////////////////////126 #endif // not APSTUDIO_INVOKED
Win32WindowsApplication.rc
1 //{{NO_DEPENDENCIES}} 2 // Microsoft Visual C++ generated include file. 3 // Used by Win32WindowsApplication.rc 4 // 5 #define IDD_DIALOG 101 6 #define IDD_NEWDIALOG 103 7 #define IDNEW 1001 8 #define IDC_CHECKONTOP 1002 9 10 // Next default values for new objects11 // 12 #ifdef APSTUDIO_INVOKED13 #ifndef APSTUDIO_READONLY_SYMBOLS14 #define _APS_NEXT_RESOURCE_VALUE 10515 #define _APS_NEXT_COMMAND_VALUE 4000116 #define _APS_NEXT_CONTROL_VALUE 100317 #define _APS_NEXT_SYMED_VALUE 10118 #endif19 #endif
resource.h
22、此时再按下F5 Start Debugging,可以发现“On Top”复选框默认被点选,同时对话框已被置顶。
————————————————
本文为本人原创,转载请注明出处。
原标题:Creating Dialogbased Win32 Application / 创建基于对话框的Win32应用程序(三)Checkbox的应用、窗体置顶 / Win32, VC++, Windows
关键词:Windows