利用窗口类寻找窗口 与 qt窗口吸附的实现

15 篇文章 0 订阅

关于找窗口这个,之前有写过类似的,这里就大概提一下下,首先是EnumWindows和EnumChildWindows,前者只是会遍历顶层的窗口,所以需要找其他窗口时可以结合后者额使用,具体使用就看函数说明了.. 很简单的了。而GetClassName这个函数可以通过句柄拿到窗口类,比较的话可以通过比如ms的工具好像叫spy++之类的去看窗口的类名或者其他很多方式去获取了,然后字串对比就行了。GetWindowThreadProcessId这个就是后续可能需要进程线程了。

下面就说下吸附喽~ 简单的实现就大概是通过一个计时器,然后定时触发,根据某个窗口的位置绘制想要吸附的窗口。其实原理就这么简单而已。计时器触发的函数就类似于:myWinPos在里面我是用来决定吸附在目标的左或右位置的一个标记。

void updateWinDisplay()
{
    if(myWnd==NULL){
        refreshTimer->stop();
        return;
    }
    HWND parentHandle = myWnd;
    while(GetParent(parentHandle)!=NULL)
        parentHandle = GetParent(parentHandle);
    //寻找父窗口
    if(!GetWindowRect(parentHandle,&WinRect)){
        refreshTimer->stop();
        return;
    }
    //更改大小和位置
    long WinH = WinRect.bottom - WinRect.top;
    int leftPos;
    if(false == myWinPos)
        leftPos = WinRect.left-this->frameGeometry().width();
    else
        leftPos = WinRect.right;
    int reduce = frameGeometry().height()-this->height();
    this->resize(this->width(),WinH-reduce);
    this->setMinimumHeight(WinH-reduce);
    this->setMaximumHeight(WinH-reduce);
    this->move(leftPos,WinRect.top);
}
我这里是实现在鼠标点击拖动的时候会停止计时,然后释放时重新去判断放置的位置。
bool BattleAssUI::eventFilter(QObject* obj, QEvent* event)
{
//    qDebug()<<"eventFilter";
    if(obj== this)
    {
//        qDebug()<<"eventFilter:this";
        if(event->type() == QEvent::NonClientAreaMouseButtonPress)
        {
            mousePress = true;
            refreshTimer->stop();
            qDebug()<<"MouseButtonPress"<<mousePress;
        }
        else if((event->type() == QEvent::NonClientAreaMouseButtonRelease) && mousePress)
        {
            if(((QMouseEvent*)event)->globalX()>WinRect.right)
                myWinPos = true;
            else
                myWinPos = false;
            refreshTimer->start();
            mousePress= false;
            qDebug()<<"MouseButtonRelease"<<mousePress;
        }
        else if((event->type() == QEvent::Resize) && mousePress)
        {
//            QSize tempSize =  const_cast<QSize&>( ((QResizeEvent*)event)->size() );
            const_cast<QSize&>( ((QResizeEvent*)event)->size() ).setHeight(((QResizeEvent*)event)->oldSize().height());
//            this->resize(((QResizeEvent*)event)->size().width(),((QResizeEvent*)event)->oldSize().height());
            refreshTimer->start();
            mousePress= false;
            event->setAccepted(true);
            qDebug()<<"QResizeEvent"<<mousePress;
        }
    }
    return QObject::eventFilter(obj, event);
}
很简单就是这样了,当然这里面其实还不是完善的,这就要靠大家改了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值