VC/MFC如何使用CreateEx()创建自己的对话框资源

来源:互联网 发布:上古世纪捏脸萝莉数据 编辑:程序博客网 时间:2024/05/22 03:16

摘自:http://blog.sina.com.cn/s/blog_46e7a06c0100dw9x.html

创建非模态对话框是调用的是Create(),第一个参数是对话框模板指针,第二个是父窗口指针,默认NULL。
BOOL CDialog::Create(LPCTSTR lpsztemplatename,CWnd* pparentwnd)
{在这里面会调用
return CreateIndirect(htemplate,pparentwnd,hinst);
}
很多代码,写不清了,你还是在非模态对话框的创建函数那里,即create()这里设置断点跟踪下去查看吧,createex()函数是创建窗口函数,CDialog没有重载它,你不能直接使用的。你使用的那个create()是从CWnd重载过来的。从断点处跟踪查看,就可以看到底层代码的调用了。
(CreateEx(...)创建自己资源ID对话框)一定不可以


Create()方法创建的是非模态对话框。非模态对话框显示使用dlg.ShowWindow(SW_SHOW);dlg.UpdateWindow();
模态对话框显示使用dlg.DoModal();注意了。
CreateEx()是CWnd的函数,不能使用这个函数通过对话框资源建立对话框,所以你说的(通过用CreateEx()创建时改变他的windows style 就是是原本我在资源编辑器中的style为child 现在在CreateEx()中 修改为 WS_POPUP )那是不可能的。
使用Create()创建对话框的话,此时对话框是非模态的,此时的对话框应该是全局的,它和主程序同时并存。
我给你的方法是
dlg.Create(IDD_ABOUTBOX);
::SetWindowLong(dlg.m_hWnd,GWL_STYLE,::GetWindowLong(dlg.m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);
dlg.ShowWindow(SW_SHOW);
dlg.UpdateWindow();
===============================
解释:CAboutDlg dlg;这里定义一个全局的,或者说生命期和主程序一样长的一个变量。WS_MAXIMIZEBOX这就是窗口的属性,你可以随便修改。
对于你的问题,我还有个想法,你没搞清楚什么是模态对话框,什么是非模态对话框。一般使用模态对话框就可以了,如:CAboutDlg dlg;dlg.DoModal();
就会显示对话框,直到这个对话框关闭,不然程序一直停留在dlg.DoModal();这里。此时dlg可以是局部变量

::SetWindowLong(dlg.m_hWnd,

GWL_STYLE,::GetWindowLong(dlg.m_hWnd,GWL_STYLE)& ~WS_CHILD | WS_POPUP);

原创粉丝点击