(14):用对话框作为主窗口

最后更新于:2022-04-01 20:07:35

前面我们在编写Win32应用程序的思路都是: 1、设计窗口类。2、注册窗口类。3、创建窗口。…… 然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编辑器,操作起来相对方便。 于是,就有了一个想法:把对话框用作主窗口,那我们在布局控件时就轻松了。 其实这想法在网上已有牛人做了,不过,人家是用Win32汇编干的,当然,要把它变为C++就更简单了。 首先,介绍第一个法子,直接以桌面作为父窗口来创建对话框。 1、创建一个对话框资源,界面就发挥你的设计天赋了。 2、创建一个图标资源,既作为应用程序的图标(VS编译时会选择第一个添加到资源中的图标作为EXE的图标),也作为对话框的图标。 3、在代码中创建并显示对话框。 ~~~ #include #include "resource.h" // 开启可视化效果 #pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); HINSTANCE hgInst; int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow) { hgInst = hThisApp; HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),(DLGPROC)DlgProc); if(!hdlg) { return 0; } ShowWindow(hdlg,SW_SHOW); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: // 设置对话框的图标 SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst, MAKEINTRESOURCE(IDI_APP))); return 0; case WM_SYSCOMMAND: if(wParam == SC_CLOSE) { PostQuitMessage(0);//退出 } return 0; } return (INT_PTR)FALSE; } ~~~ 这样,我们可以运行一下。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-14_575fd2d29ff91.PNG) ================================================================= 第二种方法,我们还是遵照设计窗口类、注册窗口类、创建窗口等步骤,只是把对话框作为窗口的子级,对话框采用Form View视图。 在插入资源的对话框中,点击Dialog左边的图标,展开列表,在列表中选择IDD_FORMVIEW,然后点“新建”。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-14_575fd2d2b1713.PNG) 然后你看到一个没有边框和标题栏的对话框。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-14_575fd2d2cdeeb.PNG) 接下来我们可以放些控件上去。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-14_575fd2d2e0634.PNG) 最后,在响应WM_CREATE消息时,创建并显示对话框,父级是我们的主窗口。 ~~~ case WM_CREATE: { // 创建对话框 HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc); // 显示对话框 ShowWindow(hdlg, SW_SHOWNA); } return 0; ~~~ 最后运行结果如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-14_575fd2d2f3590.PNG) 完整的代码清单: ~~~ #include #include "resource.h" #pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam); HINSTANCE hgAppInst; int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow) { // 设计窗口类 WNDCLASS wc = { }; wc.hbrBackground = (HBRUSH)COLOR_WINDOW; wc.lpfnWndProc = (WNDPROC)WindowProc; wc.lpszClassName = L"supper_man"; wc.hInstance = hThisApp; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); hgAppInst = hThisApp; // 创建窗口 HWND hwnd = CreateWindow(L"supper_man", L"超级应用", WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL); if(!hwnd) return 0; ShowWindow(hwnd, nShow); UpdateWindow(hwnd); // 消息循环 MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { // 创建对话框 HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc); // 显示对话框 ShowWindow(hdlg, SW_SHOWNA); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return 0; } // 处理对话框消息 INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { /* .............. */ return (INT_PTR)FALSE; } ~~~
';