如何在所有者绘制的静态控件中擦除窗口背景?

时间:2017-06-03 16:45:24

标签: c++ winapi

我目前正在开发一种“WinMerge”克隆,目前我正在尝试实现一个自定义滚动条,该滚动条稍后应该将比较文件表示为背景中的矩形。

这就是初创公司的样子:

enter image description here

然而,在稍微滚动一下之后,这就是我最终的结果:

enter image description here

正如您可以清楚地看到的那样,只有那些部分看起来正确,我在油漆程序中明确地描绘了这些部分:

void LocationPane::OnPaint(CDCHandle dc)
{
    DefWindowProc();

    dc = GetDC();

    DrawLocationPaneFigures(dc);
}

这是我在.rc文件中配置控件的方式:

CONTROL         "",IDC_LOCATIONPANE,"Static",SS_OWNERDRAW | SS_NOTIFY | WS_BORDER | WS_GROUP,7,21,91,541

正如您所看到的,它是一个所有者绘制的控件。

如何在重新绘制时删除此控件的背景?

1 个答案:

答案 0 :(得分:1)

SS_OWNERDRAW样式的静态控件在需要重绘时会收到WM_DRAWITEM消息。

首先,您需要用OnPaint()的处理程序替换WM_DRAWITEM处理程序。而不是调用GetDC()使用DRAWITEMSTRUCT中提供给您的设备上下文。

要删除背景,通常最好将其作为常规绘画代码的一部分来减少闪烁(例如,通过调用FillRect())。

我建议始终绘制控件的整个客户区。然后,您可以处理WM_ERASEBKGND以返回TRUE,而无需调用DefWindowProc()来进一步减少闪烁。