Статический элемент управления в стиле WS_EX_TRANSPARENT не перекрашен

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

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

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

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

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

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

Благодарю.

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам