當我看着TWinControl
時,Canvas
用clBtnFace
填充,然後調用WM_PAINT
。這導致我不需要的不可避免的閃爍。此外,給定的畫布允許繪製滾動條,使滾動條在WM_PAINT
事件之後重繪,並創建更多閃爍。Delphi創建繪畫事件畫布問題
GetMetrics
和內部滾動條信息給出了真正的畫布大小。糾正我,如果我錯了,但我明白一個HDC
是窗體上有一個矩形畫布上打印的句柄。所以我想:
如何創建一個新的
HDC
具有較小的寬度和高度,而不是移動左上角。如果可能,我想通過不使用WM_ERASEBKGND
消息來刪除閃爍,並且不通過分配新大小的HDC
而不通過滾動條打印,然後使用正確的HDC
設置Delphi畫布手柄。使用Windows位圖,我不知道是否應該使用並將位圖畫布大小設置爲
BitBlt()
複製爲TWinControl(下)。DC := GetDC(0); MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom); ReleaseDC(0, DC); MemDC := CreateCompatibleDC(0); OldBitmap := SelectObject(MemDC, MemBitmap); try DC := BeginPaint(Handle, PS); Perform(WM_ERASEBKGND, MemDC, MemDC); Message.DC := MemDC; WMPaint(Message); Message.DC := 0; BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY); EndPaint(Handle, PS); finally SelectObject(MemDC, OldBitmap); DeleteDC(MemDC); DeleteObject(MemBitmap); end;
我不知道該怎麼選擇是在一個無閃爍效果更好,如何實現它在Delphi。
因此,您正在編寫一個自定義的TWinControl,並且您顯示的代碼塊是paint方法?你如何使這個問題更清楚一點,這是一團糟。或者你在Paintbox中繪畫? –
你正在推翻一些東西。如果你所說的是真實的,那麼所有標準控件都會有閃爍現象,正如你所描述的那樣。那明顯是錯的。不管是什麼導致你的閃爍問題可能在你自己的繪圖代碼中,而不是在TWinControl如何管理它的Canvas中。請顯示您遇到問題的實際代碼。 –
我們需要一個[mcve]給你提供幫助 –