lianghong 2022-02-02 23:31 采纳率: 0%
浏览 78

QAxWidget 会导致无边框窗口收不到 WM_NCHITTEST消息吗,怎么才能既用QAxWidget还能处理 WM_NCHITTEST消息 ?

我在一个无边框窗口中处理  WM_NCHITTEST 来改变窗口大小,在加入一个 QAxWidget ("Microsoft Web Browser控件") 后, 处理  WM_NCHITTEST 失灵了, 调试后得知是加入 QAxWidget窗口后再也收不到 WM_NCHITTEST消息了。
    
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //    设置无边框
    this->setWindowFlags( Qt::FramelessWindowHint );
    
    m_axWidget2 = new QAxWidget(ui->centralWidget);

    //此处的{8856F961-340A-11D0-A96B-00C04FD705A2}就是Microsoft Web Browser控件的UUID
    m_axWidget2->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}"));
    m_axWidget2->dynamicCall("Navigate(const QString&)", "https://www.baidu.com"); //调用参

 }

bool MainWindow::nativeEvent(const QByteArray & eventType, void * message, long * result)   //主窗口处理 windows 消息
{
    //qInfo() << eventType << endl;
    if (eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG")
    {
        MSG * pMsg = reinterpret_cast<MSG *>(message);

        if (pMsg->message == WM_NCHITTEST )
        {
            qInfo() << pMsg->message << "WM_NCHITTEST" <<endl;

            int _border = 5;        //鼠标检测范围, pixel
            int m_nInflate = (-11);        //窗口外框彭涨值
            QRect rcTitle = QRect(_border, _border , this->geometry().width(), 32);

            //获取到系统鼠标移动,可以做像qq一样的忙碌检测
            QPoint mPoint = QPoint(INT16((int)pMsg->lParam & 0xFFFF), (int)pMsg->lParam >> 16 & 0xFFFF);
            mPoint = this->mapFromGlobal(mPoint);    //视口坐标转为窗口坐标
            mPoint = QPoint(mPoint.x()+ m_nInflate,mPoint.y() + m_nInflate);

            int xPos = GET_X_LPARAM(pMsg->lParam) - this->frameGeometry().x();//解析鼠标相对坐标
            int yPos = GET_Y_LPARAM(pMsg->lParam) - this->frameGeometry().y();

            if(rcTitle.contains(xPos, yPos))
            {
                *result= HTCAPTION; return true;
            }

            if (mPoint.x()  <= _border)
            {
                if (mPoint.y()  <= _border)
                {
                    *result = HTTOPLEFT; return true;
                }
                else if (mPoint.y() >= (this->height() + 2 * m_nInflate) - _border)
                {
                    *result = HTBOTTOMLEFT; return true;
                }
                else
                {
                    *result = HTLEFT; return true;
                }
            }
            else if (mPoint.x() >= (this->width() + 2 * m_nInflate) - _border)
            {
                if (mPoint.y()  <= _border)
                {
                    *result = HTTOPRIGHT; return true;
                }
                else if (mPoint.y() >= (this->height() + 2 * m_nInflate) - _border)
                {
                    *result = HTBOTTOMRIGHT; return true;
                }
                else
                {
                    *result = HTRIGHT; return true;
                }
            }
            else if (mPoint.y()  <= _border)
            {
                *result = HTTOP; return true;
            }
            else if (mPoint.y() >= (this->height() + 2 * m_nInflate) - _border)
            {
                *result = HTBOTTOM; return true;
            }
        }
      
    }

    return QMainWindow::nativeEvent(eventType, message, result);
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 18:54
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度