MFC 对话框架构

本文详细介绍了Win32无模式对话框的创建过程,包括资源查找、加载和对话框的创建方法,以及在MFC框架中的应用,特别强调了无模式对话框与模式对话框的区别,以及如何正确销毁无模式对话框。
摘要由CSDN通过智能技术生成

目录

Win32对话框回顾

对话框架构

无模式对话框架构程序执行过程


Win32对话框回顾

MFC框架中都是无模式对话框,不会阻塞,先回顾一下无模式对话框的创建:

  1. 添加对话框资源
  2. 查找资源,FindResource
  3. 加载资源,LoadResource
  4. 锁定资源,LockResource
  5. 创建无模式对话框,CreateDialogIndirect

Win32创建对话框代码如下:

#include <windows.h>
#include "resource.h"

HINSTANCE g_hInstance = 0;

INT CALLBACK DlgProc( HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam ){
	switch( msgID ){
	case WM_DESTROY:
		MessageBox( NULL, "我要死了", "Infor", MB_OK );
		break;
	case WM_SYSCOMMAND:
		if( wParam == SC_CLOSE ){
			HWND hWnd = GetParent( hwndlg );  // 通过子窗口拿到父窗口的句柄
			EnableWindow(  hWnd ,TRUE );
			DestroyWindow( hwndlg );//销毁无模式对话框, 切忌不能EndDialog 
//			EndDialog( hwndlg, 1001 );//只能隐藏无模式对话框, 可以销毁模式对话框
		}
		break;
	}
	return FALSE;//对话框的消息交给真正对话框窗口处理函数处理。
}
void OnNoModel( HWND hWnd ){
	//	HWND hDlg = CreateDialog( g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc );//直接创建
	//  ShowWindow( hDlg, SW_SHOW );
}

void OnCommand( HWND hWnd, WPARAM wParam ){
	switch(LOWORD(wParam)){
	case ID_NOMODEL:
		OnNoModel( hWnd );
		break;
	}
}
//窗口处理函数( 自定义,处理消息)
LRESULT CALLBACK WndProc( HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam ){
	switch(msgID){
	case WM_COMMAND:
		OnCommand( hWnd, wParam );
		break;
	case WM_DESTROY:
		PostQuitMessage( 0 );
		break;
	}
	return DefWindowProc( hWnd, msgID, wParam, lParam );
}
//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow){
	g_hInstance = hIns;  // 赋值为当前程序示例句柄
	//注册窗口类
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = "Main";
	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);//(CHAR*)IDR_MENU1; 数字资源转为字符串形式
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass( &wc );//将以上所有赋值全部写入操作系统。
	//在内存创建窗口
	HWND hWnd = CreateWindowEx( 0, "Main", "window", WS_OVERLAPPEDWINDOW,
								100, 100, 500, 500, NULL, NULL, hIns, NULL );
	//显示窗口
	ShowWindow( hWnd, SW_SHOW );
	UpdateWindow( hWnd );
	//消息循环
	MSG nMsg = { 0 };
	while( GetMessage(&nMsg,NULL,0,0) ){
		TranslateMessage( &nMsg );
		DispatchMessage( &nMsg );//将消息交给窗口处理函数来处理。
	}
	return 0;
}

可以同时启动多个窗口

创建窗口的其他方式,通过禁用父窗口给了一种模式对话框的错觉

void OnNoModel(HWND hWnd) {
	//  直接创建模式对话框
	//	HWND hDlg = CreateDialog( g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc );//直接创建
	//  ShowWindow( hDlg, SW_SHOW );

	//  模拟模式对话框
	EnableWindow(hWnd, FALSE);  // 禁用父窗口

	// 等效于 CreateDialog() 函数 创建对话框,间接方式创建无模式对话框
	// 从当前进程内存中找对话框资源数据
	HRSRC hRs = FindResource(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
	// 加载进来需要用的资源数据
	HGLOBAL hGl = LoadResource(g_hInstance, hRs);
	// 把资源数据整理到结构体保存
	LPCDLGTEMPLATE pTemplate = (LPCDLGTEMPLATE)LockResource(hGl);
	// 创建无模式对话框
	HWND hDlg = CreateDialogIndirect(g_hInstance, pTemplate, hWnd, DlgProc);

	ShowWindow(hDlg, SW_SHOW);
}

销毁无模式对话框, 切忌不能EndDialog,它只能隐藏无模式对话框, 但可以销毁模式对话框

INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_DESTROY:
		MessageBox(NULL, "我要死了", "Infor", MB_OK);
		break;
	case WM_SYSCOMMAND:
		if (wParam == SC_CLOSE) {
			HWND hWnd = GetParent(hwndlg);  // 通过子窗口拿到父窗口的句柄
			EnableWindow(hWnd, TRUE);  // 启用父窗口
			DestroyWindow(hwndlg);//销毁无模式对话框, 切忌不能EndDialog
//			EndDialog( hwndlg, 1001 );//只能隐藏无模式对话框, 可以销毁模式对话框
		}
		break;
	}
	return FALSE;//对话框的消息交给真正对话框窗口处理函数处理。
}

对话框架构

MFC对话框分类:模式对话框(假)/无模式。MFC其实只有一种对话框,就是无模式对话框。通过禁用父窗口给了一种模式对话框的错觉。

MFC参与架构的类:CDialog,CWinApp   只有两个参与架构

代码书写:添加对话框资源,定义一个自己的对话框的类(CMyDlg)。管理对话框,派生自CDialog或CDialogEx均可

代码如下:

#include <afxwin.h>
#include "resource.h"


class CMyDlg : public CDialog{
	DECLARE_MESSAGE_MAP()
public:
	void OnZjwOK();
	void OnZjwCancel( );
};


BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	ON_COMMAND( IDOK, OnZjwOK )
	ON_COMMAND( IDCANCEL, OnZjwCancel )
END_MESSAGE_MAP()


void CMyDlg::OnZjwCancel( ){
//	CDialog::OnCancel( );
	this->DestroyWindow( );
}


void CMyDlg::OnZjwOK(){
//	CDialog::OnOK();//只能将无模式对话框隐藏,并没有销毁。
	::DestroyWindow( this->m_hWnd );
}


class CMyWinApp : public CWinApp{
public:
	virtual BOOL InitInstance( );
};


BOOL CMyWinApp::InitInstance( ){
	CMyDlg* pdlg = new CMyDlg;
	pdlg->Create( IDD_DIALOG1 );
	m_pMainWnd = pdlg;
	pdlg->ShowWindow( SW_SHOW );
	return TRUE;
}
CMyWinApp theApp;

无模式对话框架构程序执行过程

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于MFC对话框的NT服务程序框架是在Windows系统下开发服务程序的一种基于MFC(Microsoft Foundation Class)对话框的框架架构。NT服务程序是一种在Windows系统下后台运行的程序,可以实现自动启动、无需用户交互、后台运行等功能。 基于MFC对话框的NT服务程序框架有以下特点: 1. 采用MFC对话框,可以方便地设计程序界面和交互方式,方便用户操作。 2. 可以通过类视图和资源视图快速查找和管理程序代码和资源。 3. 使用NT服务程序框架可以避免手动创建服务,可以减少代码的编写量和提高程序的可靠性和稳定性。 4. 使用NT服务程序框架可以方便地实现服务的启动、停止、暂停和重新启动等操作。 基于MFC对话框的NT服务程序框架的具体实现步骤如下: 1. 创建一个MFC对话框程序,设置项目类型为“服务程序”; 2. 在对话框程序中加入Windows服务管理相关代码,用于服务的开启、关闭、暂停和恢复等操作; 3. 实现服务程序的逻辑功能,例如对文件进行监控、实时数据同步等; 4. 编译、安装和启动服务,测试服务的功能和稳定性; 5. 在服务启动后,可以通过MFC对话框程序的用户界面和交互方式与服务进行交互。 综上所述,基于MFC对话框的NT服务程序框架使得开发Windows服务程序变得更加简单和高效,可以提高程序的可靠性和稳定性,并在服务启动后方便进行交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dao-道法自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值