图片 33

窗体置顶,成立基于对话框的Windows应用程序

创建基于对话框的Windows应用程序(三) ——
Checkbox的应用、窗体置顶、设置图标

创建基于对话框的Windows应用程序(二) ——
Button的应用、新建子窗体

 

 

  上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件。这一节中我们将学习使用Checkbox控件,并实现将窗体置顶和设置图标的功能。

  可以发现上一节创建的窗体中,点击OK和Cancel两个按钮是没有任何反应的。现在我们来为他们添加退出对话框的功能。

17、首先切换到Reasource
View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Checkbox控件如下:

6、首先定义命令消息响应函数(Dlg_OnCommand)如下:

 图片 1

 图片 2

图片 3

其中IDOK和IDCANCEL分别是按钮OK和Cancel对应的标识符。

18、右键选中的控件点击Propertise修改相关内容。

7、接下来定义宏替换如下:

 图片 4

 图片 5

图片 6

8、再在回调函数(Dlg_Proc)中利用宏替换调用命令消息响应函数(Dlg_OnCommand)如下:

图片 7

 图片 8

19、在被调用的命令消息响应函数(Dlg_OnCommand)中添加对新增控件的响应操作。

9、由于HANDLE_WM_COMMAND是在windowsx.h头文件中定义的,故添加其引用。

 图片 9

 图片 10

其中HWND_TOPMOST将使窗体具备置顶属性。

10、此时按下F5 Start
Debugging,再点击OK或Cancel按钮可以看到新建的对话框将会关闭。

20、此时按下F5 Start Debugging,再点击“On
Top”复选框,可以发现对话框已被置顶,再次点击则取消。

 图片 11

 图片 12

  下面我们演示如何新建子窗体。

接下来考虑让对话框默认具备置顶属性,同时“On Top”复选框默认被点选。

11、首先在Solution Explorer或 Resources View 中右键Add
Resource,选择Dialog。并在Resources View
中找到新建Dialog,右键Propertise修改相关内容。

21、定义对话框的初始化消息响应函数(Dlg_OnInitDialog),并在对话框的回调函数(Dlg_Proc)中利用上一节的宏替换调用该函数。

 图片 13

 图片 14

图片 15

22、在初始化消息响应函数(Dlg_OnInitDialog)中,我们还可以为对话框设置图标。

 

图片 16

图片 17

图片 18

图片 19

图片 20

12、点选并按下Delete键删掉新建子对话框中无用的OK和Cancel按钮。当
.h/.rc/.cpp文件中存在所删除控件的相关代码时记得一并删除或注释掉。

图片 21图片 22

 图片 23

 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 }

13、在View中打开Toolbox(Ctrl+Alt+X),添加Static
Text控件到新建子窗体中,修改控件内容并调整二者至合适大小。

Win32WindowsApplication.cpp

 图片 24

23、此时再按下F5 Start Debugging,可以发现“On
Top”复选框默认被点选,同时对话框已被置顶,对话框左上角以及.exe文件出现了我们添加的图标。

图片 25

————————————————

14、找到之前Dialog中的Button按钮,修改其Propertise。

本文为本人原创,转载请注明出处。

 图片 26

图片 27

图片 28

图片 29

15、切换到
.cpp文件中,修改被调用的命令消息响应函数(Dlg_OnCommand),在IDNEW的case中调用DialogBoxParam,并编写子对话框的回调函数(NewDlg_Proc)。

 图片 30

图片 31图片 32

 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 
26     switch (id) {
27     case IDNEW:
28         DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_NEWDIALOG),
29             hWnd, NewDlg_Proc, NULL);
30         break;
31     case IDCANCEL:
32         SendMessage(hWnd, WM_CLOSE, 0, 0);
33         break;
34 
35     }
36 }
37 
38 INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
39     switch (uMsg)
40     {
41     chHANDLE_DLGMSG(hWnd, WM_COMMAND, Dlg_OnCommand);
42     case WM_CLOSE:
43         EndDialog(hWnd, 0);
44         break;
45     }
46 
47     return(FALSE);
48 }
49 
50 int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
51     DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_DIALOG),
52         NULL, Dlg_Proc, _ttoi(pszCmdLine));
53     return(0);
54 }

Win32WindowsApplication.cpp

16、此时按下F5 Start
Debugging,再点击New按钮,可以看到刚才新建的子对话框。

 图片 33

————————————————

本文为本人原创,转载请注明出处。