WIN32学习——对话框

  • 一、对话框的分类:

1)模式对话框 - 当对话框显示时,会禁止其他窗口的输入等用户交互操作。

2)非模式对话框 - 在对话框显示后,其他窗口同样可以接收输入等用户交互操作。

  • 二、对话框的使用过程:

1)对话框窗口处理函数(参照MSDN - DialogProc)

2)添加窗口资源

3)创建对话框(模式对话框和非模式对话的创建不一样)

4)关闭对话框(模式对话框和非模式对话的删除也不一样)

  • 三、对话框窗口处理函数(参照MSDN),模式对话框和非模式对话框,对话框窗口处理函数一样

1)BOOL CALLBACK DialogProc(

HWND hwndDlg, //窗口句柄

UINT uMsg, //消息ID

WPARAM wParam, //消息参数

LPARAM lParam //消息参数

);

返回TRUE - 表示 DialogProc 函数中处理了这个消息,缺省处理函数不需要处理。

返回FALSE - 表示 DialogProc 函数未处理这个消息,交给缺省处理函数处理。

  • 四、模式对话框的创建和关闭

1)创建:

int DialogBox( 

HINSTANCE hInstance, //应用程序实例句柄

LPCTSTR lpTemplate, //对话框模板资源ID

HWND hWndParent, //对话框父窗口

DLGPROC lpDialogFunc //对话框窗口处理函数

); 

DialogBox 是一个阻塞函数,只有当对话框关闭后,才会返回,继续执行后续代码。返回值是通过 EndDialog 设置。

2)关闭:

BOOL EndDialog( 

HWND hDlg, //关闭的对话框窗口句柄

int nResult //关闭的返回值

);

关闭模式对话框,只能使用 EndDialog ,不能使用 DestroyWindow 等函数。

nResult 是 DialogBox 函数退出时的返回值。在对话框退出的时候, nResult 作为返回值被 DialogBox 函数接收,可以用来判断点击了对话框中的哪个按钮。

注意: EndDialog 函数可以解除 DialogBox 的阻塞。

  • 五、非模式对话框的创建和关闭:

1)创建:

HWND CreateDialog( 

HINSTANCE hInstance, //应用程序实例句柄

LPCTSTR lpTemplate, //模板资源ID

HWND hWndParent, //父窗口句柄

DLGPROC lpDialogFunc //窗口处理函数

);

非阻塞函数,创建成功返回窗口句柄,需要使用 ShowWindow 函数显示对话框。

2)关闭:

关闭时使用 DestroyWindow 销毁窗口,不能使用 EndDialog 关闭对话框。

  • 六、对话框和窗口的对比:

1.创建

模式对话框 - DialogBox 函数,是一个阻塞函数

非模式对话框 - CreateDialog 

普通窗口 - CreateWindow/CreateWindowEx

2.窗口处理函数

对话框 - DialogProc ,被缺省的对话框窗口处理函数调用

普通窗口 - WindowProc ,需要调用缺省的窗口处理函数(DefWindowProc)

3.窗口消息

对话框 - WM_INITDIALOG

普通窗口 - WM_CREATE

4.窗口关闭

模式对话框 - EndDialog

                        非模式对话框 - DestroyWindow

        七、实例代码

/*
	说明:实现的功能:1、窗口的基本创建2、手动创建方式取代资源方式添加菜单3、模式对话框和非模式对话的创建和实现(对话框需要添加资源IDD_DLG)
	4、为节省代码,模式对话框和非模式对话框共用一个对话框处理函数,因为处理方式不同,已经将模式对话框的菜单功能屏蔽掉
*/

#include <Windows.h>
#include <tchar.h>
#include "resource.h"

#define ID_DIALOG 1000			//非模式对话框
#define ID_MODELDLG 1001		//模式对话框
#define ID_QUIT 1002			//退出

HINSTANCE g_hInstance;

//窗口处理函数
LRESULT CALLBACK WndPro(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
//注册窗口类类名
TCHAR szClassName[] = _T("Main");
//窗口名称
TCHAR szWindowName[] = _T("窗口名称");
//对话框处理函数
BOOL CALLBACK MyDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	g_hInstance = hInstance;
	//设计窗口类
	WNDCLASSEX wndCls = {0};
	wndCls.cbClsExtra = 0;
	wndCls.cbSize = sizeof(WNDCLASSEX);
	wndCls.cbWndExtra = 0;
	wndCls.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wndCls.hCursor = NULL;
	wndCls.hIcon = NULL;
	wndCls.hIconSm = NULL;
	wndCls.hInstance = hInstance;
	wndCls.lpfnWndProc = WndPro;
	wndCls.lpszClassName = szClassName;
	wndCls.lpszMenuName = NULL;
	wndCls.style = CS_VREDRAW | CS_HREDRAW;
	//注册窗口类
	if (!RegisterClassEx(&wndCls))
	{
		MessageBox(NULL,_T("注册窗口类失败!"),_T("提示"),MB_OK);
		return 1;
	}
	//创建窗口
	HWND hWnd = CreateWindowEx(0,szClassName,szWindowName,WS_OVERLAPPEDWINDOW,10,10,800,600,NULL,NULL,hInstance,NULL);
	if (NULL == hWnd)
	{
		MessageBox(NULL,_T("创建窗口失败!"),_T("提示"),MB_OK);
		return 1;
	}
	//显示和更新窗口
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG msg;
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

void OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	//创建菜单
	HMENU hMain = CreateMenu();
	HMENU hDialog = CreatePopupMenu();
	AppendMenu(hDialog,MF_STRING,ID_MODELDLG,_T("模式对话框"));
	AppendMenu(hDialog,MF_STRING,ID_DIALOG,_T("非模式对话框"));
	AppendMenu(hDialog,MF_SEPARATOR,0,NULL);
	AppendMenu(hDialog,MF_STRING,ID_QUIT,_T("退出"));
	AppendMenu(hMain,MF_POPUP,(UINT)hDialog,_T("对话框"));

	SetMenu(hWnd,hMain);
}

void OnBtnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	switch(LOWORD(wParam))
	{
	case IDOK:
		/*
		//关闭模式对话框
		if(!EndDialog(hWnd,2))
		{
			MessageBox(NULL,_T("关闭对话框失败!"),_T("提示"),MB_OK);
			return;
		}*/		
		if(!DestroyWindow(hWnd))	//关闭非模式对话框
		{
			MessageBox(NULL,_T("关闭非模式对话框失败!"),_T("提示"),MB_OK);
			return;
		}
		break;
	case IDCANCEL:
		/*
		//关闭模式对话框
		if(!EndDialog(hWnd,3))
		{
			MessageBox(NULL,_T("关闭对话框失败!"),_T("提示"),MB_OK);
			return;
		}*/
		if(!DestroyWindow(hWnd))	//关闭非模式对话框
		{
			MessageBox(NULL,_T("关闭非模式对话框失败!"),_T("提示"),MB_OK);
			return;
		}
		break;
	}
}

BOOL CALLBACK MyDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_SYSCOMMAND:
		if (SC_CLOSE == wParam)
		{
			/*
			//关闭对话框,模式对话框用EndDialog函数
			if(!EndDialog(hwndDlg,1))
			{
				MessageBox(NULL,_T("关闭对话框失败!"),_T("提示"),MB_OK);
				return 1;
			}*/
			if(!DestroyWindow(hwndDlg))//非模式对话框关闭,调用DestroyWindow函数
			{
				MessageBox(NULL,_T("关闭非模式对话框失败!"),_T("提示"),MB_OK);
				return 1;
			}
		}
		break;
	case WM_INITDIALOG:
		MessageBox(NULL,_T("对话框创建完成,显示之前调用"),_T("提示"),MB_OK);
		break;
	case WM_COMMAND:		//按钮发送的是WM_COMMAND消息
		OnBtnCommand(hwndDlg,wParam,lParam);
	}
	return FALSE;
}

void OnModelDlg(HWND hWnd)
{
	//创建对话框,通过EndDialog的第二个参数作为返回值,判断点击了对话框中的控件
	int ret = DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DLG),hWnd,MyDialogProc);
	if (1 == ret)
	{
		MessageBox(NULL,_T("您点击了关闭对话框"),_T("提示"),MB_OK);
	}
	if (2 == ret)
	{
		MessageBox(NULL,_T("您点击了确定按钮关闭"),_T("提示"),MB_OK);
	}
	if (3 == ret)
	{
		MessageBox(NULL,_T("您点击了取消按钮关闭"),_T("提示"),MB_OK);
	}
}

void OnDlg(HWND hWnd)
{
	HWND hDialog = CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DLG),hWnd,MyDialogProc);
	if (NULL == hDialog)
	{
		MessageBox(NULL,_T("创建非模式对话框失败!"),_T("提示"),MB_OK);
		return;
	}
	ShowWindow(hDialog,SW_SHOW);
}

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	DWORD id = LOWORD(wParam); //WM_COMMAND消息附加项wParam的低字节表示菜单项的ID,高字节HIWORD为0
	switch (id)
	{
	case ID_MODELDLG:
//		OnModelDlg(hWnd);	//模式对话框
		break;
	case ID_DIALOG:
		OnDlg(hWnd);		//非模式对话框
		break;
	case ID_QUIT:
		if (IDYES == MessageBox(NULL,_T("确定要退出?"),_T("提示"),MB_YESNO))
		{
			PostQuitMessage(0);
		}
		break;
	}
}

LRESULT CALLBACK WndPro(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_COMMAND:
		OnCommand(hWnd,wParam,lParam);
		break;
	case WM_CREATE:
		OnCreate(hWnd,wParam,lParam);
		break;
	case WM_SYSCOMMAND:
		if (SC_CLOSE == wParam)
		{
			if (IDYES == MessageBox(NULL,_T("确定要退出?"),_T("提示"),MB_YESNO))
			{
				PostQuitMessage(0);
			}
			else
				return 1;
		}
		break;
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Win32应用程序中加载rc文件中的对话框,可以按照以下步骤进行操作: 1. 创建一个对话框资源文件(通常具有.rc扩展名),其中包含对话框的描述。在资源文件中,使用对话框模板定义对话框的布局和控件。 2. 在你的应用程序的资源文件(通常是一个.rc文件)中添加对话框资源,使用`DIALOG`关键字指定对话框的ID和属性。例如: ``` IDD_MYDIALOG DIALOG DISCARDABLE 0, 0, 200, 150 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "My Dialog" FONT 8, "MS Shell Dlg" BEGIN // 对话框中的控件定义 // ... END ``` 3. 在你的代码中使用`CreateDialog`或`DialogBox`函数加载并创建对话框。这些函数会根据资源ID加载并显示对话框。 ```cpp #include <Windows.h> // ... // 使用CreateDialog函数加载并创建对话框 HWND hDlg = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MYDIALOG), hWndParent, DialogProc); if (hDlg == NULL) { // 处理错误 } // 或者使用DialogBox函数加载并创建对话框 INT_PTR result = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MYDIALOG), hWndParent, DialogProc); if (result == -1) { // 处理错误 } // ... // 对话框过程函数 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // 处理对话框消息 // ... } return FALSE; // 返回FALSE表示未处理的消息将由系统处理 } ``` 以上代码中的`IDC_MYDIALOG`是对话框资源的ID,`hWndParent`是对话框的父窗口句柄,`DialogProc`是对话框过程函数,用于处理对话框消息。 这样,你就可以在Win32应用程序中加载rc文件里的对话框了。记得根据实际情况进行相应的修改和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值