directui框架,directui开源

  directui框架,directui开源

  最近因为项目的需要,了解了一些DirectUI的情况,主要是参考一个国外程序员写的代码(见引用1)。看完之后发现更多的是探索一种实现的可能性和思路,离实际应用还很远,但是它的实现还是很有意思的。在写这个总结的时候,发现国内一个程序员把这个代码部分移植到了WINCE下的代码中(见引用2)。由于平台的差异,在WINCE下完全开发出一个实际的代码还是需要时间的。

  由于我在GUI开发方面做的很少,所以在工作中主要提供思路和方法。学习DirectUI的主要目的是更新自己的知识学习思路,文章中出现错误在所难免。

  一.核心

  1.窗口对象类(窗口实例对象的父类)

  2.CDialogBuilder:创建控件类,分析脚本,递归创建所有控件实例(_Parse函数)

  3.CPaintManagerUI:窗口消息和图形绘制管理器类

  4.CGUIRenderEngineUI:一个图形渲染引擎类,在离屏DC中生成最终显示的图形,可以根据需要扩展各种图形效果的显示。

  5.INotifyUI:事件通知抽象类

  6.IMessageFilterUI:消息过滤抽象类

  第二,控制

  CControlUI:控制管理的抽象父类,父类INotifyUI

  1、按钮

  CButtonUI:按钮控件

  选项UI:选择按钮控件

  2、组合框

  CSingleLinePickUI:

  CDropDownUI:下拉控件,以CContainerUI和IListOwnerUI为父类。

  3、装修

  CTitleShadowUI:阴影效果

  克里斯太尔沙杜伊

  CSeparatorLineUI

  CFadedLineUI

  4、编辑

  CSingleLineEditUI:单行编辑框控件

  CMultiLineEditUI:多行编辑框控件

  5、标签

  CLabelPanelUI:带有背景色和文本色的静态标签控件。

  CGreyTextHeaderUI

  6、列表

  第一种类型:

  CListUI: List控件,它包含以下子控件

  (1 )CListHeaderItemUI:列表头

  (2 )CListExpandElementUI:列表项

  第二:用法不明。

  CListHeaderUI:列表标题

  CListElementUI:列表项,父类有另一个IListItemUI。

  CListLabelElementUI:列表项,父类CListElementUI

  CListTextElementUI:列表项

  CListFooterUI:列表结尾

  7、面板

  CTextPanelUI:父类CLabelPanelUI

  CTaskPanelUI:

  CNavigatorPanelUI:导航面板,父类有另一个IListOwnerUI,包含CNavigatorButtonUI的子控件。

  CSearchTitlePanelUI:

  CImagePanelUI:图片显示

  CWarningPanelUI:警告,父类CTextPanelUI

  CPaddingPanelUI:填充列

  8、制表

  CTabFolderUI:父类有CContainerUI和IListOwnerUI。

  CTabPageUI:父类有另一个CContainerUI。

  9、工具栏

  CToolbarUI:工具栏,包含以下子控件

  (1 )CToolButtonUI:图形按钮

  (2 )CToolSeparatorUI:分离器

  (3 )CToolGripperUI:夹子

  10、标题

  CToolbarTitlePanelUI:

  11、状态栏

  CStatusbarUI:状态栏,父类有CContainerUI。

  12、动漫

  CAnimJobUI:动画显示类

  13、ActiveX

  CActiveXUI:

  三。容器:

  CContainerui:容器类,父类CContainerUI和IContainerUI。可以认为容器是一个特殊的控件(见上面控件类的父类描述),其目的之一是具有容器特征的控件可以容纳其他控件,从而方便地实现控件的叠加;第二,实际只有一个窗口,叠加的控件必须分层管理,才能正确绘制和分发事件。另见引用三。

  1.Canvas: CCanvasUI(父类CContainerUI),可以画背景色,画线,贴图。

  CWindowCanvasUI:父类CCanvasUI

  CControlCanvasUI:父类CCanvasUI

  CWhiteCanvasUI:父类CCanvasUI

  CDialogCanvasUI:父类CCanvasUI

  CTabFolderCanvasUI:父类CCanvasUI

  2.布局:管理不同级别的控件。

  CDialogLayoutUI:父类CContainerUI

  CVerticalLayoutUI:父类CContainerUI

  CHorizontalLayoutUI:父类CContainerUI

  CTileLayoutUI:父类CContainerUI

  四。通用

  1、脚本

  CMarkup

  CMarkupNode

  2、语言

  Cui实用程序

  3、多线程

  关键部分

  自动临界区

  互斥量

  CAutoMutex

  CEvent

  因果事件

  CManualEvent

  动词(verb的缩写)主要数据成员

  1、CPaintManagerUI

  CControlUI*m_pRoot:如果控件叠加,则存储最低的控件对象;否则,存储第一个创建的控件对象。

  CControlUI*m_pFocus:保存获得焦点的控件对象的指针。

  CControlUI*m_pEventHover:保存当前有鼠标移入和移出事件的控件对象的指针。

  CControlUI*m_pEventClick:保存当前有Click事件的控件对象的指针。

  CControlUI*m_pEventKey:保存当前有Key事件的控件对象的指针。

  CStdPtrArraym _ aNotifiers:记录所有需要事件通知的窗口,根据窗口名称调用相应的消息处理函数。

  CStdPtrArraym _ aNameHash:保存控件对象指针的哈希表(用控件名生成哈希值)

  Tdptrarraym _ apostpaint:面板的褪色效果

  Tdptrarraym _ a消息过滤器:保存需要过滤的控件或函数(如动画类)。

  CStdPtrArraym _ aDelayedCleanup:

  CStdPtrArraym _ aPreMessages:预处理消息

  HWNDm_hWndPaint:控件布局窗口的句柄

  HDCm_hDcPaint:控制布局窗口设备DC

  HDCm_hDcOffscreen:屏幕外内存DC

  HBITMAPm_hbmpOffscreen:与屏幕外内存DC相关的hbitmap

  2、控制界面

  CPaintManagerUI*m_pManager:窗口或控件绘图和消息管理器

  CControlUI*m_pParent:指向父窗口(控件)对象的逻辑指针。

  CStdStringm_sName:控件ID

  控件显示标题或脚本字符串。

  CStdStringm_sToolTip:控件的提示信息

  3、CContainerUI

  CStdPtrArraym _ items:同一层的一个控件对象或一个控件对象的子对象,比如放置在画布上的按钮、由两个子对象组成的combox、edit和list、tab等。有关详细信息,请参见CDropDownUI、CTabFolderUI和CNavigatorPanelUI的定义。

  4、CDialogLayoutUI

  CStdValArraym_aModes:用于存储绝对坐标转换为布局上的相对坐标(cdialogLayoutui: recalcarea)的控件对象(指针、大小、模式)。目的是让布局上的控件随布局变化而正确绘制吗?

  不及物动词控制属性

  待完成

  七。脚本示例

  对话

  WindowCanvaspos=\ 0,0,600,800

  DialogLayoutpos=\ 0,0,600,800

  Buttonpos=\ 390,30,490,58text=OK name=ok\ /

  /DialogLayout

  /window画布

  /对话框

  八。绘图和事件处理

  1.图画

  01.cwindownd: _ _ wndproc:主窗口程序

  02.pthis-handlemessage: pthis是布局窗口对象的指针,绑定到布局窗口(SetWindowLongPtr)。

  step 03 . m _ pm . message handler:m _ pm是CPaintManagerUI的唯一实例对象。

  04.cpaintmanagerui:message handler:处理WM_PAINT

  step 05 . m _ pRoot-do point:m _ pRoot是最底层的控件对象,在本例中是CWindowCanvasUI控件(对应于脚本中的WindowCanvas)

  步骤06。CCanvasUI:dopoint:绘制背景色、角弧、水印等。在画布上。

  07.ccontainerui: do paint:绘制布局窗口中的所有控件(对应脚本中的DialogLayout)(控件实例对象保存在m_items中)

  步骤08。P control-do paint: P control是控件对象实例之一,利用多态性调用不同控件的绘制方法。

  09.c Buttonui: do paint: button(对应脚本中的按钮)绘制方法,有以下两种方法

  I)文本方法:cguirenderenginui:d pain t button

  Ii)图片方法:cguirenderenginui:DopaintBitMap

  第十步。新一轮的消息循环

  2.事件

  步骤01。cwindownd:_ _ WndProc:

  step 02 . pthis-handle消息:

  步骤03.m_pm。消息处理程序:

  04.cpaintmanagerui:message handler:处理WM_LBUTTONDOWN

  步骤05。CPainTManagerui: FindControl:根据鼠标坐标找到对应的控件对象。

  步骤06.m_pRoot- FindControl:

  步骤07。CContainerui: FindControl:在布局窗口中查找对应的控件对象。

  步骤08。CControlUI:FindControl:在m_items中查找对应的控件对象

  09.pcontrol-event: pcontrol是控件对象实例之一,它使用多态来调用不同控件的事件方法。

  第十步。CPainTManagerui:消息处理程序:处理WM_LBUTTONUP

  STEP11.m_pEventClick- Event:使用多态性调用不同控件的事件方法(关于m_pEventClick的描述,参见“主数据成员”)

  第十二步。CButtonUI:Event: Button(对应于脚本中的按钮)事件方法

  第十三步。CButtonUI:激活:

  STEP14.m_pManager- SendNotify:传递控件对象的指针和触发事件(文本模式)

  第十五步。CPAINTMANAGERUI: SEND NOTIFY:注意以下两点是完成控制和业务分离的关键。

  I)调用消息处理函数Notify,通过使用重载功能(监听对象保存在m_aNotifiers中)通知注册的监听对象(窗口)

  for(inti=0;我是发明家。GetSize();我)

  {

  static _ cast INotifyUI *(m _ aNotifiers[I])-Notify(Msg);

  }

  Ii)布局窗口CStartPageWnd的消息处理,宏定义展开后,实际上是重载了Notify函数。

  DIRECT_BEGIN_NOTIFYMAP

  PROCESS_BUTTON_CLICK(_T(ok ),OnOk)。

  DIRECT _ END _ NOTIFYMAP(CStandardPageWnd)

  第十六步。CStartPageWnd:OnOk:控制消息处理功能,在这里可以添加具体的事务逻辑处理。

  第十七步。新一轮的消息循环

  3.消息定义(文本)

  单击、已更改、链接、浏览、 itemclick 、 itemselect 、 dropdown 、 itemactivate 、 headerdragging 、 headerclick 、 header dragging 、 itemexpand 、 itemcollapse 、 windowinit 、 killfocus 、 setfocus 、 timer

  九。怀疑

  1.编辑和组合框的下拉列表,滚动条和工具提示控件都是实际创建的窗口,和DirectUI的思路不同。

  2.在该示例中,创建了一个不进行消息处理的窗口(CFrameWindowWnd),然后为特定的控件布局创建了一个窗口(CStandardPageWnd)。但我可以用窗户来做。不清楚原作者这样做的原因。

  3.控件以文本形式标识,消息类型以文本形式表示。是不是改成数值比较好?

  X.引用

  引言1:http://www.viksoe.dk/code/windowless1.htm

  引用2:http://directui.googlecode.com/

  引用:http://www..com/cutpig/archive/2010/06/14/1758204.html

  Viksoe的代码很好,这个可以商用。

  个人认为这个框架在结构和思想上比mfc甚至wtl高n倍。

  首先,viksoe利用布局机制动态计算各个子窗口的坐标位置,适应屏幕大小的变化。但是MFC需要对子窗口的坐标进行硬编码,所以很难适应不同分辨率的屏幕。GTK在橱窗布置上可以分为两个阶段。在第一阶段,父窗口询问子窗口的最佳尺寸。第二阶段,父窗口根据自身大小计算子窗口的实际大小,子窗口根据实际大小进行调整。

  其次,viksoe使用容器机制来合理地分离控件的职责。MFC没有容器的概念,很难实现递归组合。viksoe中几乎所有的控件都是容器,可以容纳任何其他控件,而MFC中只有顶层窗口是容器,可以容纳其他子控件。容器的概念对代码重用有很大的影响。这里有两个例子:一个是带有图片的BitmapButton。在viksoe中是CCanvasUI类和CButtonUI的组合,而在MFC中图片和文字都要自己画。前者的CCanvasUI类和CButtonUI可以在很多地方重用,后者的绘图代码和事件处理代码只能自己用。在MFC中,即使只实现一个外观不同的列表框,也要使用自绘的方法。代码重用非常困难,在列表框中添加其他控件更是麻烦。你必须使用一些不寻常的手段。

  另外,在驱动中绘制gui也不同于普通gui。上面说的directUI还是用Windows的消息,只是驱动只能用自己的hookkey和鼠标来中断。然后实现各种消息的分发。但这对于兼容usb接口的键盘来说是个问题。这其实相当于自己实现了win32k的内容。而驱动里的画图其实只是写自己的视频内存。然而,有许多兼容性问题需要解决。别的不说,每种显卡的显存位置都要自己实现,softICE直接做不到。在某些机器上,syser必须依赖directX来获得视频内存。

  我的bloghi.baidu.com/weolar

  HTMLayoutSDK有时间看看这个。很好用。使用spy是抓不到任何窗口的,而且很简单。htm文件描述。做界面很方便,效果很好。钥匙是免费的。现在我转向了这个界面。

  现在正在研究viksoe的这个DirectUI库,把它改写成wchar_t的,把类库里用的CWindowWnd换成atl/wtl的CWindowImpl。我准备在这个DirectUI库的基础上进一步开发这个库,做一个好用又强大的DirectUI库。如果你有兴趣开发它,请联系我,并把它放在谷歌代码。让我们一起做吧!

  davidxifeng@gmail.com

  可以在上留言,但是不会经常查看

  关注游戏嵌入式网页浏览器内核(HTMLRenderingEngine)

  2008 -10-1321 :51

  网络游戏中经常会有一些网页展示需求,用HTML实现UI已经不是什么新鲜事了。冯云曾经提到,在《西游1》中,嵌入式IE是用来实现客户端UI的。虽然当时这个技术方案并不成功,但是使用HTMLRendering这样的解析渲染引擎来表现客户端的GUI的技术探索还在不断深入。

  HTMLRenderingEngine一般由DOM构建、HTML/CSS解析、LayoutEngine、屏幕渲染等模块组成。

  LayoutEngine负责获取页面的内容(HTML、XML、CSS、图片),根据W3c标准规则计算页面的显示方式,最终输出到屏幕上。因为布局引擎负责最重要的功能,所以可以看作是浏览器的内核。

  目前,众所周知的内核如下:

  Gecko,这个内核最著名的浏览器是Firefox。

  Webkit更出名是因为谷歌的Chrome。Webkit是一个开源的HTML渲染引擎,由苹果公司的KHTML项目基于KDE开发。

  当然,由于Window的霸主地位,IE的内核Trident也被很多应用采用。GoogleTalk使用Trident渲染对话界面。

  从这个维基也可以看到主流浏览器内核的对比:http://en.wikipedia.org/wiki/Comparison_of_layout_engines.

  对于OnlineGame简单的Web应用需求,其实可以找到一些轻量级的内核。HTMLayout就是这样一个专为WebUI和轻松嵌入而设计的桌面应用。不过HTMLayout并不是一个全功能的网页浏览器,在渲染一些非标准的HTML标签时还存在一些问题,但是对于一个轻量级的嵌入式引擎来说已经足够完美了。

  如下:http://www.terrainformatica.com/htmlayout/,官网

  附带的SDK包含一个使用DX渲染性能的示例。原理很简单:用RenderingEngine解析HTML输出到位图,然后用DX materials输出。官网下载的例子是用DX8写的,需要做一些简单的改动。MSN桌面宠物多猫用HTMLayout实现GUI。

  Second Life中嵌入的浏览器库llMozLib通过嵌入Gecko来渲染显示HTML。你可以在http://ubrowser.com/找到详细的介绍或者在第二人生官网找到源代码。这个功能强大多了,值得研究。

  附:DirectUI和无窗口用户界面

  http://blog . joycode . com/江生/archive/2010/03/22/115921.joy

  DirectUI和无窗口用户界面

  DirectUI/DirectUser是一个用户界面框架(http://msdn.microsoft.com/en-us/library/system。窗户。自动化。自动元素。自动元素。FrameworkID.aspx)。使用Spy可以在MSN Messenger、Windows XP、Office、IE、Windows Media Player中看到窗口类名为DirectUIHWND的窗口。

  从文件描述来看,DUI70.dll和DUser.dll好像是这个框架的实现文件,而没有导入这些dll的软件应该是复制了这个库的代码。比如IEFrame.dll的Windows Vista和IE7的测试版引入DUser.dll(http://social . msdn . Microsoft . com/forums/en-us/Windows ui development/thread/6b 801577-1699-4093-8 a58-198 c64b 120 e 0)而正式版用的是IEUI.DLL。这应该是因为微软不愿意公开支持这个函数频繁变化的类库,反垄断案禁止非Windows组件调用未公开的Windows API。

  看看DUser.dll的函数导出表(http://www.webtropy.com/articles/dll-api.aspx?Dll=duser),可以看到Gadget这个词在没有具体控件的情况下被广泛使用。因为没有窗口句柄,所以控件不会被window类区分,可能会像Windows Vista侧边栏小工具一样使用HTML作为界面(修正)。从Office Communicator的资源来看,是XML做的接口。

  从这个类库的名称和行为来看,它实际上应该是基于DirectX,一个类似于WPF的接口类库框架。在微软的招聘网站上,你可以看到Office Communications项目组的一个职位介绍上写着“通过direct UI进行原生Win32/64 UX体验,通过Silverlight进行Web UX体验”,意思是这个项目组对待它和Silverlight是一样的。DirectUIHWND窗口可以在需要性能和安全性的场合看到,比如IE的Tab窗口、Shell中的DefView、Windows登录界面等。在Windows Vista上使用DirectUI的微软程序与WPF程序一样兼容桌面合成和远程桌面,应该直接或间接称为Direct3D。

  那么如何才能达到类似的效果呢?

  无窗口用户界面并不是一个新概念(http://bogs.msdn.com/oldnew thing/archive/2005/02/11/371042 . aspx),VC的应用程序向导可以创建无窗口ActiveX。但是做过无窗口模式下RichEdit实现的人都知道,微软的系统控件侧重于各种功能,比如各种快捷键、滚动条、界面风格、可访问性、用户界面自动化等。几乎完全像IE项目组一样做到无窗口并不容易。Raymond Chen在(http://bogs . msdn . com/old new thing/archive/2005/02/11/371042 . aspx)中提到,可以使用DrawThemeBackground和DrawFrameControl两个API,但它们只对Windows界面风格相同的程序有用。如果接口不复杂,可以简单集成IE的Trident引擎,比如使用MFC的CHTMLView和CDHTMLDialog,Windows窗体的WebBrowser类。这样做的代价是程序需要牺牲性能,在严格的IE安全配置下可能无法工作。各种向导,谷歌任务,微软Outlook,Outlook Express等。由视觉Studio.Net开始使用这个方案。

  另一个解决方案是集成WPF或Silverlight。VC项目组在用户调查中发现,大部分需要WPF的Visual C用户都是用C#编写WPF代码,然后与C /CLI和非托管代码(http://social . msdn . Microsoft . com/forums/en-us/WPF/thread/DD 1e 31 bb-Fe B4-4d 77-B524-42a 282 f 51 b 1/)进行接口,所以他们决定投身其中。Visual Studio 2010使用这种方案。

  为什么我不能使用未发布的API?涉及

  3358bogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx和http://bogs.technet.com/Stefan _戈斯纳/archive/2005/07/27/unchecked _ API _ part 1 . aspx

  后记:

  *如果微软在产品文档中讨论了未发布的API,那么这个API还是未发布的吗?(http://msdn . Microsoft . com/en-us/library/aa 140182(office . 10)。aspx)

  * Visual Studio代码库中有一个名为DirectUI的类库,其设计思想与微软的DirectUser库(http://Visual Studio gallery . msdn . Microsoft . com/en-us/1 b 69 c 9 Fe-e422-4799-9e 5-6 AC 7034 c 52 e 1)相似,但也有人误以为这是微软用来实现MSN接口的库。

  *IE9将使用Dierct2D作为渲染引擎。不知道IE项目组移植代码后能不能公开控件类库的接口?

  DirectUI/DirectUser是一个用户界面框架(http://msdn.microsoft.com/en-us/library/system。窗户。自动化。自动元素。自动元素。FrameworkID.aspx)。使用Spy可以在MSN Messenger、Windows XP、Office、IE、Windows Media Player中看到窗口类名为DirectUIHWND的窗口。

  从文件描述来看,DUI70.dll和DUser.dll好像是这个框架的实现文件,而没有导入这些dll的软件应该是复制了这个库的代码。比如IEFrame.dll的Windows Vista和IE7的测试版引入DUser.dll(http://social . msdn . Microsoft . com/forums/en-us/Windows ui development/thread/6b 801577-1699-4093-8 a58-198 c64b 120 e 0)而正式版用的是IEUI.DLL。这应该是因为微软不愿意公开支持这个函数频繁变化的类库,反垄断案禁止非Windows组件调用未公开的Windows API。

  看看DUser.dll的函数导出表(http://www.webtropy.com/articles/dll-api.aspx?Dll=duser),可以看到Gadget这个词在没有具体控件的情况下被广泛使用。因为没有窗口句柄,控件不会被window类区分,但可能会像Windows Vista侧边栏小工具一样使用HTML作为界面。

  从这个类库的名称和行为来看,它实际上应该是基于DirectX,一个类似于WPF的接口类库框架。在微软的招聘网站上,你可以看到Office Communications项目组的一个职位介绍上写着“通过direct UI进行原生Win32/64 UX体验,通过Silverlight进行Web UX体验”,意思是这个项目组对待它和Silverlight是一样的。DirectUIHWND窗口可以在需要性能和安全性的场合看到,比如IE的Tab窗口、Shell中的DefView、Windows登录界面等。在Windows Vista上使用DirectUI的微软程序与WPF程序一样兼容桌面合成和远程桌面,应该直接或间接称为Direct3D。

  那么如何才能达到类似的效果呢?

  无窗口用户界面并不是一个新概念(http://bogs.msdn.com/oldnew thing/archive/2005/02/11/371042 . aspx),Visual C的应用程序向导可以创建无窗口ActiveX。但是做过无窗口模式下RichEdit实现的人都知道,微软的系统控件侧重于各种功能,比如各种快捷键、滚动条、界面风格、可访问性、用户界面自动化等。几乎完全像IE项目组一样做到无窗口并不容易。Raymond Chen在http://bogs . msdn . com/old new thing/archive/2005/02/11/371042 . aspx中提到,可以使用DrawThemeBackground和DrawFrameControl两个API,但它们只对与Windows界面风格一致的程序有用。如果接口不复杂,可以简单集成IE的Trident引擎,比如使用MFC的CHTMLView和CDHTMLDialog,Windows窗体的WebBrowser类。这样做的代价是程序需要牺牲性能,在严格的IE安全配置下可能无法工作。各种向导,谷歌任务,微软Outlook,Outlook Express等。由视觉Studio.Net开始使用这个方案。

  另一个解决方案是集成WPF或Silverlight。VC项目组在用户调查中发现,大部分需要WPF的Visual C用户都是用C#编写WPF代码,然后与C /CLI和非托管代码(http://social . msdn . Microsoft . com/forums/en-us/WPF/thread/DD 1e 31 bb-Fe B4-4d 77-B524-42a 282 f 51 b 1/)进行接口,所以他们决定投身其中。Visual Studio 2010使用这种方案。

  为什么我不能使用未发布的API?想看恐怖故事请参考http://bogs . msdn . com/old new thing/archive/2003/12/23/45481 . aspx和3358bogs.technet.com/Stefan _戈斯纳/archive/2005/07/27/unchecked _

  后记:

  *如果微软在产品文档中讨论了未发布的API,那么这个API还是未发布的吗?(http://msdn . Microsoft . com/en-us/library/aa 140182(office . 10)。aspx)

  * Visual Studio代码库中有一个名为DirectUI的类库,其设计思想与微软的DirectUser库(http://Visual Studio gallery . msdn . Microsoft . com/en-us/1 b 69 c 9 Fe-e422-4799-9e 5-6 AC 7034 c 52 e 1)相似,但也有人误以为这是微软用来实现MSN接口的库。

  *IE9将使用Dierct2D作为渲染引擎。不知道IE项目组移植代码后能不能公开控件类库的接口?

  详情见http://blog..net/jiangsheng/article/details/5404320。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: