• 仿win7窗体自动顶部最大化左侧右侧半屏效果(改写nativeEvent,使用AdjustWindowRectEx)


    #include "HMainWindow.h"
    
    #include <QApplication>
    #ifdef Q_OS_WIN
    #include <qt_windows.h>
    #include <dwmapi.h>
    
    #ifndef GET_X_LPARAM
    #define GET_X_LPARAM(lParam)    ((int)(short)LOWORD(lParam))
    #endif
    #ifndef GET_Y_LPARAM
    #define GET_Y_LPARAM(lParam)    ((int)(short)HIWORD(lParam))
    #endif
    
    #endif
    HMainWindow::HMainWindow(QWidget *parent) : QMainWindow(parent)
    {
        setObjectName("HFramer");
        setWindowTitle("HFramer");
        setWidgetBorderless(this);
    }
    
    
    void HMainWindow::setWidgetBorderless(const QWidget *widget)
    {
        setWindowFlags( Qt::WindowMinimizeButtonHint | Qt::FramelessWindowHint);
    #ifdef Q_OS_WIN
        HWND hwnd = reinterpret_cast<HWND>(widget->winId());
        DWORD style = GetWindowLong(hwnd, GWL_STYLE);
        SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CAPTION);
    #endif
    }
    
    bool HMainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
    {
    #ifdef Q_OS_WIN
        if (eventType != "windows_generic_MSG")
            return false;
    
        MSG* msg = static_cast<MSG*>(message);
        QWidget* widget = QWidget::find(reinterpret_cast<WId>(msg->hwnd));
        if (!widget)
            return false;
    
        switch (msg->message) {
    
        case WM_NCCALCSIZE: {
            *result = 0;
            return true;
        }
    
        case WM_NCHITTEST: {
            const LONG borderWidth = 9;
            RECT winrect;
            GetWindowRect(msg->hwnd, &winrect);
            long x = GET_X_LPARAM(msg->lParam);
            long y = GET_Y_LPARAM(msg->lParam);
    
            // bottom right
            if (x < winrect.right && x >= winrect.right - borderWidth &&
                    y < winrect.bottom && y >= winrect.bottom - borderWidth)
            {
                *result = HTBOTTOMRIGHT;
                return true;
            }
    
            return false;
        }
    
        case WM_GETMINMAXINFO: {
            if (::IsZoomed(msg->hwnd)) {
    
                RECT frame = { 0, 0, 0, 0 };
                AdjustWindowRectEx(&frame, WS_OVERLAPPEDWINDOW, FALSE, 0);
                frame.left = abs(frame.left);
                frame.top = abs(frame.bottom);
                widget->setContentsMargins(frame.left, frame.top, frame.right, frame.bottom);
            }
            else {
                widget->setContentsMargins(0, 0, 0, 0);
            }
    
            *result = ::DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
            return true;
        }
            break;
    
        default:
            break;
        }
    
    #endif
    
        return QMainWindow::nativeEvent(eventType, message, result);
    }
    
    这样可以实现系统的虚框,重新写nativeEvent方法

    http://www.qtcn.org/bbs/read-htm-tid-62907.html

  • 相关阅读:
    idea找不到或无法加载主类
    Scala核心编程_第09章 面向对象编程(高级特性)
    spring源码:学习线索
    Redis
    spring源码:Aware接口
    spring源码:核心组件(li)
    java socket编程
    spring源码:ApplicationContext的增强功能(li)
    spring源码:web容器启动
    spring源码:BeanPostProcessor(li)
  • 原文地址:https://www.cnblogs.com/findumars/p/6759480.html
Copyright © 2020-2023  润新知