我目前正在开发一种“WinMerge”克隆,目前我正在尝试实现一个自定义滚动条,该滚动条稍后应该将比较文件表示为背景中的矩形。
这就是初创公司的样子:
然而,在稍微滚动一下之后,这就是我最终的结果:
正如您可以清楚地看到的那样,只有那些部分看起来正确,我在油漆程序中明确地描绘了这些部分:
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
正如您所看到的,它是一个所有者绘制的控件。
如何在重新绘制时删除此控件的背景?
答案 0 :(得分:1)
SS_OWNERDRAW
样式的静态控件在需要重绘时会收到WM_DRAWITEM
消息。
首先,您需要用OnPaint()
的处理程序替换WM_DRAWITEM
处理程序。而不是调用GetDC()
使用DRAWITEMSTRUCT
中提供给您的设备上下文。
要删除背景,通常最好将其作为常规绘画代码的一部分来减少闪烁(例如,通过调用FillRect()
)。
我建议始终绘制控件的整个客户区。然后,您可以处理WM_ERASEBKGND
以返回TRUE
,而无需调用DefWindowProc()
来进一步减少闪烁。