1.创建MFC应用。
2.
3.
4.基类选择CFormView.
5.修改使视图区域与窗体边框显示一致。默认创建一个基于CFormView的MFC程序,会发现视图区域明显与窗体边框不一致。
解决办法:在CT8View.cpp.cpp-》OnInitialUpdate中添加以下代码:ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED);
例如:
void CT8View::OnInitialUpdate() { CFormView::OnInitialUpdate(); //修改视图区域与窗体边框显示一致 ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); }
6.删除工具栏,禁止窗口最大化按钮和禁止改变窗口大小。在MainFrm.cpp-》PreCreateWindow中如下修改。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 //去掉工具栏 cs.hMenu=NULL; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.style &= ~WS_MAXIMIZEBOX; //禁止窗口最大化 cs.style &= ~WS_MINIMIZEBOX; //禁止窗口最小化 //cs.style &= ~WS_SYSMENU; //取消Title上的按钮 cs.style &= ~WS_THICKFRAME;//使窗口不能用鼠标改变大小 cs.lpszClass = AfxRegisterWndClass(0); return TRUE; }
7.VC2010 MFC 改变窗口默认大小
7.1.因为VS2010会将一些信息写入注册表,这个和之前VS2005,VS2008(SP1除外)不太一样,VS2010窗口到显示的整个过程。首先调用PreCreateWindow和 OnCreateWindow按cs中设定的值创建窗口(这时的窗口并没有显示出来),再调用 m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow(); 之前会从注册表中读取包括窗口上一次关闭时的大小和位置等其他信息(第一次创建时会把系统默认的信息写到注册表),并根据这些信息改变窗口。这就是为什么在PreCreateWindow中更改窗口的大小和位置不起作用的原因。 要想更改可以在显示窗口之前调用SetWindowPos,即:
BOOL CFurtherConvertCutCodeApp::InitInstance() { ...... // 调度在命令行中指定的命令。如果 // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。 if (!ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd->SetWindowTextW( _T( "FurtherConvertCutCode1.2" ) ); // 唯一的一个窗口已初始化,因此显示它并对其进行更新 //调整窗口大小和位置 m_pMainWnd->SetWindowPos(CWnd::FromHandle(HWND_NOTOPMOST),400,100,700,500,SWP_FRAMECHANGED|SWP_SHOWWINDOW); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); // 仅当具有后缀时才调用 DragAcceptFiles // 在 SDI 应用程序中,这应在 ProcessShellCommand 之后发生 return TRUE; }
8.修改界面标题
在InitInstance加入以下代码: 注意:SetWindowText必须在ProcessShellCommand创建文档之后使用,否则会运行错误。可直接将设置窗口标题的代码加到InitInstance的尾部。
BOOL CT8App::InitInstance()
{ // 调度在命令行中指定的命令。如果
// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
if (!ProcessShellCommand(cmdInfo))
return FALSE;
m_pMainWnd->SetWindowTextW( _T( "窗口标题" ) );
}