2

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

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

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

我不知道如何创建一支笔,它的颜色是实心画笔窗口用来擦除客户区的颜色。

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

在这个长篇大论之后,问题是:如何创建与用于擦除窗口客户区的实心画笔颜色相同的笔?

谢谢你。

4

1 回答 1

3

使用GetObject()将实心画笔参数放入LOGBRUSH结构中,然后使用CreatePen()创建 Pen。

然而,避免闪烁的想法是使用双缓冲:不要绘制到从 GetDC() 获得的 DC,而是绘制到内存 DC。不要使用 WM_ERASEBKGND 擦除背景,处理 WM_ERASEBKGND 并返回非零而不做任何事情,而是在 WM_PAINT 中擦除它。使用CreateCompatibleDC()创建内存 DC,然后使用BitBlt()将您的绘图传输到实际的 DC。

所有这一切,如果无论如何都使用 GDI,那么现在更喜欢 Direct2D。

于 2019-03-18T20:11:44.860 回答