2014-10-03 23 views
0

嗯,我想要一個非常簡單的事情,但有點困惑。從CDialog調用繪圖函數:: OnPaint

void CAppDlg::OnPaint() 
    { 
     CPaintDC dc(this); 
     CDC pdc; 
     pdc.CreateCompatibleDC(&dc); 
     CBitmap *oldBmp = pdc.SelectObject(&m_BmpImg[0]); 
     dc.BitBlt(0, 0, m_SizBmpImg[0].cx, m_SizBmpImg[0].cy, &pdc, 0, 0, SRCCOPY); 
     dc.SelectObject(&oldBmp); 
    } 

在上面的代碼片段中,我想把最後3行放到一個單獨的函數中。現在我無法將CPaintDC作爲函數參數傳遞,我需要將其轉換爲CDC或CMemDC。而且我該如何傳遞這個pdc(CDC pdc),或者我應該在我的函數中創建一個新的pdc。

有點解釋的樣本會失去很大的幫助。

+1

您可以通過引用或指針傳遞任何參數作爲參數。 – 2014-10-03 07:17:58

回答

0

這應該工作。

void CAppDlg::OnPaint() 
{ 
    CPaintDC dc(this); 
    CDC pdc; 
    pdc.CreateCompatibleDC(&dc); 

    YourSeparateFUnction(dc, pdc); 
} 

void CAppDlg::YourSeparateFUnction(CPaintDC & dc, CDC & pdc) 
{ 
    CBitmap *oldBmp = pdc.SelectObject(&m_BmpImg[0]); 
    dc.BitBlt(0, 0, m_SizBmpImg[0].cx, m_SizBmpImg[0].cy, &pdc, 0, 0, SRCCOPY); 
    dc.SelectObject(&oldBmp); 
} 
+0

void CAppDlg :: PaintSeperated(CDC * pDC,CDC * pDcCompatible) - 正如我相信CPaintDC僅在OnPaint中可用。 – hypheni 2014-10-03 07:20:05

+2

你是否從'OnPaint'之外的其他函數調用'PaintSeperated'? – 2014-10-03 07:24:39

+3

@hypheni:'CPaintDC'不代表特殊的設備上下文。 「CPaintDC」和「CDC」的唯一區別在於,前者分別在c'tor和d'tor中調用「BeginPaint」和「EndPaint」來正確驗證屏幕區域。通過引用傳遞'CPaintDC'不是一個問題,儘管你可以(或者應該)通過引用傳遞泛型基類:'CDC&'。 – IInspectable 2014-10-04 16:03:52