Windows窗体按钮WM_PAINT在FlatStyle = System上闪烁

时间:2017-09-26 15:57:13

标签: c# windows winforms flicker wm-paint

我正在创建一个Button并将FlatStyle设置为System。

由于此模式通常不支持图像,要将图像与文本一起显示,按钮自己的文本设置为""我在WndProc中通过Graphics.FromHwnd和TextRenderer绘制我自己的图像和文本,通过捕获WM_PAINT并在调用base.WndProc后自己绘制。

这很有效,除了一个问题:在Windows 7上,突出显示的按钮在灰色和蓝色之间缓慢跳动。我发现这种脉冲会导致按钮偶尔闪烁。

  1. 我已经使用了WS_EX_COMPOSITED。
  2. 我尝试过DoubleBuffered = true。它没有帮助。
  3. 我尝试过使用WM_PRINTCLIENT的BufferedGraphics,但这并没有画出Aero风格,所以根本没有脉冲。
  4. 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

“因为这种模式通常不支持图像”......事实证明,完全可以避免这个难题。

在Windows Vista及更高版本上,可以使FlatStyle = System显示图像而无需任何特殊绘画。 (在Windows XP上,回退到默认绘画。)

将BM_SETIMAGE发送到FlatStyle = System按钮以设置图像。 这不适用于Windows窗体的Button AutoSize实现。因此,使用BCM_GETIDEALSIZE进行测量。 最后,如果按钮只有图像而没有文本,请在CreateParams.Style中设置BS_BITMAP。