VC驿站

 找回暗码
 参加驿站

QQ登录

只需一步,快速开端

查找
检查: 57|回复: 0
打印 上一主题 下一主题

[共享] [转贴]小技巧:MFC对话框动态类名

[仿制链接]
20_avatar_middle
最佳答案
4 
跳转到指定楼层
1#
在线会员 宣布于 7 天前 | 只看该作者 回帖奖赏 |倒序阅览 |阅览形式
原贴:

-------------------原文----------------------------------------
网上关于MFC对话框类名的帖子基本上都是静态改动,然后从头编译的方法。
可是假如需求每次运行时类名都改动一下,就十分不方便了。

想要做到动态改动类名,首要咱们要对MFC的完结进行一些了解(MFC代码是开元的,所以这类不重复了)。

经过运用VS自带的调试功能分析一个对话框在调用DoModel之后和PreInitDialog之前的代码。
盯梢对话框类名初始化等进程。
最终发现对话框是依据资源里读取的对话框界说中的CLASS进行运用类名创立XXOO的~

所以先创立一个对话框,然后资源特点,讲MFC Mode改成false
然后选中对话框,特点修正ClassName为随意写的至少3个字符的字符串,比方123,想随机长点就写长点的字符串。

然后类导游,在虚函数一项上增加一个DoModal的完结。
-----------------------------------------------------------------

PS:原贴是运用VS2013编译的,而且只支撑unicode。为了能支撑ANSI,修正了下代码。
修正后的代码,VC6下编译经过,代码如下:
  1. typedef struct _DLGTEMPLATE_EX{
  2.     DWORD style;
  3.     DWORD dwExtendedStyle;
  4.     DWORD cdit;
  5.     short x;
  6.     short y;
  7.     short cx;
  8.     short cy;
  9.     short width;
  10.     short px;
  11.     short high;
  12.     short py;
  13.         wchar_t mText[1];//修正后的代码
  14. } DLGTEMPLATE_EX;
  15. typedef CONST DLGTEMPLATE_EX *LPCDLGTEMPLATE_EX;
  16. typedef LPCDLGTEMPLATE_EX LPCDLGTEMPLATE_EX;

  17. int CVC6DemoDlg::DoModal()
  18. {
  19.         // TODO: Add your specialized code here and/or call the base class
  20.         LPCDLGTEMPLATE_EX lpDialogTemplate = NULL;
  21.     HGLOBAL hDialogTemplate = NULL;
  22.         TCHAR *pNewClassName = NULL;
  23.     HINSTANCE hInst = AfxGetResourceHandle();

  24.         do
  25.         {
  26.                 if (m_lpszTemplateName == NULL) break;
  27.                 hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
  28.         HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
  29.         hDialogTemplate = LoadResource(hInst, hResource);
  30.                 if (hDialogTemplate == NULL) break;
  31.                 lpDialogTemplate = (LPCDLGTEMPLATE_EX)LockResource(hDialogTemplate);
  32.                 if (lpDialogTemplate == NULL) break;
  33.                 MessageBoxW(0, (LPCWSTR)lpDialogTemplate->mText, L"修正前的类名", 0);
  34.                 //依据原始mText长度生成mText随机字符创
  35.                 DWORD dwProtect = 0;
  36.                 wchar_t *pClassName = (wchar_t*)lpDialogTemplate->mText;
  37.                 int nNameLen = wcslen(pClassName);
  38.                 pNewClassName = new TCHAR[nNameLen+1];
  39.                 if (pNewClassName == NULL) break;
  40.                 memset(pNewClassName, 0, (nNameLen+1)*sizeof(TCHAR));
  41.                 if (VirtualProtect(pClassName, nNameLen*sizeof(wchar_t), PAGE_READWRITE, &dwProtect) == FALSE) break;
  42.                 const char szText[] = "qwertyuiopasdfghjklzxcvbnm1234567890";
  43.                 srand(time(NULL));//以时刻作为随机种子
  44.                 for (int i=0; i<nNameLen; ++i)
  45.                 {
  46.                         int j = rand() % 35; //这儿表明发生0~35的随机数
  47.                         pClassName[i] = szText[j];//修正原始类名; Ansi的字符能够直接赋值给Unicode
  48.                         pNewClassName[i] = szText[j];
  49.                 }
  50.                 VirtualProtect(pClassName, nNameLen*sizeof(wchar_t), dwProtect, &dwProtect);
  51.                 MessageBoxW(0, (LPCWSTR)lpDialogTemplate->mText, L"修正后的类名", 0);
  52.                 WNDCLASS  wc = { 0 };
  53.         ::GetClassInfo(AfxGetInstanceHandle(), TEXT("#32770"), &wc);
  54.         wc.lpszClassName = pNewClassName;
  55.         AfxRegisterClass(&wc);
  56.         } while (0);//只循环一次

  57.         if (pNewClassName) delete [] pNewClassName;
  58.     if (lpDialogTemplate) UnlockResource(hDialogTemplate);
  59.     if (hDialogTemplate!=NULL) ::FreeResource(hDialogTemplate);

  60.         return CDialog::DoModal();
  61. }
仿制代码


评分

参加人数 1热心值 +3 收起 理由
75_avatar_small wl1383838438 + 3 赞一个!

检查悉数评分





上一篇:为什么相同的代码相同的时刻,win2008能截百余张图,win2019只能截30张?
您需求登录后才能够回帖 登录 | 参加驿站 qq_login

本版积分规矩

×【发帖 友谊提示】
1、请回复有意义的内容,请勿歹意灌水;
2、纯数字、字母、表情等无意义的内容体系将主动删去;
3、若正常回复后帖子被主动删去,为体系误删的状况,请从头回复其他正常内容或等候管理员审阅经过后会主动发布;
4、感谢您对VC驿站自始自终的支撑,谢谢合作!

封闭

站长提示上一条 /2 下一条

|小黑屋|手机版|VC驿站 ( )|网站地图QQ

GMT+8, 2020-5-13 04:50

Powered by vog2jy.com

© 2009-2020 vog2jy.com

快速回复 回来顶部 回来列表