用对话框作为主窗口

前面我们在编写Win32应用程序的思路都是:

1、设计窗口类。2、注册窗口类。3、创建窗口。……

然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编辑器,操作起来相对方便。

于是,就有了一个想法:把对话框用作主窗口,那我们在布局控件时就轻松了。

其实这想法在网上已有牛人做了,不过,人家是用Win32汇编干的,当然,要把它变为C++就更简单了。

首先,介绍第一个法子,直接以桌面作为父窗口来创建对话框。

1、创建一个对话框资源,界面就发挥你的设计天赋了。

2、创建一个图标资源,既作为应用程序的图标(VS编译时会选择第一个添加到资源中的图标作为EXE的图标),也作为对话框的图标。

3、在代码中创建并显示对话框。

  1. #include <Windows.h> 
  2. #include "resource.h" 
  3. // 开启可视化效果 
  4. #pragma comment(linker,"\"/manifestdependency:type='win32' \ 
  5. name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
  6. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\""
  7.  
  8. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); 
  9.  
  10. HINSTANCE hgInst; 
  11. int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow) 
  12.     hgInst = hThisApp; 
  13.     HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),(DLGPROC)DlgProc); 
  14.     if(!hdlg) 
  15.     { 
  16.         return 0; 
  17.     } 
  18.     ShowWindow(hdlg,SW_SHOW); 
  19.     MSG msg; 
  20.     while(GetMessage(&msg,NULL,0,0)) 
  21.     { 
  22.         TranslateMessage(&msg); 
  23.         DispatchMessage(&msg); 
  24.     } 
  25.     return 0; 
  26.  
  27. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) 
  28.     switch(msg) 
  29.     { 
  30.     case WM_INITDIALOG: 
  31.         // 设置对话框的图标 
  32.         SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst, MAKEINTRESOURCE(IDI_APP))); 
  33.         return 0; 
  34.     case WM_SYSCOMMAND: 
  35.         if(wParam == SC_CLOSE) 
  36.         { 
  37.             PostQuitMessage(0);//退出 
  38.         } 
  39.         return 0; 
  40.     } 
  41.     return (INT_PTR)FALSE; 
#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消息时,创建并显示对话框,父级是我们的主窗口。

  1. case WM_CREATE: 
  2.     { 
  3.         // 创建对话框 
  4.         HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc); 
  5.         // 显示对话框 
  6.         ShowWindow(hdlg, SW_SHOWNA); 
  7.     } 
  8.     return 0; 
	case WM_CREATE:
		{
			// 创建对话框
			HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
			// 显示对话框
			ShowWindow(hdlg, SW_SHOWNA);
		}
		return 0;


最后运行结果如下:

完整的代码清单:

  1. #include <Windows.h> 
  2. #include "resource.h" 
  3. #pragma comment(linker,"\"/manifestdependency:type='win32' \ 
  4. name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
  5. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\""
  6.  
  7. LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 
  8. INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam); 
  9.  
  10. HINSTANCE hgAppInst; 
  11. int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow) 
  12.     // 设计窗口类 
  13.     WNDCLASS wc = { }; 
  14.     wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
  15.     wc.lpfnWndProc = (WNDPROC)WindowProc; 
  16.     wc.lpszClassName = L"supper_man"
  17.     wc.hInstance = hThisApp; 
  18.     wc.style = CS_HREDRAW | CS_VREDRAW; 
  19.     RegisterClass(&wc); 
  20.     hgAppInst = hThisApp; 
  21.     // 创建窗口 
  22.     HWND hwnd = CreateWindow(L"supper_man", L"超级应用",  
  23.         WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL); 
  24.     if(!hwnd) 
  25.         return 0; 
  26.     ShowWindow(hwnd, nShow); 
  27.     UpdateWindow(hwnd); 
  28.     // 消息循环 
  29.     MSG msg; 
  30.     while(GetMessage(&msg,NULL,0,0)) 
  31.     { 
  32.         TranslateMessage(&msg); 
  33.         DispatchMessage(&msg); 
  34.     } 
  35.     return 0; 
  36.  
  37. LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
  38.     switch (msg) 
  39.     { 
  40.     case WM_CREATE: 
  41.         { 
  42.             // 创建对话框 
  43.             HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc); 
  44.             // 显示对话框 
  45.             ShowWindow(hdlg, SW_SHOWNA); 
  46.         } 
  47.         return 0; 
  48.     case WM_DESTROY: 
  49.         PostQuitMessage(0); 
  50.         return 0; 
  51.     default
  52.         return DefWindowProc(hwnd,msg,wParam,lParam); 
  53.     } 
  54.     return 0; 
  55.  
  56. // 处理对话框消息 
  57. INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) 
  58.     /* .............. */ 
  59.     return (INT_PTR)FALSE; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值