欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]小技巧:MFC对话框动态类名

[原创]小技巧:MFC对话框动态类名

网上关于MFC对话框类名的帖子基本上都是静态改变,然后重新编译的方式。
但是如果需要每次运行时类名都变化一下,就非常不方便了。
想要做到动态改变类名,首先我们要对MFC的实现进行一些了解(MFC代码是开元的,所以这类不重复了)。
通过使用VS自带的调试功能分析一个对话框在调用DoModel之后和PreInitDialog之前的代码。
跟踪对话框类名初始化等过程。
最后发现对话框是根据资源里读取的对话框定义中的CLASS进行使用类名创建XXOO的~
所以先创建一个对话框,然后资源属性,讲MFC Mode改成false
然后选中对话框,属性修改ClassName为随便写的至少3个字符的字符串,比如123,想随机长点就写长点的字符串。
然后类向导,在虚函数一项上添加一个DoModal的实现。
实现的代码如下:


typedef struct _DLGTEMPLATE_EX{

	DWORD style;

	DWORD dwExtendedStyle;

	DWORD cdit;

	short x;

	short y;

	short cx;

	short cy;

	short width;

	short px;

	short high;

	short py;

	TCHAR mText[1];

} DLGTEMPLATE_EX;

typedef CONST DLGTEMPLATE_EX *LPCDLGTEMPLATE_EX;

typedef LPCDLGTEMPLATE_EX LPCDLGTEMPLATE_EX;

INT_PTR CDynMfcClassDlg::DoModal()

{

	// TODO:  在此添加专用代码和/或调用基类

	LPCDLGTEMPLATE_EX lpDialogTemplate = NULL;

	HGLOBAL hDialogTemplate = NULL;

	HINSTANCE hInst = AfxGetResourceHandle();

	if (m_lpszTemplateName != NULL)

	{

		hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);

		HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);

		hDialogTemplate = LoadResource(hInst, hResource);

	}

	if (hDialogTemplate != NULL)

		lpDialogTemplate = (LPCDLGTEMPLATE_EX)LockResource(hDialogTemplate);

	if (lpDialogTemplate!=NULL)

	{

		AfxMessageBox(lpDialogTemplate->mText);

		//根据原始mText长度生成mText随机字符创

		DWORD old;

		TCHAR *mText = (TCHAR *)lpDialogTemplate->mText;

		UINT mTextLen = _tcslen(mText);

		::VirtualProtect(mText, mTextLen*sizeof(TCHAR), PAGE_READWRITE, &old);

		{

			const TCHAR szText[] = TEXT("qwertyuiopasdfghjklzxcvbnm1234567890");

			std::random_device rd;

			std::mt19937 mt(rd());

			std::uniform_int_distribution<> dist(0, _tcslen(szText) - 1);

			for (UINT i = 0; i < mTextLen;i++)

			{

				int m= dist(mt);

				mText[i]=szText[m];

			}

		}

		//////////////////////////////////////////////////////////////////////////

		AfxMessageBox(lpDialogTemplate->mText);

		WNDCLASS  wc = { 0 };

		::GetClassInfo(AfxGetInstanceHandle(), TEXT("#32770"), &wc);

		wc.lpszClassName = lpDialogTemplate->mText;

		AfxRegisterClass(&wc);

	}

	if (lpDialogTemplate!=NULL)

	{

		UnlockResource(hDialogTemplate);

	}

	if (hDialogTemplate!=NULL)

	{

		::FreeResource(hDialogTemplate);

	}

	return CDialogEx::DoModal();

}


附件pdf,图文说明,尽在VS2013中实验。
图文.pdf
附加完整工程:
DynMfcClass.zip

上传的附件 图文.pdf
DynMfcClass.zip

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功