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

StackOverflow https://stackoverflow.com/questions/319393

  •  11-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Спасибо.

Это было полезно?

Решение

Я бы предположил, однако, что если вы обрабатываете оба WM_ERASEBKGND WM_ERASEBKGND и тот Сообщения WM_PAINT сообщения, то у вас должны быть охвачены все варианты рисования, без необходимости прибегать к использованию WS_EX_ПРОЗРАЧНЫЙ Стиль.

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

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

Другие советы

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 - извините за русский, но есть пример.Example have hyper link "В примере, который вы можете скачать", on bottom article after code sample.Учи русский :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top