2

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

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

这是一个代码片段:

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;
}

谁能建议我可能做错了什么?

4

1 回答 1

7

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

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

于 2013-08-13T08:36:36.390 回答