畢業設計還沒做完,但是我的老毛病又犯了,為了一個小小的問題糾結了我很久,但是藉著百度和google的風,我始終找不到答案,終於在一次意外的思考中解決了問題。
前幾天開始寫多文檔的MFC程式,當然,一開始糾結下介面的東西也很正常,好了,我就想把mainframe完全去掉邊框,首先去掉菜單,工具列,很簡單,百度一下,答案幾乎都正確,只不過要注意多文檔的去菜單,跟單文檔不一樣,主要是因為每一個view都可以使mainframe有不同菜單,何況預設情況下還有一個主菜單,所以需要在app和mainframe裡面去掉菜單,直接setMemu(NULL);注意app裡面不太一樣
BOOL CWePingApp::InitInstance()
{
....
::AfxGetMainWnd()->SetMenu(NULL);
....
}
好了,但是你很快發現這樣一點都不好看,再想方設法去掉childframe的菜單,view的菜單。或者用更簡單的方法:
在CXXXApp的InitInstance()中的AddDocTemplate(pDocTemplate);
後面加上pDocTemplate->m_hMenuShared=NULL;
在CMainFrame中OnCreate,加個SetMenu(NULL);就可以了。
最後就成了一個很白的東西,但是仍有影響美觀的邊框效果,經過查文檔和百度,知道去掉一個CWnd的邊框,可以設風格,可以有兩種做法: 第一,在PreCreateWindow重載中對CREATESTRUCT& cs折騰,主要是折騰dwExStyle和style,一個是擴充風格,一個本來的風格,
第二,是同過ModifyStyleEx和ModifyStyle,類似上面,查了文檔才知道也調用了SetWindowsLong函數,當然,我們不用那麼麻煩,直接把風格傳給這兩個函數就行,注意在Oncreate裡面使用
那麼要設定哪些風格,經過我研究,設定下面風格即可,雖然有些累贅,
WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE|WS_EX_STATICEDGE,擴充風格
WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_SYSMENU 原來風格
好了,我採用第二種,還特意寫了個宏,容易看些。
#define DELETE_BORDER_HWND(pCWndClass) \
{\
pCWndClass->ModifyStyleEx(WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE|WS_EX_STATICEDGE,0,SWP_DRAWFRAME);\
pCWndClass->ModifyStyle(WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_SYSMENU , 0, SWP_DRAWFRAME);\
}
#define DELETE_BORDER_CS(cs) \
{\
cs.dwExStyle &= ~(WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE|WS_EX_STATICEDGE);\
cs.style &= ~(WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_SYSMENU);\
}
如果你也百度過很多地方,就可以知道,要使mainframe,childframe,和view的邊框完全沒有的話,需要在這個三個類的Oncreate或者PreCreateWindow去掉這些風格,這樣你馬上可以得到一個比較完美的去邊框效果,這裡說完美,主要是因為細心的人就會發現,其實主邊框還有一個框框消除不了,好了,耐心的同學就試了一次風格又風格,激進的同學就去搜怎麼重繪非客戶區,然後走別的通道,但是還有一種同學是,想知道為什麼還會有邊框出現,當然好的容易的解決辦法往往就在這裡出現。
好了,本來想讓那邊框變得明顯些,然後證明我不是眼花,所以我打算重載繪畫函數,去掉背景重繪,但是結果我失敗了,背景完全去不掉呀,這不可能吧,在經過一輪百度和迷茫,我查到了mainframe有m_hWndMDIClient這麼一個成員,從名字看,我們知道我們找到了嫌疑犯,就是他遮蓋了我們的客戶區,導致我們重繪不了背景的。那麼糾結於不能重繪背景已經沒意義了,回到最初目的,除掉邊框,如果說這個CWnd擋住背景,那他的邊框肯定也汙染我們的客戶區,用宏改掉它的習氣。Bingo。我們得到完美的去邊框。
當然,這裡沒有對SDI進行解釋,但是從這裡你完全可以自己去解決這些問題。希望這篇東西可以減少你百度的時間,但我花了兩天時間去百度。