2013-07-03 35 views
0

我是新來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不應該在這裏工作,或者我錯過了什麼?
再一次,CPaintDCLINE 2不應該只有在if塊的範圍內?爲什麼聲明CPaintDC兩次完全沒有輸出?

+1

'的'OnPaint'處理器使用'CPaintDC'這一點很重要,因爲它構造函數/析構函數時會自動調用'BeginPaint'和'EndPaint'。如果你不這樣做,你的應用程序將被WM_PAINT消息充斥,因爲髒矩形永遠不會被驗證。你必須永遠* *創建一個以上的'CPaintDC',因爲它會再打電話'BeginPaint',這是無效的。 –

回答

1

的CPaintDC構造函數調用BeginPaint的獲得是剪裁到無效區域(即需要繪製的區域)的DC。構建第二個CPaintDC會得到一個空的無效區域,所以它不能繪製任何東西。

默認代碼只在第2行構造一個CPaintDC,因爲當對話框被最小化時,它不打算調用CDialogEx :: OnPaint。當對話框沒有最小化時,CDialogEx :: OnPaint將構造一個CPaintDC。一個且只有一個CPaintDC可用於任何特定的OnPaint調用。

只要您保留原來對CPaintDC的處理,就可以使用CClientDC繪製矩形。

相關問題