uCGUI窗口的创建

窗口管理结构体

/* 窗体管理结构体 共30个字节 */
struct WM_Obj {
  GUI_RECT Rect;        //窗体尺寸(x0,y0,x1,y1)     8个字节
  GUI_RECT InvalidRect; //无效区域(x0,y0,x1,y1)     8个字节
  WM_CALLBACK* cb;      //回调函数                     4个字节

  WM_HWIN hNextLin;     //指向链表中的下一个窗体       2个字节

  WM_HWIN hParent;      //当前窗体的父窗体             2个字节
  WM_HWIN hFirstChild;  //当前窗体的第一个子窗体       2个字节
  WM_HWIN hNext;        //下一个兄弟窗体               2个字节

  U16 Status;           //标志位                       2个字节
};

窗口创建的标志

#define WM_CF_HASTRANS         (1<<0)  /* Has transparency. Needs to be defined for windows which do not fill the entire
                                          section of their (client) rectangle. */
#define WM_CF_HIDE             (0<<1)  /* Hide window after creation (default !) */
#define WM_CF_SHOW             (1<<1)  /* Show window after creation */
#define WM_CF_MEMDEV           (1<<2)  /* Use memory device for redraws */
#define WM_CF_STAYONTOP        (1<<3)  /* Stay on top */
#define WM_CF_DISABLED         (1<<4)  /* Disabled: Does not receive PID (mouse & touch) input */
/* Create only flags ... Not available as status flags */
#define WM_CF_ACTIVATE         (1<<5)  /* If automatic activation upon creation of window is desired */
#define WM_CF_FGND             (0<<6)  /* Put window in foreground after creation (default !) */
#define WM_CF_BGND             (1<<6)  /* Put window in background after creation */

/* Anchor flags */
#define WM_CF_ANCHOR_RIGHT     (1<<7)  /* Right anchor ... If parent is resized, distance to right will remain const (left is default) */
#define WM_CF_ANCHOR_BOTTOM    (1<<8)  /* Bottom anchor ... If parent is resized, distance to bottom will remain const (top is default) */
#define WM_CF_ANCHOR_LEFT      (1<<9)  /* Left anchor ... If parent is resized, distance to left will remain const (left is default) */
#define WM_CF_ANCHOR_TOP       (1<<10) /* Top anchor ... If parent is resized, distance to top will remain const (top is default) */

#define WM_CF_CONST_OUTLINE    (1<<11) /* Constant outline. This is relevant for transparent windows only. If a window is transparent
                                       and does not have a constant outline, its background is invalided instead of the window itself.
                                       This causes add. computation time when redrawing. */
#define WM_CF_LATE_CLIP        (1<<12)
#define WM_CF_MEMDEV_ON_REDRAW (1<<13)
#define WM_CF_RESERVED3        (1<<14)
#define WM_CF_RESERVED4        (1<<15)

窗口创建的过程分析

1、WM_CreateWindowAsChild

WM_HWIN WM_CreateWindowAsChild( int x0, int y0, int width, int height
                               ,WM_HWIN hParent, U16 Style, WM_CALLBACK* cb
                               ,int NumExtraBytes) {
  WM_Obj* pWin;
  WM_HWIN hWin;
  WM_ASSERT_NOT_IN_PAINT();             //断言,这里没有使用
  WM_LOCK();
  Style |= WM__CreateFlags;             //给窗口的标志增加一个创建标志
  /* Default parent is Desktop 0 */
  if (!hParent) {                       //如果不存在父窗口,比如说桌面窗口
    if (WM__NumWindows) {                //创建桌面窗口,这个不会执行的
    #if GUI_NUM_LAYERS == 1
      hParent = WM__ahDesktopWin[0];    //如果用户没有指定当前创建窗口的父窗口,而且该窗口
                                               //又不是桌面窗口,默认的将桌面窗口作为其父窗口
    #else
      hParent = WM__ahDesktopWin[GUI_Context.SelLayer];
    #endif
    }
  }
  if (hParent == WM_UNATTACHED) {
    hParent = WM_HWIN_NULL;
  }
  if (hParent) {
    WM_Obj* pParent = WM_H2P(hParent);
    x0 += pParent->Rect.x0;
    y0 += pParent->Rect.y0;
    if (width==0) {
      width = pParent->Rect.x1 - pParent->Rect.x0+1;
    }
    if (height==0) {
      height = pParent->Rect.y1 - pParent->Rect.y0+1;
    }
  }
  if ((hWin = (WM_HWIN) GUI_ALLOC_AllocZero(NumExtraBytes + sizeof(WM_Obj))) == 0) {
    GUI_DEBUG_ERROROUT("WM_CreateWindow: No memory to create window");                                                         //如果没有空间来创建需要的动态内存块
  } else {                                           //申请动态内存成功
    WM__NumWindows++;                                //保存系统总窗口数目的计数器加1
    pWin = WM_H2P(hWin);                             //计算获取动态内存数据区的地址
     /* 向动态内存区写入当前窗口的参数 */
    pWin->Rect.x0 = x0;
    pWin->Rect.y0 = y0;
    pWin->Rect.x1 = x0 + width - 1;
    pWin->Rect.y1 = y0 + height - 1;
    pWin->cb = cb;                                   //保存回调函数
    /* Copy the flags which can simply be accepted */
    pWin->Status |= (Style & (WM_CF_SHOW |
                              WM_SF_MEMDEV |
                              WM_CF_MEMDEV_ON_REDRAW |
                              WM_SF_STAYONTOP |
                              WM_CF_DISABLED |
                              WM_SF_CONST_OUTLINE |
                              WM_SF_HASTRANS |
                              WM_CF_ANCHOR_RIGHT |
                              WM_CF_ANCHOR_BOTTOM |
                              WM_CF_ANCHOR_LEFT |
                              WM_CF_ANCHOR_TOP |
                              WM_CF_LATE_CLIP));
    /* Add to linked lists */
    _AddToLinList(hWin);                              //将窗口插入到窗口管理链表当中
    WM__InsertWindowIntoList(hWin, hParent);           //插入到父窗体管理链表当中

     /* 根据用户定义的窗口风格进行一些列的操作 */
    /* Activate window if WM_CF_ACTIVATE is specified */
    if (Style & WM_CF_ACTIVATE) {                     //如果带激活标志的话,就激活窗口
      WM_SelectWindow(hWin);  /* This is not needed if callbacks are being used, but it does not cost a lot and makes life easier ... */
    }
    /* Handle the Style flags, one at a time */
    #if WM_SUPPORT_TRANSPARENCY
      if (Style & WM_SF_HASTRANS) {                   //透明窗口
        WM__TransWindowCnt++;          /* Increment counter for transparency windows */
      }
    #endif
    if (Style & WM_CF_BGND) {
      WM_BringToBottom(hWin);
    }

    if (Style & WM_CF_SHOW) {             //显示窗口
      pWin->Status |= WM_SF_ISVIS;         //设置可视状态位
      WM_InvalidateWindow(hWin);           //如果有显示命令,还会设置窗口为无效,等待重绘
    }
    WM__SendMsgNoData(hWin, WM_CREATE);   //发一个创建消息,这样创建的时候就可以在回调函数中进行处理
  }
  WM_UNLOCK();
  return hWin;
}
时间: 2024-10-29 07:58:36

uCGUI窗口的创建的相关文章

uCGUI窗口初始化过程

一.相关结构体和变量 重要的uCGUI系统全局变量 NextDrawWin                      下一个需要重绘的窗口句柄 WM__NumWindows       系统当前的总共窗口总数 WM__NumInvalidWindows   系统当前无效的窗口总数,这些窗口都需要重绘的 WM__FirstWin                    系统第一个窗口的句柄,默认的就是桌面窗口,桌面窗口的句柄就是1.在创建桌面窗口的时候,会将桌面窗口的句柄,付给该全局变量,该动作发生

Windows窗口的创建

Windows窗口创建的基本代码: #include <Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd ) { TCHAR* appName = TEXT("Demo

uCGUI窗口操作点滴记录

一.窗口操作的要点 0.调试时观察的全局变量WM__NumWindows.WM__NumInvalidWindows.WM__FirstWin.NextDrawWin. 1. 创建一个窗口的时候,会给此窗口发送“创建”消息,从而执行它的回到函数:如果创建窗口的状态标志为“可视(WM_CF_SHOW)”,那么在执行GUI_Exec函数时会对窗口进行重绘.如果创建窗口的标志带有WM_CF_ACTIVATE,那么这个窗口在创建的时候也会被激活,否则不激活.2. WM_SendMessage()发送消息

DockWidget参数窗口的创建

Qt QMainWindow上添加QDockWidget窗口 <一>.建立一个标准的参数Dialog :StdDialog(QDockWidget) (窗口(QWidget) -> LeftParamDlg/ RightParamDlg(QFrame)->StdDialog(QDockWidget)) 窗口(QWidget) :designer设计 LeftParamDlg/ RightParamDlg(QFrame):刚才的窗口能够显示 StdDialog(QDockWidget

uCGUI窗口操作要点

1. 创建一个窗口的时候,会给此窗口发送“创建”消息,从而执行它的回到函数:如果创建窗口的状态标志为“可视(WM_CF_SHOW)”,那么在执行GUI_Exec函数时会对窗口进行重绘.如果创建窗口的标志带有WM_CF_ACTIVATE,那么这个窗口在创建的时候也会被激活,否则不激活.2. WM_SendMessage()发送消息的函数,本身也是执行消息的函数(通过调用接收方的回调函数),所以调用发送消息的函数发送的消息只可能被处理一次3. WM_SelectWindow()选中窗口的意思是:接下

消息循环,注册窗口,创建窗口【图解】

本文是Win32编程基础 尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键 DirectX编程也是建立在这个基础之上的,所以,在你可以熟练的进行简单的Win32编程之后DirectX编程也就触手可得. 1.1 简单的WIN32程序 在以前的C语言编程中,一个最简单的程序可以只有两行. void main(void) { printf "Hello World!"; } 而要实现同样功能的Window

Android4.4 Framework分析——Activity窗口的创建过程(一)

学习android的窗口模块一周多了,感觉自己对这个模块的理解还是比较模糊,先把get的知识点记录一下. 下图是学习过程记录的activity窗口启动过程序列图,没有或者没办法完整的描绘出来,整个过程比较复杂: 整个学习过程中是参照老罗的android之旅博客和<深入理解android内核设计思想>一书来辅助的,非常感谢前辈. Activity的整体启动过程可查看Android4.4 framework分析--Launcher中启动应用程序(startActivity)的过程的序列图,本文关注

[ucgui] 对话框1——创建对话框

>_<" 小工具和对话框的区别: 小工具可以创建并独立使用,因为它们本质上就是窗口.但是,通常需要使用对话框,它是包含一个或多个小工具的窗口. 对话框通常是一个窗口,它在出现时会要求用户输入信息.它可能包含多个小工具,要求用户根据各种选择来提供信息,或者以消息框的形式,仅提供信息 (比如向用户提供注意事项或警告)和一个“确定”按钮. >_<" 对话框的基本原理: 输入焦点 窗口管理器能记住用户使用触摸屏.鼠标.键盘或用其他方式最终所选择的窗口或窗口对象.该窗口会

Python Tkinter 学习笔记(第一个简单窗口的创建)

#from Tkinter import * """ 需要使用小写的tkinter """ from tkinter import * root = Tk() w = Label(root,text="Hello fudianheg") w.pack() root.mainloop() """ import的(tkinter)包含了所有的类,函数还有其它TK toolkit工作需要的东西大多数情况