MFC单文档程序中,在PreCreateWindow函数中修改窗口大小无而法生效的解决办法

来源:互联网 发布:淘宝卖家退款多久到账 编辑:程序博客网 时间:2024/06/05 11:31

一、问题原型

    新建一个MFC单文档程序后,在Fram和View类中都尝试设置cs.cx和cs.cy的值,然后老天不给力,居然不起作用。

着一脸懵逼,反复调试,发现窗口不但不听程序猿的话,而且每次打开沿用上一次窗口拖动改变后的大小。

二、原因分析

     带着万分沮丧的心情找谷歌,经过多方查找终于找到蛛丝马迹了。原来VS2010会将一些信息写入注册表,这其中

包括窗口样式信息,这个和之前VS2005,VS2008(SP1除外)不太一样,默认的SDI和MDI自带的BCG的一些东

西。分析源代码,App的InitInstance函数里,是先执行pDocTemplate = new CSingleDocTemplate(

 IDR_MAINFRAME,

 RUNTIME_CLASS(CvasFasternToolDoc),

 RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CvasFasternToolView));,触发执行Doc、Frame、View代码,

然后执行if (!ProcessShellCommand(cmdInfo))处理shell命令,这其中就包括访问注册表相关信息,最后调用

m_pMainWnd->ShowWindow(SW_SHOW);和m_pMainWnd->UpdateWindow();显示更新窗口。因此当在Frame或

View里更改窗口样式时,后面也会被注册表记录的窗口样式覆盖,因此自定义窗口样式无法生效。

三、解决办法

1、第一种方法简单粗暴,直接在if (!ProcessShellCommand(cmdInfo)){return FALSE;}后调用m_pMainWnd-

>MoveWindow(CRect(100, 100, 500, 400), FALSE);


2、解决办法二,修改App类的int CvasFasternToolApp::ExitInstance()函数,然后就可以在Frame里修改窗口的样式。



0 0