Статический элемент управления в стиле WS_EX_TRANSPARENT не перекрашен - PullRequest
0 голосов
/ 26 ноября 2008

Я пытаюсь создать элемент управления, который реализует альфа-смешение на пиксель при рисовании 32-битного растрового изображения.

Я расширил CWnd и использую статический контроль в редакторе ресурсов. Мне удалось правильно закрасить альфа-канал, но статический контроль продолжал рисовать серый фон.

Я перезаписал OnEraseBkgnd, чтобы элемент управления не рисовал фон, но он не работал. Наконец мне удалось это сделать с помощью WS_EX_TRANSPARENT.

Моя проблема сейчас в том, что мой контроль передан другому контролю. В первый раз, когда диалоговое окно нарисовано, все работает нормально ... но если я нажму на "родительский" элемент управления (то есть тот, который находится под моим контролем), мой элемент управления не получит сообщение WM_PAINT. Так что он больше не красится.

Если я сверну приложение и разверну его снова, элементы управления снова будут окрашены.

Пожалуйста, кто-нибудь может дать подсказку? Я схожу с ума от этого контроля !!!

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2008

Я бы сказал, что если вы обрабатываете и сообщения WM_ERASEBKGND , и WM_PAINT , то вы должны охватить все параметры рисования, не прибегая к использованию WS_EX_TRANSPARENT стиль.

Вы уверены, что ваш код не передает эти сообщения на обработку по умолчанию ?

Еще одним вариантом может быть подкласс статического элемента управления, просто чтобы убедиться, что ваш код является единственным, обрабатывающим эти два сообщения.

2 голосов
/ 15 декабря 2010
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
    ON_WM_ERASEBKGND()
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

BOOL CTransparentStatic::OnEraseBkgnd(CDC* /*pDC*/)
{
    // Prevent from default background erasing.
    return FALSE;
}

BOOL CTransparentStatic::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.dwExStyle |= WS_EX_TRANSPARENT;
    return CStatic::PreCreateWindow(cs);
}

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

void CTransparentStatic::PreSubclassWindow()
{
    CStatic::PreSubclassWindow();

    const LONG_PTR exStyle = GetWindowLongPtr(m_hWnd, GWL_EXSTYLE);
    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_TRANSPARENT);
}
0 голосов
/ 30 июля 2009

http://unick -soft.ru / Articles.cgi? Id = 12 - извините по русски, но есть Пример. В примере есть гиперссылка "В примере, которую вы можете скачать", внизу статьи после примера кода. Учите русский:)

...