как сохранить тень в окне без полей - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь отбросить тень на окно без полей, используя Qt в окнах.Мне удалось отбросить тень при запуске приложения, ссылаясь на следующую статью.

Но я столкнулся с проблемой, что тень исчезнет, ​​если приложение будет деактивировано и повторно активировано(Другими словами, щелкните другие приложения и снова щелкните мое приложение.)

Возможно, моя реализация недостаточно хороша.Я рад, если у вас есть идеи по этому вопросу.

Я пытаюсь улучшить Qt с помощью Привязки Go Вот фрагмент кода:

package qframelesswindow

import (
    "unsafe"

    "github.com/therecipe/qt/core"
    "github.com/therecipe/qt/widgets"

    win "github.com/akiyosi/w32"
)

func (f *QFramelessWindow) SetNativeEvent(app *widgets.QApplication) {
    filterObj := core.NewQAbstractNativeEventFilter()
    filterObj.ConnectNativeEventFilter(func(eventType *core.QByteArray, message unsafe.Pointer, result int) bool {
        msg := (*win.MSG)(message)
        lparam := msg.LParam
        hwnd := msg.Hwnd
        var uflag uint
        uflag = win.SWP_NOZORDER | win.SWP_NOOWNERZORDER | win.SWP_NOMOVE | win.SWP_NOSIZE | win.SWP_FRAMECHANGED
        var nullptr win.HWND
        shadow := &win.MARGINS{0, 0, 0, 1}

        switch msg.Message {
        case win.WM_CREATE:
            style := win.WS_POPUP | win.WS_THICKFRAME | win.WS_MINIMIZEBOX | win.WS_MAXIMIZEBOX | win.WS_CAPTION
            win.SetWindowLong(hwnd, win.GWL_STYLE, uint32(style))

            win.DwmExtendFrameIntoClientArea(hwnd, shadow)
            win.SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, uflag)

            return true

        case win.WM_NCCALCSIZE:
            if msg.WParam == 1 {
                // this kills the window frame and title bar we added with WS_THICKFRAME and WS_CAPTION
                result = 0
                return true
            }
            return false

        case win.WM_GETMINMAXINFO:
            mm := (*win.MINMAXINFO)((unsafe.Pointer)(lparam))
            mm.PtMinTrackSize.X = int32(f.minimumWidth)
            mm.PtMinTrackSize.Y = int32(f.minimumHeight)
            return true

        default:
        }
        return false
    })
    app.InstallNativeEventFilter(filterObj)
}

Весь исходный код находится в моем хранилище; akiyosi / goqtframelesswindow

1 Ответ

1 голос
/ 19 апреля 2019

WM_NCCALCSIZE:

Если wParam равен TRUE, приложение должно вернуть ноль или комбинацию следующих значений. (В документе)

А также:

Когда wParam равен TRUE, просто возвращая 0 без обработки прямоугольников NCCALCSIZE_PARAMS, размер клиентской области изменится до размера окна, включая рамку окна.Это удалит рамку окна и элементы заголовка из вашего окна, оставив только отображенную клиентскую область.

Начиная с Windows Vista, простой возврат 0 не влияет на расширенные кадры, будет удален только стандартный кадр.

РЕДАКТИРОВАТЬ:

Установите возвращаемое значение с помощью DWL_MSGRESULT вместо result = 0.

...