你的位置:首页 > 操作系统

[操作系统]Creating Dialogbased Win32 Application / 创建基于对话框的Win32应用程序(三)Checkbox的应用、窗体置顶、设置图标 / Win32, VC++, Windows


创建基于对话框的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 dialog17 // boxes because DlgProc returns a BOOL instead of an LRESULT (like18 // 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文件出现了我们添加的图标。

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

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