码迷,mamicode.com
首页 > 其他好文 > 详细

uCGUI窗口的创建

时间:2014-11-18 17:23:44      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   io   color   ar   os   使用   sp   

窗口管理结构体

/* 窗体管理结构体 共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; }

 

uCGUI窗口的创建

标签:des   style   blog   io   color   ar   os   使用   sp   

原文地址:http://www.cnblogs.com/amanlikethis/p/4106044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!