我有一個函數,它需要一個位圖圖像的矩形區域,將其重新縮放到不同的尺寸,並在對話框應用程序中的某個窗口內的某個偏移處繪製它:將位圖圖像繪製到窗口中的正確方法
void DrawImage(HANDLE hImageBitmap,
CDC* pDstDC,const CRect& dstRect,
CDC* pSrcDC,const CRect& srcRect)
{
pSrcDC->SelectObject(hImageBitmap);
pDstDC->SetStretchBltMode(HALFTONE);
pDstDC->StretchBlt
(
dstRect.left,dstRect.top,dstRect.Width(),dstRect.Height(),pSrcDC,
srcRect.left,srcRect.top,srcRect.Width(),srcRect.Height(),SRCCOPY
);
}
我使用CWnd m_cImageWindow
成員變量創建並維護該窗口。
我從對話框,對話框的OnPaint
處理程序執行圖如下:
CDC* pDC = m_cImageWindow.GetDC();
CDC cDC;
cDC.CreateCompatibleDC(pDC);
CRect srcRect = ...;
CRect dstRect = ...;
DrawImage(m_hImageBitmap,pDC,dstRect,&cDC,srcRect);
cDC.DeleteDC();
m_cImageWindow.ReleaseDC(pDC);
我有兩個問題:
我看到閃爍每當我改變繪圖參數。解決這個問題的標準方法,從我在這裏和那裏讀到的,是通過使用臨時DC來實現雙緩衝。但據我所知,這正是我已經在做的。
如果某些目標區域落在窗口之外,則會將其塗在對話框中的其他控件上。我可以通過爲這些控件中的每一個調用
MoveWindow
或SetWindowPos
來部分解決此問題。但我仍然可以看到背後的圖像閃爍。我曾嘗試以各種不同的方式致電SetWindowPos
,希望能夠控制嚴格的Z順序。
謝謝。
「OnPaint」事件處理程序不應該創建自己的DC來繪製。你應該使用'CPaintDC'類。 –
@CodyGray:謝謝。我已經嘗試過,但它似乎不適合我。可能是因爲我創建的paint-DC屬於對話框本身,而不屬於我試圖繪製的窗口。你能否提供一些更具體的證據來證明爲什麼「OnPaint'事件處理程序不應該創建它自己的DC」?謝謝。 – goodvibration
嗯...你爲什麼處理的一個窗口(對話)油漆事件,並試圖畫上一個*不同*窗口?如果你想在一個窗口上繪製,處理*該窗口的*繪製事件。 –