stdware / qwindowkit

Cross-platform frameless window framework for Qt. Support Windows, macOS, Linux.
Apache License 2.0
490 stars 78 forks source link

在win上实现圆角Dialog #52

Closed zhoujun637 closed 6 months ago

zhoujun637 commented 6 months ago

在win上实现圆角的dialog 我用Qt::FramelessWindowHint特性,然后自己绘制阴影和背景,虽然可以实现,但是原来系统自带的效果(如:点击窗口外部,弹窗阴影闪烁)没有了,我希望在保留系统特性的情况下,实现圆角dialog

SineStriker commented 6 months ago

首先 Windows 11 就是圆角。如果你想在 Windows 7 或者 Windows 10 上也用上圆角,那只有一个办法,就是关掉系统边框选项,把QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS关掉,然后设置 QWidget 属性把背景弄透明,自己画圆角,这样做的话标题栏特性和窗口贴边特性都还在,但是你说的那种弹窗阴影闪烁啥的是系统边框带来的,这部分系统特性就没了。至少在 Windows 10 上,圆角和系统边框是冲突的。

zhoujun637 commented 6 months ago

实现了。关掉系统边框之后,自绘圆角边框和阴影。针对边框与阴影闪烁的实现,就需要重写nativeEvent

bool MyDialog::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
    Q_UNUSED(eventType);
    if ("windows_generic_MSG" == eventType)
    {
        MSG* pMsg = reinterpret_cast<MSG*>(message);
        if (pMsg->message == WM_NCACTIVATE)
        {
            bool active = (bool)(pMsg->wParam);
            if (active)
            {
                //获取焦点后的窗口边框与阴影
            }
            else
            {
                //失去焦点后的窗口边框与阴影
            }
            return true;
        }
    }
    return QDialog::nativeEvent(eventType, message, result);

}