2013-08-13 4 views
1

Я думаю, что мне не хватает чего-то маленького здесь.CStatic не принимает WM_CTLCOLOR

Я пытаюсь создать класс, который наследует CStatic с прозрачным фоном. Мне удалось создать экземпляр класса, и он отображается в родительском 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; 
} 

Может кто-нибудь предложить, что я могу делать неправильно?

ответ

6

WM_CTLCOLOR отправляется в родительское окно, а не в статическое управление.

Чтобы поймать сообщение в классе статического контроля, вам необходимо использовать ON_WM_CTLCOLOR_REFLECT на вашей карте сообщений, см. MSDN Docs и использовать HBRUSH Foo::CtlColor(CDC* pDC, UINT nCtlColor).

+0

Спасибо, мне удалось получить 'HBRUSH Foo :: CtlColor (CDC * pDC, UINT nCtlColor)' сейчас. Возможно, это должны быть разные вопросы, но когда я использую то же, что и в моем методе OnCtlColor, CStatic остается прежним, он не имеет прозрачного фона. У вас есть идеи, почему? –

+0

Из этого [SO ответ] (http://stackoverflow.com/a/4454240/1850797): вам также нужно переопределить 'OnEraseBkgnd()' в вашем статическом классе и 'return FALSE', чтобы предотвратить стирание фона по умолчанию –

+0

У меня есть переопределить 'OnEraseBkgnd()' согласно моему правлению, но фон все еще белый. –

Смежные вопросы