如何创建与实心画笔颜色相同的笔?

时间:2019-03-18 20:10:32

标签: winapi brush pen

我想使用C / C ++ / Asm / Delphi等仅使用Windows API函数(没有点网之类的东西)来获得SolidBrush的颜色(colorref)来创建相同颜色的笔。

如果有帮助,这就是我要完成的工作:我已在可调整大小的窗口中使用PolyLine绘制了一条曲线。

每次调整窗口大小时,让Windows清除背景都会导致非常明显的闪烁。为了将闪烁减少到最低程度,我可以获取Windows用来清除窗口的背景画笔(GetClassLongPr),并创建相同颜色的笔以使用该笔仅重绘曲线,从而有效擦除它而无需清除整个窗口客户区域(这是导致闪烁的原因。)当然,除非找到从GetClassLongPtr返回的画笔手柄中获取colorref的方法,否则我无法创建该笔。

我不知道如何创建一种颜色为实心画笔窗口用来擦除工作区的笔。

注意:我知道解决闪烁问题的另一种方法是创建一个剪裁区域以仅擦除曲线,但是与仅使用设置为背景色的笔重绘曲线相比,区域处理要慢得多。

长话短说,问题是:如何创建与用于擦除窗口工作区的纯色画笔相同颜色的笔?

谢谢。

1 个答案:

答案 0 :(得分:2)

您将GetObject()的实心画笔参数转换为LOGBRUSH结构,然后使用CreatePen()创建画笔。

但是,避免闪烁的想法是使用双缓冲:不要使用从GetDC()获得的DC,而应该使用内存DC。不要使用WM_ERASEBKGND擦除背景,不要处理WM_ERASEBKGND并返回非零值而无需执行任何操作,而应在WM_PAINT中擦除它。使用CreateCompatibleDC()创建内存DC,然后使用BitBlt()将图形转移到实际DC。

如果仍然使用GDI来进行所有操作,那么现在就更喜欢Direct2D。