跟我一起玩Win32开发(14):用对话框作为主窗口
前面我们在编写Win32应用程序的思路都是:
1、设计窗口类。2、注册窗口类。3、创建窗口。……
然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编辑器,操作起来相对方便。
于是,就有了一个想法:把对话框用作主窗口,那我们在布局控件时就轻松了。
其实这想法在网上已有牛人做了,不过,人家是用Win32汇编干的,当然,要把它变为C++就更简单了。
首先,介绍第一个法子,直接以桌面作为父窗口来创建对话框。
1、创建一个对话框资源,界面就发挥你的设计天赋了。
2、创建一个图标资源,既作为应用程序的图标(VS编译时会选择第一个添加到资源中的图标作为EXE的图标),也作为对话框的图标。
3、在代码中创建并显示对话框。
- #include <Windows.h>
- #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;
- }
这样,我们可以运行一下。
=================================================================
第二种方法,我们还是遵照设计窗口类、注册窗口类、创建窗口等步骤,只是把对话框作为窗口的子级,对话框采用Form View视图。
在插入资源的对话框中,点击Dialog左边的图标,展开列表,在列表中选择IDD_FORMVIEW,然后点“新建”。
然后你看到一个没有边框和标题栏的对话框。
接下来我们可以放些控件上去。
最后,在响应WM_CREATE消息时,创建并显示对话框,父级是我们的主窗口。
- case WM_CREATE:
- {
- // 创建对话框
- HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
- // 显示对话框
- ShowWindow(hdlg, SW_SHOWNA);
- }
- return 0;
最后运行结果如下:
完整的代码清单:
- #include <Windows.h>
- #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;
- }