一般的窗口的创建是使用Create函数,这个函数在创建窗口之前调用了PreCreateWindow函数,并且允许在创建创建之前在PreCreateWindow注册一个拥有自定义窗口样式的新的窗口类,来创建一个拥有自定义类名新的窗口。而模式对话框是通过CreateDialogIndirect来创建的,在这当中并没有调用PreCreateWindow函数,重载的PreCreateWindow函数根本就不被执行,因此在这个函数里修改对话框的窗口类是没有用的。
CDialog是通过CDialog::DoModal()函数创建窗口的,下面是MFC中DoModal函数的代码:
{
// 载入资源
HGLOBAL hDialogTemplate = m_hDialogTemplate;
if (m_lpszTemplateName != NULL)
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
if (hDialogTemplate != NULL)
return -1;
HWND hWndParent = PreModal();
BOOL bEnableParent = FALSE;
{
bEnableParent = TRUE;
{
AfxHookWindowCreate(this);
CWnd::FromHandle(hWndParent), hInst))
if (m_nFlags & WF_CONTINUEMODAL)
// 进入模式循环
if (GetStyle() & DS_NOIDLEMSG)
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
if (m_hWnd != NULL)
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
}
{
}
if (bEnableParent)
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
DestroyWindow();
if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)
if (m_lpszTemplateName != NULL)
}
typedef struct {
DWORD dwExtendedStyle;
short x;
short cx;
} DLGTEMPLATE, *LPDLGTEMPLATE;
IDD_AAAA_DIALOG DIALOGEX 0, 0, 320, 200
EXSTYLE WS_EX_APPWINDOW
FONT 9, "宋体"
DEFPUSHBUTTON "确定",IDOK,260,10,50,14
LTEXT "TODO: 在这里设置对话控制。",IDC_STATIC,50,90,200,8
第一行是对话框的位置信息,第二行是对话框的样式,第三行是扩展样式,它们的内容就是在对话框编辑器修改属性时得到的内容。
但是,对话框的类名也不是不能修改的。在上面的对话框模板的文本中,没有关于窗口类的任何信息。然而若是以关键字“DIALOGEX”查询MSDN发现在这里是可以使用“CLASS”选项指定新的对话框类。修改上面的对话框模板:
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "aaaa"
CLASS "My New Dialog Class"
DEFPUSHBUTTON "确定",IDOK,260,10,50,14
LTEXT "TODO: 在这里设置对话控制。",IDC_STATIC,50,90,200,8
我们指定了新的对话框类名,还需要注册新的窗口类,但是又不能在PreCreateWindow函数里注册,所以只能对话框创建之前的其他地方进行注册,InitInstance函数是个非常好的选择:
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wndClass);\\拷贝默认的窗口类的信息
RegisterClass(&wndClass);
|
转载于:https://my.oschina.net/tonyyang/blog/11337