相关疑难解决方法(0)

所有者绘制的按钮,WM_CTLCOLORBTN和WM_DRAWITEM(清除HDC)

我正在尝试实现一个简单的所有者绘制按钮,它只包含画笔中的图像.

这是我的代码(WTL,但它非常简单):

case WM_CTLCOLORBTN:
    dc.SetBkMode(TRANSPARENT);
    POINT pt = { 0 };
    button.MapWindowPoints(m_hWnd, &pt, 1);
    dc.SetBrushOrg(-pt.x, -pt.y, NULL);
    return m_brushHeader;
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常,但为了正确的键盘支持,我必须添加焦点矩形.所以现在我也在处理这个WM_DRAWITEM消息:

case WM_DRAWITEM:
    if(lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_FOCUS))
    {
        if((lpDrawItemStruct->itemState & ODS_FOCUS) && 
            !(lpDrawItemStruct->itemState & ODS_NOFOCUSRECT))
        {
            dc.DrawFocusRect(&lpDrawItemStruct->rcItem);
        }
        else
        {
            // Need to remove the rectangle here!
        }
        break;
    }
    break;
Run Code Online (Sandbox Code Playgroud)

矩形已正确添加,但当焦点移动到另一个按钮,并且我收到ODA_DRAWENTIRE请求时,我必须清除它.

如何清除HDC的内容?我发现只有用颜色等填充它的方法.我需要将它变成空的/透明的,就像使用之前一样DrawFocusRect.

PS该应用程序使用视觉样式,即ComCtl32.dll版本6.

winapi

2
推荐指数
1
解决办法
3479
查看次数

标签 统计

winapi ×1