Checkbox的接收、窗体置顶、设置Logo

图片 11

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

 

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

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

 图片 1

图片 2

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

 图片 3

图片 4

图片 5

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

 图片 6

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

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

 图片 7

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

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

 图片 8

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

图片 9

图片 10

图片 11

图片 12图片 13

 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文件出现了我们添加的图标。

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

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