当前位置:   article > 正文

Duilib界面解析1---简单的仿360窗口

duilib toolbar
最近开始研究Duilib,并逐个分析Duilib的demo例子,记录下来方便更多的人学习 。界面运行起来如下图所示,该Demo主要包含 BaseDialog.h和BaseDialog.cpp,以及界面布局文件的详细解释,每行注释已经添加。



BaseDialog头文件源文件 以及布局文件如下,可自行下载Duilib 根据注释学习该例子 只针对新手~~~

  1. #ifndef BaseDialog_H
  2. #define BaseDialog_H
  3. #include "UIlib.h"
  4. #include <map>
  5. using namespace DuiLib;
  6. //继承自CWindowWnd INotifyUI
  7. //拥有创建窗口和接受窗口事件通知的能力
  8. class BaseDialog : public CWindowWnd, public INotifyUI
  9. {
  10. public:
  11. BaseDialog(){};
  12. protected:
  13. //虚函数 用于设置窗口的CLASS NAME
  14. virtual LPCTSTR GetWindowClassName() const { return _T("USHER TEST DLG"); }
  15. //用于时间通告消息回调
  16. virtual void Notify(TNotifyUI& msg);
  17. //处理
  18. virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
  19. // 自定义消息映射
  20. typedef HRESULT (BaseDialog::*CustomMsgHandler)(WPARAM, LPARAM, BOOL&);
  21. typedef std::map<UINT, CustomMsgHandler> MessageMap;
  22. virtual MessageMap* InitMessageMap();
  23. // 自定义消息处理 在窗口创建的时候
  24. HRESULT OnCreate(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  25. //在窗口销毁的时候
  26. HRESULT OnDestory(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  27. //擦除窗口背景
  28. HRESULT OnErasebkgnd(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  29. //尺寸改变的时候
  30. HRESULT OnSize(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  31. //非客户区重绘
  32. HRESULT OnNcPaint(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  33. //非客户区激活
  34. HRESULT OnNcActive(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  35. //非客户区计算大小
  36. HRESULT OnNcCalSize(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  37. //非客户区点击测试
  38. HRESULT OnNcHitTest(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  39. //系统命令处理
  40. LRESULT OnSysCommand(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  41. //最大最小化信息
  42. LRESULT OnGetMinMaxInfo(WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  43. private:
  44. CPaintManagerUI m_pm;
  45. };
  46. #endif // BaseDialog_H


  1. #include "StdAfx.h"
  2. #include "BaseDialog.h"
  3. #include <memory>
  4. //消息通告
  5. void BaseDialog::Notify(TNotifyUI& msg)
  6. {
  7. //如果是点击消息那么通过控件名字判断是哪个控件
  8. if ( msg.sType == _T("click"))
  9. {
  10. if( msg.pSender == static_cast<CButtonUI*>(m_pm.FindControl(_T("minbtn"))) )
  11. SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
  12. if( msg.pSender == static_cast<CButtonUI*>(m_pm.FindControl(_T("closebtn"))) )
  13. PostQuitMessage(0);
  14. if( msg.pSender == static_cast<CButtonUI*>(m_pm.FindControl(_T("maxbtn"))) )
  15. ::IsZoomed(*this) ? SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0) : SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
  16. if (msg.pSender == static_cast<CButtonUI*>(m_pm.FindControl(_T("check_normal")))) {
  17. ::MessageBox(NULL, L"开始扫描", L"提示", MB_OK);
  18. }
  19. }
  20. }
  21. //首先启动消息循环会进入此虚函数进行消息处理
  22. LRESULT BaseDialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  23. {
  24. //初始化消息映射MAP 利用auto_ptr维护指针 static保证只创建一次
  25. static std::auto_ptr<MessageMap> customMessageMap(InitMessageMap());
  26. BOOL bHandled = TRUE;
  27. LRESULT lRes = 0;
  28. //将消息在消息映射map中进行查找 找到响应的消息处理函数
  29. if ( customMessageMap->find(uMsg) != customMessageMap->end() )
  30. {
  31. //typedef HRESULT (BaseDialog::*CustomMsgHandler)(WPARAM, LPARAM, BOOL&);
  32. //如果找到 查找响应的消息响应函数
  33. CustomMsgHandler handler = (*customMessageMap)[uMsg];
  34. //通过this->(*handler)进行消息响应函数的调用
  35. lRes = (this->*handler)(wParam, lParam, bHandled);
  36. //如果 bHandled返回True没有被修改那么说明消息已经被处理 返回
  37. if ( bHandled ) return lRes;
  38. }
  39. //CPaintManagerUI丢给PaintManagerUI进行处理 如果处理了 那么会返回True 否则返回false继续走
  40. if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
  41. //最后丢给默认的windows消息处理函数
  42. return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  43. }
  44. //初始化消息循环对应的消息响应函数
  45. BaseDialog::MessageMap* BaseDialog::InitMessageMap()
  46. {
  47. MessageMap* map = new MessageMap;
  48. (*map)[WM_CREATE] = &BaseDialog::OnCreate;
  49. (*map)[WM_DESTROY] = &BaseDialog::OnDestory;
  50. (*map)[WM_ERASEBKGND] = &BaseDialog::OnErasebkgnd;
  51. (*map)[WM_SIZE] = &BaseDialog::OnSize;
  52. (*map)[WM_NCPAINT] = &BaseDialog::OnNcPaint;
  53. //以下三个消息用于屏蔽系统标题栏
  54. (*map)[WM_NCACTIVATE] = &BaseDialog::OnNcActive;
  55. (*map)[WM_NCCALCSIZE] = &BaseDialog::OnNcCalSize;
  56. (*map)[WM_NCHITTEST] = &BaseDialog::OnNcHitTest;
  57. (*map)[WM_SYSCOMMAND] = &BaseDialog::OnSysCommand;
  58. (*map)[WM_GETMINMAXINFO] = &BaseDialog::OnGetMinMaxInfo;
  59. return map;
  60. }
  61. //窗口创建时候
  62. HRESULT BaseDialog::OnCreate( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  63. {
  64. //获取当前窗口风格
  65. LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
  66. styleValue &= ~WS_CAPTION;
  67. //设置STYLE
  68. ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
  69. //初始化界面渲染器
  70. m_pm.Init(m_hWnd);
  71. //D
  72. CDialogBuilder builder;
  73. //通过xml 以及渲染器渲染界面UI
  74. CControlUI* pRoot = builder.Create(_T("main_dlg.xml"), (UINT)0, NULL, &m_pm);
  75. //附加界面UI到对话框容器
  76. m_pm.AttachDialog(pRoot);
  77. //增加消息处理 因为实现了 INotifyUI接口
  78. m_pm.AddNotifier(this);
  79. return 0;
  80. }
  81. HRESULT BaseDialog::OnDestory( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  82. {
  83. //发送退出消息
  84. ::PostQuitMessage(0L);
  85. return 0;
  86. }
  87. //擦除背景
  88. HRESULT BaseDialog::OnErasebkgnd( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  89. {
  90. return 1;
  91. }
  92. //当窗口的尺寸发生改编的时候
  93. HRESULT BaseDialog::OnSize( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  94. {
  95. //在窗口大小改变的时候设置圆角
  96. SIZE szRoundCorner = m_pm.GetRoundCorner();
  97. if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) )
  98. {
  99. CRect rcWnd;
  100. ::GetWindowRect(*this, &rcWnd);
  101. rcWnd.Offset(-rcWnd.left, -rcWnd.top);
  102. rcWnd.right++;
  103. rcWnd.bottom++;
  104. HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right,
  105. rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
  106. ::SetWindowRgn(*this, hRgn, TRUE);
  107. ::DeleteObject(hRgn);
  108. return 0;
  109. }
  110. bHandled = FALSE;
  111. return 0;
  112. }
  113. HRESULT BaseDialog::OnNcPaint( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  114. {
  115. return 0;
  116. }
  117. HRESULT BaseDialog::OnNcActive( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  118. {
  119. if( ::IsIconic(*this) ) bHandled = FALSE;
  120. return (wParam == 0) ? TRUE : FALSE;
  121. }
  122. //如果不处理那么就会导致DUILIB 不停调用系统消息进行处理
  123. // 屏蔽系统标题栏 似乎不屏蔽一定会出问题
  124. HRESULT BaseDialog::OnNcCalSize( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  125. {
  126. return 0;
  127. }
  128. HRESULT BaseDialog::OnNcHitTest( WPARAM wParam, LPARAM lParam, BOOL& bHandled )
  129. {
  130. //获取客户区相对坐标
  131. POINT pt;
  132. pt.x = GET_X_LPARAM(lParam);
  133. pt.y = GET_Y_LPARAM(lParam);
  134. ::ScreenToClient(*this, &pt);
  135. //获取客户区域
  136. RECT rcClient;
  137. ::GetClientRect(*this, &rcClient);
  138. //如果窗口没有最大化
  139. if( !::IsZoomed(*this) )
  140. {
  141. //获取非客户区域sizebox
  142. RECT rcSizeBox = m_pm.GetSizeBox();
  143. //如果y<窗口区域top+sizebox.top 算上非客户区
  144. if( pt.y < rcClient.top + rcSizeBox.top )
  145. {
  146. //判断是否在左上边
  147. if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT;
  148. //判断是否在右上边
  149. if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT;
  150. //返回顶端测试
  151. return HTTOP;
  152. }
  153. //否则在bottom
  154. else if( pt.y > rcClient.bottom - rcSizeBox.bottom )
  155. {
  156. //左下
  157. if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT;
  158. //右下
  159. if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT;
  160. //默认下边
  161. return HTBOTTOM;
  162. }
  163. //如果不再 top 或者bottom 那么就是在左边 右边的非客户区
  164. if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT;
  165. if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT;
  166. }
  167. //获取标题栏的矩形区域
  168. //并且判断鼠标是否在该区域中 如果在返回
  169. RECT rcCaption = m_pm.GetCaptionRect();
  170. if( pt.x >= rcClient.left + rcCaption.left
  171. && pt.x < rcClient.right - rcCaption.right
  172. && pt.y >= rcCaption.top
  173. && pt.y < rcCaption.bottom )
  174. {
  175. //ButtonUI OptionUI 只有这两种类型当作标题栏
  176. CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
  177. if( pControl
  178. && _tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0
  179. && _tcscmp(pControl->GetClass(), _T("OptionUI")) != 0 )
  180. {
  181. return HTCAPTION;
  182. }
  183. }
  184. //其余部分是客户区
  185. return HTCLIENT;
  186. }
  187. //系统命令处理
  188. LRESULT BaseDialog::OnSysCommand(WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  189. {
  190. if( wParam == SC_CLOSE )
  191. {
  192. ::PostQuitMessage(0L);
  193. bHandled = TRUE;
  194. return 0;
  195. }
  196. BOOL bZoomed = ::IsZoomed(*this);
  197. LRESULT lRes = CWindowWnd::HandleMessage(WM_SYSCOMMAND, wParam, lParam);
  198. return 1L;
  199. }
  200. LRESULT BaseDialog::OnGetMinMaxInfo(WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  201. {
  202. MONITORINFO oMonitor = {};
  203. oMonitor.cbSize = sizeof(oMonitor);
  204. ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor);
  205. CRect rcWork = oMonitor.rcWork;
  206. rcWork.Offset(-rcWork.left, -rcWork.top);
  207. /// 窗口最大化时裁剪阴影所占区域
  208. LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam;
  209. lpMMI->ptMaxPosition.x = rcWork.left-5;
  210. lpMMI->ptMaxPosition.y = rcWork.top-3;
  211. lpMMI->ptMaxSize.x = rcWork.right+10;
  212. lpMMI->ptMaxSize.y = rcWork.bottom+10;
  213. bHandled = FALSE;
  214. return 0;
  215. }


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Window size="910,610" sizebox="10,10,12,12" roundcorner="0,0" caption="0,0,0,90" mininfo="910,610" bktrans="true" shadow="true" shadowimage="shadow.png" shadowtopleft="0,0,5,3" shadowtopright="205,0,5,3" shadowbottomleft="0,136,5,7" shadowbottomright="205,136,5,7">
  3. <!--根据顺序记录字体可通过int 索引引用-->
  4. <Font name="微软雅黑" size="12" />
  5. <Font name="微软雅黑" size="16" />
  6. <Font name="微软雅黑" size="22" />
  7. <Font name="宋体" size="15" />
  8. <!--整体垂直布局-->
  9. <VerticalLayout bkimage="file='bg.png'">
  10. <!--容器的内边距放置到一行 水平占满-->
  11. <HorizontalLayout height="40" inset="0,3,0,0">
  12. <!--titile标题的位置占位 根据内容决定大小 在一个水平布局中没有设置宽度的布局会默认填充所有内容-->
  13. <HorizontalLayout>
  14. <!--float true使用绝对定位 设置位置 文本颜色 字体索引0-->
  15. <Text text="360安全卫士9.2" pos="15, 10, 200, 50" float="true" textcolor="#FFFFFF" font="0" />
  16. </HorizontalLayout>
  17. <!--徽章位置宽度40 height 30-->
  18. <HorizontalLayout width="40" height="30">
  19. <Button maxwidth="26" inset="200,10,0,0" normalimage="medal.png"/>
  20. </HorizontalLayout>
  21. <!---宽度是150的菜单栏-->
  22. <HorizontalLayout width="150">
  23. <!--设置按钮的 宽度 高度 普通图片 hover图片 按钮按下的图片-->
  24. <Button name="skinbtn" maxwidth="27" maxheight="22" normalimage="skin_normal.png" hotimage="skin_hover.png" pushedimage="skin_pressed.png"/>
  25. <Button name="feedbackbtn" maxwidth="27" maxheight="22" normalimage="feedback_normal.png" hotimage="feedback_hover.png" pushedimage="feedback_pressed.png"/>
  26. <Button name="maxbtn" maxwidth="27" maxheight="22" normalimage="menu_normal.png" hotimage="menu_hover.png" pushedimage="menu_pressed.png"/>
  27. <Button name="minbtn" maxwidth="27" maxheight="22" normalimage="min_normal.png" hotimage="min_hover.png" pushedimage="min_pressed.png"/>
  28. <Button name="closebtn" maxwidth="27" maxheight="22" normalimage="close_normal.png" hotimage="close_hover.png" pushedimage="close_pressed.png"/>
  29. </HorizontalLayout>
  30. </HorizontalLayout>
  31. <!--第二行工具按钮 -->
  32. <HorizontalLayout height="85">
  33. <HorizontalLayout>
  34. <!---前景背景图片都是相对坐标除非 float会变成绝对zu-->
  35. <Option pos="15,10,85,85" float="true" align="bottom" text="电脑体检" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_Examine.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="true"/>
  36. <Option pos="97,10,167,85" float="true" align="bottom" text="木马查杀" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_dsmain.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  37. <Option pos="179,10,249,85" float="true" align="bottom" text="系统修复" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_SysRepair.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  38. <Option pos="261,10,331,85" float="true" align="bottom" text="电脑清理" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_TraceCleaner.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  39. <Option pos="343,10,413,85" float="true" align="bottom" text="优化加速" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_SpeedupOpt.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  40. <Option pos="425,10,495,85" float="true" align="bottom" text="电脑专家" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_expert.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  41. <Option pos="507,10,577,85" float="true" align="bottom" text="电脑门诊" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_diannaomenzhen.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  42. <Option pos="589,10,659,85" float="true" align="bottom" text="软件管家" textpadding="11,55,0,0" font="0" textcolor="#FFFFFF" selected="true" foreimage="file='ico_softmgr.png' dest='11,5,59,53'" normalimage="toolbar_normal.png" hotimage="file='toolbar_hover.png' source='80,0,160,75'" pushedimage="file='toolbar_hover.png' source='80,0,160,75'" selectedimage="file='toolbar_hover.png' source='80,0,160,75'" group="main_toolbar" selected="false"/>
  43. </HorizontalLayout>
  44. <!---LOGO insert位置 相对位置 -->
  45. <!--bkcolor="0xFFFF0000" insert是内部内容的相对位置 LayOut布局默认是从右边开始-->
  46. <HorizontalLayout width="180" inset="10,15,1,0">
  47. <Button maxwidth="148" maxheight="62" bkimage="file='logo.png'"/>
  48. </HorizontalLayout>
  49. </HorizontalLayout>
  50. <!--窗体内容背景-->
  51. <HorizontalLayout bkimage="1.bmp" bordercolor="0xFFFF0000" >
  52. <!--垂直布局-->
  53. <VerticalLayout bordercolor="0xFFFF0000">
  54. <!---pos如果是float=true,那么是绝对布局。控件那么 指定位置和大小 如何不是那么 只指定大小-->
  55. <!---relativepos跟最大化后剧中显示有关 前两个是位移值 后两个是缩放一般不写 属性列表没有给出这个 前两个是大小改变的时候横纵向位移 默认单位50表示一个单位, 后两个是缩放 x,y,scaleX,scaleY-->
  56. <!---常用50,50,0,0 让绝对定位拥有相对定位布局的特性-->
  57. <Button pos="50, 50, 196, 168" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" normalimage="error.png" />
  58. <Text pos="250, 60, 350, 160" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" text="您的电脑已经" font="1" textcolor="#1C1C1C" />
  59. <Text pos="360, 55, 400, 160" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" text="24" font="2" textcolor="#0000FF" />
  60. <Text pos="400, 60, 500, 160" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" text="天没有体检,建议立即体检!" font="1" textcolor="#1C1C1C" />
  61. <Text pos="250, 100, 350, 150" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" text="系统可能已经存在大量风险,安全性和性能都在急速下降," font="0" textcolor="#555555" />
  62. <Text pos="250, 120, 350, 150" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" text="建议您每天坚持电脑体检,提高电脑的安全和性能" font="0" textcolor="#555555" />
  63. <Button pos="230, 250, 396, 316" name="check_normal" bordercolor="0xFFFF0000" relativepos="50,50,0,0" float="true" normalimage="check_normal.png" hotimage="check_hover.png" pushedimage="check_pressed.png" />
  64. </VerticalLayout>
  65. <VerticalLayout width="250">
  66. <!---对于此处来说50代表水平位置自动适应 垂直位置不变-->
  67. <Button maxwidth="1" bordercolor="0xFFFF0000" minheight="1000" normalimage="fenge_line.png" />
  68. <Button pos="10, 15, 230, 126" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" minheight="1000" normalimage="register_bg.png" />
  69. <Button pos="0, 140, 245, 141" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="rp_line.png" />
  70. <Button pos="80, 140, 81, 225" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="fenge_line.png" />
  71. <Button pos="160, 140, 161, 225" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="fenge_line.png" />
  72. <Button pos="15, 150, 65, 195" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="firewall_open_normal.png" hotimage="firewall_open_hover.png"/>
  73. <Text pos="10, 200, 65, 210" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" text="木马防火墙" font="0" textcolor="#1C1C1C" />
  74. <Button pos="95, 150, 145, 195" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="guard_open_normal.png" hotimage="guard_open_hover.png"/>
  75. <Text pos="95, 200, 105, 210" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" text="360保镖" font="0" textcolor="#1C1C1C" />
  76. <Button pos="175, 150, 225, 195" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="payinsure_close_normal.png" hotimage="payinsure_close_hover.png"/>
  77. <Text pos="175, 200, 185, 210" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" text="网购先赔" font="0" textcolor="#1C1C1C" />
  78. <Button pos="0, 225, 245, 226" bordercolor="0xFFFF0000" relativepos="50,0,0,0" float="true" normalimage="rp_line.png" />
  79. </VerticalLayout>
  80. </HorizontalLayout>
  81. </VerticalLayout>
  82. </Window>


代码加注释下载地址.......

http://download.csdn.net/detail/yue7603835/9185031









声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/942914
推荐阅读
相关标签
  

闽ICP备14008679号