【问题标题】:How can I erase the window background in an owner drawn static control?如何擦除所有者绘制的静态控件中的窗口背景?
【发布时间】:2017-06-04 02:06:41
【问题描述】:

我目前正在开发一种“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

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

如何在重绘此控件时擦除它的背景?

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 接收 WM_DRAWITEM 是否需要任何先决条件?我只是试图切换到该消息,但我没有收到它。也许我应该注意 LocationPane 是 CStatic 的自定义子类。
    • @Sossenbinder 我不知道。
    • FillRect() 函数满足了要求,我现在只是在 Paint 例程中使用它
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2015-05-08
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多