ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:63.50KB ,
资源ID:4543610      下载积分:8 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4543610.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(ucgui窗口分析.doc)为本站上传会员【快乐****生活】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

ucgui窗口分析.doc

1、一、相关结构体与变量 窗口管理结构体 /* 窗口管理结构体 共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、 //当前窗口得父窗口 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

3、 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

4、 (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

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

6、 (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 a

7、nchor 、、、 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

8、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

9、LATE_CLIP (1<<12) #define WM_CF_MEMDEV_ON_REDRAW (1<<13) #define WM_CF_RESERVED3 (1<<14) #define WM_CF_RESERVED4 (1<<15)         WM_CF_SHOW、WM_CF_STAYONTOP、WM_CF_HIDE、WM_CF_ACTIVATE这几个标志就是经常用到得。 二、窗口创建得过程分析 1、WM_CreateWindowAsChild WM_HWIN WM_CreateWindowAsChild( int

10、 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;

11、 //给窗口得标志增加一个创建标志 /* Default parent is Desktop 0 */ if (!hParent) { //如果不存在父窗口,比如说桌面窗口 if (WM__NumWindows) { //创建桌面窗口,这个不会执行得 #if GUI_NUM_LAYERS == 1 hParent = WM__ahDesktopWin[0]; //如果用户没有指定当前创建窗口得父窗口,而且该窗口

12、 //又不就是桌面窗口,默认得将桌面窗口作为其父窗口 #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

13、 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_DEB

14、UG_ERROROUT("WM_CreateWindow: No memory to create window"); //如果没有空间来创建需要得动态内存块 } else { //申请动态内存成功 WM__NumWindows++; //保存系统总窗口数目得计数器加1 pWin = WM_H2P(hWin);

15、 //计算获取动态内存数据区得地址 /* 向动态内存区写入当前窗口得参数 */ 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 c

16、an simply be accepted */ pWin->Status |= (Style & (WM_CF_SHOW | WM_SF_MEMDEV | WM_CF_MEMDEV_ON_REDRAW | WM_SF_STAYONTOP | WM_CF_DISABLED | W

17、M_SF_CONST_OUTLINE | WM_SF_HASTRANS | WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_BOTTOM | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_TOP |

18、 WM_CF_LATE_CLIP)); /* Add to linked lists */ _AddToLinList(hWin); //将窗口插入到窗口管理链表当中 WM__InsertWindowIntoList(hWin, hParent); //插入到父窗口管理链表当中 /* 根据用户定义得窗口风格进行一些列得操作 */ /* Activate window if WM_CF_ACTIVATE is specified */ if (St

19、yle & 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 (

20、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

21、 WM_SF_ISVIS; //设置可视状态位 WM_InvalidateWindow(hWin); //如果有显示命令,还会设置窗口为无效,等待重绘 } WM__SendMsgNoData(hWin, WM_CREATE); //发一个创建消息,这样创建得时候就可以在回调函数中进行处理 } WM_UNLOCK(); return hWin; }    首先根据其父窗口得坐标计算出当前窗口得坐标、高度与宽度。从动态内存区中开辟出一块窗口管理区域,然后向其中填入当前窗口得参数值。比较重要得就是

22、接下来得两部,将当前窗口插入到窗口管理链表当中以及将窗口插入到其父窗口得同胞链表当中。最后,如果创建得时候以显示模式WM_CF_SHOW创建,那么要为此窗口加入了可视标志WM_SF_ISVIS,而且还要设置窗口为无效。这样在执行GUI_Exec()或者WM_Exec()得时候就会对该窗口进行重绘。 2、_AddToLinList() static void _AddToLinList(WM_HWIN hNew) { WM_Obj* pFirst; WM_Obj* pNew; if (WM__FirstWin) { //如

23、果不就是桌面窗口(事实上桌面窗口肯定存在了) pFirst = WM_H2P(WM__FirstWin); //首先获取桌面窗口得动态内存地址 pNew = WM_H2P(hNew); //获取要插入窗口得动态内存地址 /* * 桌面窗口--->最近创建得窗口1--->更早创建得窗口2~~~~~~~--->0 ==> * 桌面窗口--->当前要插入得窗口--->最近创建得窗口1--->更早创建得

24、窗口2~~~--->0 */ pNew->hNextLin = pFirst->hNextLin; // pFirst->hNextLin = hNew; } else { WM__FirstWin = hNew; //创建桌面窗口时,将桌面窗口得句柄赋给此变量 } }     将新建窗口添加到窗口管理链表中。这个窗口管理链表就是建立在uCGUI得动态内存中,利用WM_obj类型中得成员hNextLin连接成一个单向链表。链表得构建过程如下: 插入之前:桌面窗口---

25、>最近创建得窗口1--->更早创建得窗口2~~~~~~~--->0  ==>   插入之后:桌面窗口--->当前要插入得窗口--->最近创建得窗口1--->更早创建得窗口2~~~--->0 3、WM__InsertWindowIntoList() /********************************************************************* * * WM__InsertWindowIntoList * * Routine describtion * This routine inserts the window

26、in the list of child windows for * a particular parent window、 * The window is placed on top of all siblings with the same level、 */ void WM__InsertWindowIntoList(WM_HWIN hWin, WM_HWIN hParent) { int OnTop; WM_HWIN hi; WM_Obj * pWin; WM_Obj * pParent; WM_Obj * pi; if (hPare

27、nt) { //桌面窗口就是不存在父窗口得 pWin = WM_H2P(hWin); //获取当前窗口得动态内存地址 pWin->hNext = 0; //它得下一个兄弟窗口为0 pWin->hParent = hParent; //记录它得父窗口 pParent = WM_H2P(hParent); //获得它父窗口

28、得动态内存地址 OnTop = pWin->Status & WM_CF_STAYONTOP; //可以用来判断此窗口就是否有在最顶层得标志 hi = pParent->hFirstChild; //父窗口得第一个子窗口 /* Put it at beginning of the list if there is no child */ if (hi == 0) { /* No child yet 、、、 Makes things easy ! */ /*

29、 * 父窗口--->0 ====> * 父窗口--->当前窗口--->0 */ pParent->hFirstChild = hWin; //没有子窗口,就把它作为父窗口得第一个子窗口 return; /* Early out 、、、 We are done */ } /* Put it at beginning of the list if first child is a TOP w

30、indow and new one is not */ pi = WM_H2P(hi); //获取父窗口第一个子窗口得动态内存地址 if (!OnTop) { //如果此窗口没有在最顶层得标志 if (pi->Status & WM_SF_STAYONTOP) { //判断长兄就是否有在最顶层得标志 /* * 父窗口--->长兄--->~~~--->0

31、 => * 父窗口--->当前窗口--->长兄--->~~~--->0 */ pWin->hNext = hi; //当前窗口得下一个窗口指向其长兄 pParent->hFirstChild = hWin; //父窗口得第一个子窗口为当前窗口 return; /* Early out 、、、 We are done */ }

32、 } /* 把它放在链表得最顶端或者在第一个“最顶层”窗口之前 */ do { WM_Obj* pNext; WM_HWIN hNext; if ((hNext = pi->hNext) == 0) { /* End of sibling list ? */ pi->hNext = hWin; /* 放在链表得最顶端 */ break; } pNext = WM_H2P(hNext); if (!OnTop)

33、 { //如果当前窗口没有“在最顶层”得标志 if (pNext->Status & WM_SF_STAYONTOP) { pi->hNext = hWin; pWin->hNext = hNext; break; } } pi = pNext; } while (1); #if WM_SUPPORT_NOTIFY_VIS_CHANGED WM__NotifyVisChanged(hW

34、in, &pWin->Rect); #endif } }    将新建窗口添加到父窗口得同胞窗口管理链表中。这个窗口管理链表就是建立在uCGUI得动态内存中,利用WM_obj类型中得成员hFirstChild与hNext连接成一个单向链表。 插入得原则就是: 1、如果父窗口没有孩子,直接将其作为父窗口得孩子即可。 插入之前: 父窗口--->0  ====> 插入之后: 父窗口--->当前窗口--->0 2、如果父窗口有孩子,第一个孩子有“在顶层”得标志,而当前创建得窗口没有这个标志,则将其作为其父窗口得第一个孩子。 插入之前:父窗口--->长兄--->~~~

35、>0 => 插入之后:父窗口--->当前窗口--->长兄--->~~~--->0 3、如果父窗口有孩子,第一个孩子没有“在顶层”得标志,而当前创建得窗口也没有这个标志,则将其放在同胞链表中有“在顶层”标志窗口得前边,也就就是所有没有“在顶层”标志窗口得后边。 插入之前:   父窗口--->长兄(没标志)--->次兄(没标志)--->三兄(有标志)--->~~~--->0 => 插入之后:   父窗口--->长兄(没标志)--->次兄(没标志)--->当前窗口--->三兄(有标志)--->~~~--->0 4、如果父窗口有孩子,第一个孩子没有“在顶层”得标志,而当前创建得窗

36、口有这个标志,则将其放在同胞链表得最后边。  插入之前:   父窗口--->长兄(没标志)--->次兄(没标志)--->三兄(有标志)--->~~~--->0 => 插入之后:   父窗口--->长兄(没标志)--->次兄(没标志)--->三兄(有标志)--->~~~--->当前窗口--->0 三、窗口顺序排列分析 1、按照窗口分层得概念来说,链表得头部窗口就是显示在最底层,链表得尾部窗口就是显示在最顶层。在进行窗口重绘得时候,正就是从链表得头部开始依次往尾部进行重绘。 2、子窗口相对于父窗口来说,子窗口在父窗口得顶部。   四、桌面窗口得创建   桌面窗口得创建发生在GUI

37、Init函数执行过程中。如果系统开启了窗口管理功能,GUI_Init函数会调用WM_Init函数,在WM_Init初始化窗口管理器得时候,默认得会创建桌面窗口。相关代码如下: /********************************************************************* * * WM_Init */ void WM_Init(void) { 、、、、、、 WM__ahDesktopWin[0] = WM_CreateWindow(0, 0, GUI_XMAX, GUI_YMAX, WM_CF_SHO

38、W, cbBackWin, 0); 、、、、、、 WM_InvalidateWindow(WM__ahDesktopWin[i]); 、、、、、、 WM_SelectWindow(WM__ahDesktopWin[0]); } 桌面窗口默认得回调函数 static void cbBackWin( WM_MESSAGE* pMsg) { const WM_KEY_INFO* pKeyInfo; switch (pMsg->MsgId) { case WM_KEY: pKeyInfo = (const W

39、M_KEY_INFO*)pMsg->Data、p; if (pKeyInfo->PressedCnt == 1) { GUI_StoreKey(pKeyInfo->Key); } break; case WM_PAINT: { int LayerIndex; #if GUI_NUM_LAYERS > 1 LayerIndex = _DesktopHandle2Index(pMsg->hWin); #else LayerIndex = 0; #endif if (WM__aBkColor[LayerIndex] != GUI_INVALID_COLOR) { GUI_SetBkColor(WM__aBkColor[LayerIndex]); GUI_Clear(); } } default: WM_DefaultProc(pMsg); } }

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服