Я думаю, что мне не хватает чего-то маленького здесь.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;
}
Может кто-нибудь предложить, что я могу делать неправильно?
Спасибо, мне удалось получить 'HBRUSH Foo :: CtlColor (CDC * pDC, UINT nCtlColor)' сейчас. Возможно, это должны быть разные вопросы, но когда я использую то же, что и в моем методе OnCtlColor, CStatic остается прежним, он не имеет прозрачного фона. У вас есть идеи, почему? –
Из этого [SO ответ] (http://stackoverflow.com/a/4454240/1850797): вам также нужно переопределить 'OnEraseBkgnd()' в вашем статическом классе и 'return FALSE', чтобы предотвратить стирание фона по умолчанию –
У меня есть переопределить 'OnEraseBkgnd()' согласно моему правлению, но фон все еще белый. –