看到很多MFC初学者都有这样的问题:MFC单文档程序默认运行时窗口不是最大化,怎么才能使其一开始就最大化显示,其实对于这个问题,很多网友都解释的不清楚,或是不全面!
其实这是在修改MFC的窗口界面的外观,修改MFC窗口的外观或是风格是要用到类风格(CS_XXXX)和窗口风格(WS_XXXX),学过MFC的学者都知道在WinMain函数中,最开始都定义了WNDCLASS窗口类,该类可以改变窗口的图标,背景,光标等;
若要改变窗口的大小,一般在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中修改构造类cs的值,可以修改cs的cx,cy来改变大小;如果要最大化,就要修改cs.style|=WS_MAXIMIZE 使主框架类(CMainFrame)最大化,自然视图类(CView)创建时也会跟随主框架类(CMainFrame)而变化,但是此时显示时,仍然是没有变化,因为MFC主框架类(CMainFrame)的最后显示要通过SW_XXXX参数来决定,一些朋友就建议在CXXApp::InitInstance()中的m_pMainWnd->ShowWindow(SW_SHOW);前加入m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);或直接改掉,其实最终效果可以实现,但运行开始时会出现先是正常的小窗口,然后马上变成最大化,给人的视觉效果明显不好!
那为什么会产生这种效果,是因为在m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);调用之前会先调用CMainFrame::ActivateFrame(int nCmdShow);此时便会根据nCmdShow(默认为SW_SHOWNORMAL)调用显示窗口一次,SW_SHOWNORMAL会根据cs中的cx,cy,x,y来显示窗口,所以cs.style便失去作用(视图类(CView)已经创建,所以它已经是最大化了),所以再次调用m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);会形成视觉暂留!
最终解决方法是
1.重载CMainFrame::ActivateFrame(intnCmdShow)
2.令nCmdShow=SW_SHOWMAXIMIZED即可
3.在CXXApp::InitInstance()中的m_pMainWnd->ShowWindow(SW_SHOW);会根据之前的设置而显示窗口
OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。
在view类中,Create 是虚函数由框架调用,是用来“生成一个窗口的子窗口”。而OnCreate 函数是用来“表示一个窗口正在生成”。
一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。因为在MFC里面用一种消息映射的机制来响应消息,也就是可以用函数来响应相应的消息。就拿CMainFrame类来说,当窗口创建后会产生WM_CREATE消息,我们可以在OnCreate函数里实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。这些子窗口一般是定义成类中的一个成员变量,因为要保证生命周期。一般以m_开头来表示成员(member)。
在调试MFC程序时,我们经常需要查看特定位置变量的输出值。或者在某特定条件执行时,给出一个输出标识。
一般来说,有3种方法:
1) 调用TRACE(LPCTSTR lpszFormat, ...)函数
在MFC中使用TRACE函数来打印输出结果却是非常方便,和在控制台程序中使用printf函数的使用方法和效果类似。不过有几点
需要注意:一,TRACE函数的输出是在Output窗口的Debug选项下; 二,只有在DEBUG版本调试时才会有输出,如果是在
Release版本调试或者运行程序时,将不会看到输出。
2)使用AfxMessageBox( )函数来输出信息
这个函数在调试时也比较常用,使用方法简单,此处就不做介绍。
3)将标准输出定向到自己创建的控制台
#include "io.h"
#include "fcntl.h"
void InitConsole()
{
int nRet= 0;
FILE* fp;
AllocConsole();
nRet=_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
fp = _fdopen(nRet,"w");
*stdout = *fp;
setvbuf(stdout, NULL,_IONBF, 0);
}
将此函数在MFC程序初始化的地方调用,即可使用控制台查看printf函数的打印信息