【问题标题】:CStatic not receiving WM_CTLCOLORCStatic 未收到 WM_CTLCOLOR
【发布时间】:2013-08-13 08:21:18
【问题描述】:

我想我在这里遗漏了一些小东西。

我正在尝试创建一个从 CStatic 继承的具有透明背景的类。我已经创建了一个类的实例,它显示在父级CView 中。但是,当我通过 Visual Studio 上的类视图添加 OnCtlColor 消息处理程序以使背景透明时,它永远不会触发。

这是一个代码sn-p:

Foo.h

class Foo: public CStatic
{
    DECLARE_DYNAMIC(Foo)

public:
    Foo();
    virtual ~Foo();
    virtual void CreateCtrl(CWnd * Parent, POINT TopLeft, SIZE sz);

protected:
    DECLARE_MESSAGE_MAP()
public: 
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};

Foo.cpp

void Foo::CreateCtrl(CWnd * Parent, POINT TopLeft, SIZE sz)
{
    CRect Rect(TopLeft, sz);
    Create(pItem->Value->GetBuffer(), WS_CHILD | WS_VISIBLE | SS_CENTER | SS_NOTIFY, Rect, Parent);
    ShowWindow(SW_SHOW);
}

BEGIN_MESSAGE_MAP(Foo, CStatic) 
    ON_WM_CTLCOLOR_REFLECT()
    ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

HBRUSH Foo::CtlColor(CDC* pDC, UINT nCtlColor)
{
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH)GetStockObject(NULL_BRUSH);
}

BOOL Foo::OnEraseBkgnd(CDC* pDC)
{
    return FALSE;
}

谁能建议我做错了什么?

【问题讨论】:

    标签: visual-c++ mfc


    【解决方案1】:

    WM_CTLCOLOR 被发送到父窗口,而不是静态控件。

    要在静态控件类中捕获消息,您需要在消息映射中使用ON_WM_CTLCOLOR_REFLECT,参见MSDN Docs 并使用HBRUSH Foo::CtlColor(CDC* pDC, UINT nCtlColor)

    【讨论】:

    • 谢谢,我已经设法得到HBRUSH Foo::CtlColor(CDC* pDC, UINT nCtlColor) 了。也许这应该是一个不同的问题,但是当我使用与 OnCtlColor 方法中的相同时,CStatic 保持不变,它没有透明背景。你有什么想法吗?
    • 从此SO Answer:您还需要在静态类中覆盖OnEraseBkgnd()return FALSE 以防止默认背景擦除
    • 我已经根据我的编辑覆盖了OnEraseBkgnd(),但背景仍然是白色的。
    • 您的 .h 文件包含旧代码 (OnCtlColor),但这可能只是一个疏忽——使用相同的代码,我的静态控件不再显示灰色矩形,只是View 的白色背景相同;尝试添加TRACE语句或断点,看看函数是否被调用?
    • 抱歉,忘记更新 .h 文件。这两种方法都被执行了:我在它们上设置了断点,它们被击中了。我正在使用OnDraw 方法绘制我的观点背景。会不会是排序问题。在绘制 CStatic 之后,视图是否可能正在绘制其背景,或者类似的东西?
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2023-03-27
    • 2011-01-28
    • 2010-11-15
    • 1970-01-01
    • 2011-08-02
    • 2020-08-13
    相关资源
    最近更新 更多