QT显示机制(四)

原文地址:QT显示机制(四) 作者:blackdream2

客户端对RegionModifyEvent的处理。

客户端接收到消息后会调用translateRegionModifiedEvent函数来进行处理

bool QETWidget::translateRegionModifiedEvent( const QWSRegionModifiedEvent *event )

{

    QWSRegionManager *rgnMan qt_fbdpy->regionManager();

    if alloc_region_index {

alloc_region_index rgnMan->find( winId() ); //从共享内存中得到region索引

if alloc_region_index {

    return FALSE;

}

    }

    QWSDisplay::grab();

    int revision *rgnMan->revision( alloc_region_index );

    if revision != alloc_region_revision {

alloc_region_revision revision;

QRegion newRegion rgnMan->region( alloc_region_index );//得到显示区域

QWSDisplay::ungrab();                                           

alloc_region newRegion;

 

// set children's allocated region dirty

................

    else {

QWSDisplay::ungrab();

    }

    if event->simpleData.nrectangles )

    {                                               // alloc_region >= exposed

QRegion exposed;                            //需要刷新区域的大小

exposed.setRects( event->rectangles, event->simpleData.nrectangles );

QSize s( qt_screen->deviceWidth(), qt_screen->deviceHeight() );

exposed qt_screen->mapFromDevice( exposed, );

qwsUpdateActivePainters();

repaintDecoration( exposed, FALSE );//绘制窗体的一些修饰如边框,caption等

repaintHierarchy( exposed, FALSE );      //绘制窗体显示区域及子窗体通过发送

    }                                               //PaintEvent事件到各窗体

    qws_regionRequest FALSE;

    return TRUE;

}

repaintHierarchy函数中所有需要刷新的子窗体都会收到Paint事件。在Paint事件中,开始绘图。显示中只刷新exposed这个区域而不是将分配的区域alloc_region 全部刷新一次,这样做可以提高效率。 

 

二:QWSDdisplay::setAltitude 的处理

invokeSetAltitudeconst QWSChangeAltitudeCommand *cmd,

   QWSClient *client

{

    int winId cmd->simpleData.windowid;

    int alt cmd->simpleData.altitude;

    bool fixed cmd->simpleData.fixed;

    ...................

     QWSWindow* changingw findWindow(winId, 0);

    ...................

    changingw->setNeedAck( TRUE );

    if fixed && alt >= 1) {

changingw->onTop TRUE;

    }

    if alt )

lowerWindow( changingw, alt );  //窗体优先级下降

    else

raiseWindow( changingw, alt ); // 提升窗体优先级

    if !changingw->forClient(client) {

refresh();

    }

}

invokeSetAltitude通过调用lowerWindowraiseWindow来调整窗体的优先级,如果一个Widget被显示,即调用Show此时alt == 0; 如果alt == 1则此窗体应该为最上层,如果alt == 2则窗体位FULL-SCREEN即全屏显示的窗体,可以通过setWFlags(WStyle_StaysOnTop) 来设定这个属性。 优先级较高的窗体将被优先显示, 在没有显式通过SetRegionPriority命令来改变窗体优先级的话,在Windows Stack中窗体将按照后进的优先级较高为原则。 可以参考 insertPrioritizedWindow函数,在qt-embedded-free-3.3.6 可能没有这个函数,因为在这个版本中不存在窗体优先级,除了WStyle_StaysOnTop属性的窗体为第一级优先级外,其他窗体都按照后进的优先为原则。 

三:QWSDisplay::requestFocus 的处理请参考invokeSetFocus函数。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值