[原创]小技巧: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





