当前位置:C++技术网 > 资讯 > PreCreateWindow函数的不允许修改对话框工程

PreCreateWindow函数的不允许修改对话框工程

更新时间:2016-01-18 21:28:22浏览次数:1+次

若要更改框架应用程序(用应用程序向导创建的)所使用的默认窗口属性,请重写窗口的?PreCreateWindow虚拟成员函数。PreCreateWindow允许应用程序访问通常由?CDocTemplate?类内部管理的创建进程。框架在即将创建窗口前用?PreCreateWindow。通过修改传递给?PreCreateWindow?的结构?CREATESTRUCT,应用程序可以更改用于创建窗口的属性
对话框是从资源模板里面创建的,这个时候,你的PreCreateWindow当然不会被调用,因为类根本就还没有和窗口关联起来.一直要到OnInitDialog函数的CDialog::Oninitdialog()被调用以后,类才会和窗口关联上.
   这种情况,你可以在Oninitdialog中修改风格。一般的窗口的创建是使用Create函数,这个函数在创建窗口之前调用了PreCreateWindow函数,并且允许在创建创建之前在PreCreateWindow注册一个拥有自定义窗口样式的新的窗口类,来创建一个拥有自定义类名新的窗口。而模式对话框是通过CreateDialogIndirect来创建的,在这当中并没有调用PreCreateWindow函数,CDialog是通过CDialog::DoModal()函数创建窗口的,重载的PreCreateWindow函数根本就不被执行,因此在这个函数里修改对话框的窗口类是没有用的。

我们指定了新的对话框类名,还需要注册新的窗口类,但是又不能在PreCreateWindow函数里注册,所以只能对话框创建之前的其他地方进行注册,InitInstance函数是个非常好的选择:(大多数的MFC程序的对话框都是使用默认的类名:#32770)

 WNDCLASS wndClass;
         ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wndClass);//拷贝默认的窗口类的信息
         wndClass.lpszClassName = " My New Dialog Class ";//修改类名
         RegisterClass(&wndClass);
这样,这个对话框就有了新的类名。
SDI 情况  
在单文档界面 (SDI) 应用程序中,框架中的默认窗口样式是  WS_OVERLAPPEDWINDOW 和 FWS_ADDTOTITLE 样式的组合。 FWS_ADDTOTITLE 是 MFC 特定的样式,指示框架将文档标题添加到窗口标题。若要在 SDI 应用程序中更改窗口属性,请在从 CFrameWnd(应用程序向导给 CMainFrame 
起的名称)派生的类中重写 PreCreateWindow 函数。例如: 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{
 // Create a window without min/max buttons or sizable border 
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER; 
// Size the window to 1/3 screen size and center it 
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3; 
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3; 
cs.y = ((cs.cy * 3) - cs.cy) / 2; 
cs.x = ((cs.cx * 3) - cs.cx) / 2; 
// Call the base-class version 
return CFrameWnd::PreCreateWindow(cs); 
}
此代码创建一个没有“最小化”按钮和“最大化”按钮,也没有大小可调边框的主框架窗口。此窗口最初在屏幕上居中。