Как сохранить аэростекло при работе с WM_NCPAINT WinEvent

Я обрабатываю WM_NCPAINT WinEvent для рисования кнопки в не-клиентской области моего окна. Но, как вы можете видеть на следующем изображении, граница аэростекла исчезла, и у моего окна нет границы. Итак, я нашел этот ответ: Обработка WM_NCPAINT "брейки" DWM рендеринг стекла в Vista / Aero и я пытался применить решение, предложенное на этой странице, в моем проекте, но безрезультатно. Что я делаю не так?

Скриншот моего окна:

введите описание изображения здесь

В мой файл .pro я добавил:

LIBS += -lGdi32
LIBS += -lUser32
LIBS += -lDwmApi
LIBS += -lUxTheme

И вот мой код:

#include <windows.h>
#include <dwmapi.h>
#include <Uxtheme.h>
#include <tmschema.h>
#include <Strsafe.h>
#include <limits.h>

HTHEME m_htheme;

bool MainWindow::winEvent(MSG *pMessage, long *result)
{
UINT m = pMessage->message;
if(m == WM_NCPAINT || m == WM_ACTIVATE)
{
draw();
return true;
}
return QWidget::winEvent(pMessage, result);
}

void MainWindow::draw()
{
HWND id = winId();

DWMNCRENDERINGPOLICY policy = DWMNCRP_ENABLED;
HRESULT hr = DwmSetWindowAttribute(id, DWMWA_NCRENDERING_POLICY, (void*)&policy, sizeof(DWMNCRENDERINGPOLICY));

if(SUCCEEDED(hr))
{
m_htheme = OpenThemeData(id, L"Button");
if (m_htheme)
{
HDC hDeviceContext = GetWindowDC(id);
RECT rc = {10, 10, 100, 32};
RECT rcContent;

LPCWSTR caption = TEXT("text");
size_t cch;
StringCchLength(caption, MAX_PATH, &cch);

hr = DrawThemeBackground(m_htheme, hDeviceContext, BP_PUSHBUTTON, CBS_NORMAL, &rc, 0);

if (SUCCEEDED(hr))
hr = GetThemeBackgroundContentRect(m_htheme, hDeviceContext, BP_PUSHBUTTON,
CBS_NORMAL, &rc, &rcContent);

if (SUCCEEDED(hr))
hr = DrawThemeText(m_htheme, hDeviceContext, BP_PUSHBUTTON, CBS_NORMAL,
caption, cch, DT_CENTER | DT_VCENTER | DT_SINGLELINE, 0, &rcContent);
}
}
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]