Win32编程之对话框(五)

一、对话框原理

(1).对话框的分类

  • 模式对话框:当对话框显示时,会禁止其他窗口和用户交互操作
  • 无模式对话框:在对话框显示后,其他窗口仍然可以和用户交互操作

(2).对话框基本使用

  • 对话框窗口处理函数
  • 注册窗口类(不使用)
  • 创建对话框
  • 对话框的关闭

对话框窗口处理函数(并非真正的对话框窗口处理函数)

INT CALLBACK DialogProc(
	HWND hwndDlg, //窗口句柄
	UINT uMsg, //窗口句柄
	WPARAM wParam, //消息参数
	LPARAM lParam //消息参数
);
返回TRUE:缺省处理函数不需要处理
返回FALSE:交给缺省处理函数处理
不需要调用缺省对话框窗口处理函数

二、模式对话框

(1).创建对话框

INT DialogBox(
	HINSTANCE hInstance, //应用程序实例句柄
	LPCTSTR lpTemplate, //对话框资源ID
	HWND hWndParent, //对话框父窗口
	DLGPROC lpDialogFunc //自定义函数
);
DialogBox是一个阻塞函数,只有当对话框关闭后,才会继续,继续执行
后续代码。返回值是通过EndDialog设置

(2).对话框的关闭

BOOL EndDialog(
	HWND hDlg, //关闭的对话框窗口句柄
	INT_PTR nResult //关闭的返回值
);
关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow函数
nResult是DialogBox函数退出的返回值

(3).对话框的消息

WM_INITDIALOG:对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作  

示例代码:

INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_INITDIALOG: {
		MessageBox(hwndlg, TEXT("WM_INITDIALOG"), TEXT("提示"), MB_OK);		
		break;
	}
	case WM_SYSCOMMAND: {
		if (wParam == SC_CLOSE) {
			//销毁模式对话框
			EndDialog(hwndlg, 100);
		}
		break;
	}
	default:
		break;
	}

	//将消息交给真正的对话框窗口处理函数的后续代码帮我们处理
	return FALSE;
}

void OnCommand(HWND hWnd, WPARAM wParam) {
	switch (LOWORD(wParam)) {
	case ID_MODEL: {
		int nRet = DialogBox(g_hIns, (LPCTSTR)IDD_DIALOG1, hWnd, DlgProc);
		if (nRet == 100) {
			MessageBox(hWnd, TEXT("successfuly"), TEXT("提示"), MB_OK);
		}
		
		break;
	}
	default:
		break;
	}
}

//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WindProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_COMMAND: {
		OnCommand(hWnd, wParam);
		break;
	}
	default:
		break;
	}

	return DefWindowProc(hWnd, msgID, wParam, lParam);
}

 三、无模式对话框 

(1).创建对话框

HWND CreateDialog(
	HINSTANCE hInstance, //应用程序实例句柄
	LPCTSTR lpTemplate, //模板资源ID
	HWND hWndParent, //父窗口
	DLGPROC lpDialogFunc //自定义函数
);
非阻塞函数,创建成功后返回窗口句柄,需要使用ShowWindow函数显示对话框

(2).对话框的关闭 

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

示例代码:

INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_INITDIALOG: {
		MessageBox(hwndlg, TEXT("WM_INITDIALOG"), TEXT("提示"), MB_OK);		
		break;
	}
	case WM_SYSCOMMAND: {
		if (wParam == SC_CLOSE) {
			//销毁非模式对话框
			DestroyWindow(hwndlg);
		}
		break;
	}
	default:
		break;
	}

	//将消息交给真正的对话框窗口处理函数的后续代码帮我们处理
	return FALSE;
}

void OnCommand(HWND hWnd, WPARAM wParam) {
	switch (LOWORD(wParam)) {
	case ID_MODEL: {
		 HWND hDialog = CreateDialog(g_hIns, (LPCTSTR)IDD_DIALOG1, hWnd, DlgProc);
		 ShowWindow(hDialog, SW_SHOW);
		
		break;
	}
	default:
		break;
	}
}

 

posted @ 2023-09-15 00:04  TechNomad  阅读(154)  评论(0)    收藏  举报