 |
在普通的Win32應用程式中,創建窗口後處理WM_PAINT消息時,一般都在主窗口的客戶區域繪圖。 然而,在MFC單文檔應用程式中,CView類為主窗口單獨創建了一個沒有標題欄的子窗口,在該類的OnDraw(CDC* pDC)方法中繪圖時,實際上是在給這個子窗口繪圖,而不是主窗口的客戶區域。
|
 |
這主要是因為,工具欄和狀態欄必須位於主窗口的客戶區域,顯示後會把主窗口的客戶區域覆蓋掉一部分,使得主窗口的WM_PAINT消息獲得的hdc的左上角坐標(0, 0)不再位於白色繪圖區域的最左上角的頂點,而是位於工具欄最左上角的頂點了。 所以,MFC不得不再建立一個子窗口,放在工具欄和狀態欄的中間充當繪圖區域。。。。
另外,菜單欄一般都是綁在窗口上的,只能位於主窗口的非客戶區域。因此,一個Win32程序,如果只有菜單欄,沒有工具欄和狀態欄的話,一般不用再建立一個子窗口來充當繪圖區域。
|
 |
要是使用了工具欄或狀態欄但又沒有為繪圖區域專門建立一個子窗口,那麼就是這種效果:  工具欄和狀態欄將會把繪圖區域的一部分給遮住,並且滾動條也會出現在工具欄和狀態欄的右邊。
|
 |
然而,通常我們要求的是,滾動條只出現在客戶區域旁邊: 
|
 |
 如果不為繪圖區創建子窗口的話,那麼水平滾動條就會出現在狀態欄的下面,顯然這是很不符合要求的。
|
 |
這是1樓所示MFC程序的部分代碼: void CMFCApplication2View::OnDraw(CDC* pDC) { CMFCApplication2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;
// TODO: 在此處為本機數據添加繪製代碼 pDC->TextOut(0, 0, TEXT("在此處為本機數據添加繪製代碼"));
TCHAR text[100]; RECT rect; ::GetClientRect(::GetParent(m_hWnd), &rect); _stprintf_s(text, TEXT("父窗口客戶區大小: %d x %d"), rect.right - rect.left, rect.bottom - rect.top); pDC->TextOut(0, 16, text);
GetClientRect(&rect); _stprintf_s(text, TEXT("子窗口客戶區大小: %d x %d"), rect.right - rect.left, rect.bottom - rect.top); pDC->TextOut(0, 32, text);
RECT rcParentWnd; ::GetWindowRect(::GetParent(m_hWnd), &rcParentWnd); GetWindowRect(&rect); _stprintf_s(text, TEXT("子窗口相對於父窗口的位置: (%d, %d)"), rect.left - rcParentWnd.left, rect.top - rcParentWnd.top); pDC->TextOut(0, 48, text); }
void CMFCApplication2View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 ::SetWindowText(::GetParent(m_hWnd), TEXT("yes")); ::SetWindowText(m_hWnd, TEXT("no")); // 子窗口根本就沒有標題欄,所以這句毫無作用
CView::OnLButtonDown(nFlags, point); }
|