0

ウィンドウの非クライアント領域にプッシュボタンを描画するために WM_NCPAINT WinEvent を処理しています。しかし、次の画像でわかるように、エアロ ガラスの境界線が消えており、私のウィンドウには境界線がありません。だから私はこの答えを見つけました: WM_NCPAINT を処理すると、Vista/Aero で DWM ガラスのレンダリングが「中断」し、そのページで提案されているソリューションをプロジェクトに適用しようとしましたが、結果はありませんでした。私が間違っていることは何ですか?

私のウィンドウのスクリーンショット:

ここに画像の説明を入力

私が追加した.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);
        }
    }
}
4

0 に答える 0