我是新來MFC和Windows編程的一般,這是我一直不明白
我到處都在讀它說,不要在OnPaint中使用CClientDC,只使用CPaintDC
在我的代碼中,我追加我的矩形繪圖功能的OnPaint()處理程序創建的默認,當我使用嚮導如果我在OnPaint()函數中使用CClientDC會發生什麼?
void Cgraph_on_dlgboxDlg::OnPaint()
{
CPaintDC dc(this); // ----------------------------> LINE 1
if (IsIconic())
{
// CPaintDC dc(this); // device context for painting // ----------------------------> LINE 2
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1)/2;
int y = (rect.Height() - cyIcon + 1)/2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
COLORREF pencolour = RGB(0, 0, 0);
COLORREF brushcolour = RGB(0, 0, 255);
CPen pen(PS_SOLID, 5, pencolour);
CBrush brush(HS_CROSS, brushcolour);
// CPaintDC Dc(this); // ----------------------------> LINE 3
// CClientDC Dc(this); // ----------------------------> LINE 4
dc.SetBkMode(TRANSPARENT);
/****
get rectangle coordinates and properties
****/
dc.Rectangle(CRect(point1, point2));
}
在此代碼使一個基於對話框的MFC應用程序,原來,LINE 1
不存在。在這種情況下,如果在LINE 4
中聲明CClientDC
,但程序中沒有繪製CPaintDC
中的任何內容,則在LINE 3
處於啓用狀態時,程序將繪製一個矩形。如果將LINE 2
中的CPaintDC移除到LINE 1
,並且將LINE 3和4註釋掉,它就會起作用。這是爲什麼發生?根據我的理解,CClientDC不應該在這裏工作,或者我錯過了什麼?
再一次,CPaintDC
LINE 2
不應該只有在if塊的範圍內?爲什麼聲明CPaintDC兩次完全沒有輸出?
'的'OnPaint'處理器使用'CPaintDC'這一點很重要,因爲它構造函數/析構函數時會自動調用'BeginPaint'和'EndPaint'。如果你不這樣做,你的應用程序將被WM_PAINT消息充斥,因爲髒矩形永遠不會被驗證。你必須永遠* *創建一個以上的'CPaintDC',因爲它會再打電話'BeginPaint',這是無效的。 –