zoukankan      html  css  js  c++  java
  • QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)

      这里讨论的只是Windows平台上的实现。
      在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口。相对来说比较麻烦的, 是进行窗口拖动和缩放的处理。
      在 Windows SDK 和 MFC 中比较容易,只要处理 WM_NCHITTEST,返回相应的测试值就可以了。幸运的是,QT中也提供了直接处理各平台消息的方法,在 Windows下只需要重载winEvent方法。

      下面给出了示例代码:

    // include <windows.h>
    
    bool MyDialog::winEvent(MSG* msg, long* result)
    {
        const int captionHeight = 25;
        const int frameWidth = 6;
        
        if (msg->message != WM_NCHITTEST) return false;
    
        QPoint pos = mapFromGlobal(QCursor::pos());
        int w = width();
        int h = height();
    
        if (QRect(frameWidth, captionHeight, w-frameWidth-frameWidth, h-captionHeight-frameWidth).contains(pos))
        {
            *result = HTCLIENT;
        }
        else if (QRect(0, 0, w, captionHeight).contains(pos))
        {
            *result = HTCAPTION;
        }
        else if (QRect(0, captionHeight, frameWidth, h-captionHeight-frameWidth).contains(pos))
        {
            *result = HTLEFT;
        }
        else if (QRect(w-frameWidth, captionHeight, frameWidth, h-captionHeight-frameWidth).contains(pos))
        {
            *result = HTRIGHT;
        } 
        else if  (QRect(frameWidth, h-frameWidth, w-frameWidth-frameWidth, frameWidth).contains(pos))
        {
            *result = HTBOTTOM;
        } 
        else if (QRect(0, h-frameWidth, frameWidth, frameWidth).contains(pos))
        {
            *result = HTBOTTOMLEFT;
        }
        else if (QRect(w-frameWidth, h-frameWidth, frameWidth, frameWidth).contains(pos))
        {
            *result = HTBOTTOMRIGHT;
        }    
        return true;
    }

    参考:http://www.cppblog.com/eXile/archive/2007/12/09/38084.html

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/findumars/p/4851127.html
Copyright © 2011-2022 走看看