zoukankan      html  css  js  c++  java
  • ucGUI的视窗管理回调机制学习

    要熟悉窗口的回调机制,重点理解回调函数作用,消息传递机制。

    uC/GUI的窗口管理是个单独的软件,不是uC/GUI的基本组成部分。代码见\uCGUIGUIWM。当使用uC/GUI窗口管理时,任何能显示在显示终端上的内容都包含在一个窗口里面,这个窗口是LCD屏幕上的一个给用户画图或显示目标的区域。窗口能够是任何尺寸的,能够一次在屏幕上显示多个窗口,也能够在其他窗口当中或之前显示窗口。

    1. 窗口管理的几个名词:
    • 活动窗口: 
      当前正在用来画图或是显示操作的窗口。
    • 回调函数
      回调函数是由用户定义的,当特定事件发生时,指示图像系统调用特定函数的函数。通常当窗口的内容发生改变时,他们用来自动重绘窗口。例如,窗口内显示一幅位图,当窗口移动时,位图并不会自动移动,此时,就需要调用回调函数对窗口进行重绘,即,从观众的角度来看,移动窗口和窗口内容。
    • /父窗口
      子窗口是相对于父窗口定义的窗口。无论何时,只要父窗口移动,则子窗口们都要相应移动。子窗口被父窗口完全包含。拥有同一个父窗口的子窗口们互相间称为兄弟。
    • 客户区
      窗口的客户区就是窗口的可用区。假如窗口包含方框或标题栏,则客户区就是方框或标题栏的内部区域。
    • 句柄
      当一个新的窗口被创建时,WM分配一个唯一的标识符,称为句柄。句柄用在后续对该窗口操作的任何函数中,而且能够利用该句柄唯一标识该窗口。
    • 有效窗口/无效窗口
      有效窗口是个已完全更新,无需重绘的窗口。不管是完全重绘还是局部重绘。当窗口内容发生改变时,WM则标识窗口无效。下一次重绘之后(调用回调函数),窗口又变为有效。

     

    1. 回调机制

    uC/GUI提供给窗口和窗口控件的回调机制的背后,是一个事件驱动标志。在大多数的窗口系统中,流控不但仅时从用户程式到图像系统,而且还要能够从用户程式到图像系统,并且能够通过用户程式提供的回调函数,返回到用户程式。这个机制,就称为回调机制。在uC/GUI中,回到机制用来在窗口管理中出控制窗口的重绘操作,这使得窗口管理的有效性成为可能。

    1.  回调函数的使用

    使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型:

    void callback(WM_MESSAGE *pMsg)其中pMsg为指向消息的指针。回调函数执行的功能依赖于所接收到的消息。以上原型后一般跟着switch表达式,表达式定义不同的case表达式下不同的信息对应的不同行为,至少要有一个重绘函数:WM_PAINT()。如程式清单4.1,建立一个自动更新窗口的回调函数

    程式清单 4.1建立一个自动更新窗口的回调函数

    void WinHandler(WM_MESSAGE * pMsg)

    {

        switch (pMsg->MsgId)

        { 

    case:WM_PAINT   GUI_SetBkColor(0xff00);

                   GUI_Clear();

                   GUI_DispStringAt(“hello world”,0,0);

                    Break;

    }

    }

    使用回调函数,更为周详的示例如程式清单4.2所示:

    程式清单4.2  回调函数

    #include"GUI.H"

    /* 背景窗的回调函数 */

     

    static voidcbBackgroundWin(WM_MESSAGE* pMsg) 
    {
    switch(pMsg->MsgId) 
    {
    caseWM_PAINT:    GUI_Clear();
    default:         WM_DefaultProc(pMsg);
    }
    }

    /* 前景窗的回调函数 */

    static voidcbForegroundWin(WM_MESSAGE* pMsg) 
    {
    switch(pMsg->MsgId) 
    {
    caseWM_PAINT:    GUI_SetBkColor(GUI_GREEN);
    GUI_Clear();
    GUI_DispString("Foregroundwindow");
    default:         WM_DefaultProc(pMsg);
    }
    }
    /*  回调机制 */
    static voidDemoRedraw(void) 
    {
    GUI_HWIN hWnd;
    while(1) 
    {
    /*创建一个前景窗 */
    hWnd =WM_CreateWindow(10, 10, 100, 100, WM_CF_SHOW, cbForegroundWin, 0);
    /*显示前景窗*/
    GUI_Delay(1000);
    /* 删除前景窗 */
    WM_DeleteWindow(hWnd);
    GUI_DispStringAt("Backgroundof window has not been redrawn", 10, 10);
    /* 等待,显示并不重绘 */
    GUI_Delay(1000);
    GUI_Clear();
    /* 配置背景窗的回调功能 */
    WM_SetCallback(WM_HBKWIN,cbBackgroundWin);
    /*创建一个前景窗 */
    hWnd =WM_CreateWindow(10, 10, 100, 100,WM_CF_SHOW, cbForegroundWin, 0);
    /* 显示前景窗*/
    GUI_Delay(1000);
    /*删除前景窗 */
    WM_DeleteWindow(hWnd);
    /* 等待,显示将重绘*/
    GUI_Delay(1000);
    /* 删除回调函数 */
    WM_SetCallback(WM_HBKWIN,0);
    }
    }
    voidmain(void) 
    {
    GUI_Init();
    DemoRedraw();
    }

               4.3.4 消息传递机制

    程式清单4.2中,回调函数执行的功能依赖于所接收到的消息。Switch语句中根据消息的类型,分别执行不同的功能。

    WM_MESSAGE的成员如下:

    MsgId:消息类型

    HWin:  目的窗口

    HWinSrc: 源窗口

    Data.p : 数据指针

    Data.v: 数据值

    其中MsgId的类型如下:

       WM_PAINT: 窗口重绘

       WM_CREATE: 窗口一建立就发送

       WM_DELETE: 窗口一删除就发送

       WM_SIZE :  窗口尺寸发生改变就发送

       WM_MOVE :  窗口移动就发送

       WM_SHOW :  接收到show命令就发送

       WM_HIDE :  接收到hide命令就发送

       WM_TOUCH:  触摸屏信息 

    应用程式还能够为自己定义额外的消息。为确保他们不用到uC/GUI的消息ID,用户定义的消息从WM_USER后面开始,如:

    #defineMY_MESSAGE_AAA   WM_USER +0

    #defineMY_MESSAGE_BBB   WM_USER +

  • 相关阅读:
    qt预览的UI界面和实际运行出来的界面分辨率不一样
    QByteArray转QString 例如 0x45 转成 “45”
    QML访问C++成员函数报错:TypeError: Property 'showHome' of object [object Object] is not a function
    Qt生成二维码
    Android解析编译之后的所有文件(so,dex,xml,arsc)格式
    Android逆向之旅---解析编译之后的Dex文件格式
    Android逆向之旅---解析编译之后的Resource.arsc文件格式
    Android逆向之旅---解析编译之后的AndroidManifest文件格式
    Android签名机制之---签名验证过程详解
    Android签名机制之---签名过程详解
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2989526.html
Copyright © 2011-2022 走看看