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( "窗口標題" ) );
}