【发布时间】:2016-01-27 03:10:27
【问题描述】:
当我查看TWinControl 时,Canvas 被clBtnFace 屏蔽,然后调用WM_PAINT。这会导致我不需要的不可避免的闪烁。此外,给定的画布允许在滚动条上绘图,从而在 WM_PAINT 事件后重新绘制滚动条并产生更多闪烁。
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 并且您显示的代码块是绘制方法?不如你把这个问题说清楚一点,这是一团糟。或者你是在画箱里画画吗?
-
你想多了。如果您说的是真的,那么所有标准控件都会像您所描述的那样闪烁不良。那明显是错的。导致闪烁问题的原因可能在于您自己的绘图代码,而不是
TWinControl如何管理其Canvas。请显示您遇到问题的实际代码。 -
我们需要minimal reproducible example 为您提供帮助