WINX A C++ Template GUI Library

70
WINX WINX A C++ Template GUI Library A C++ Template GUI Library 许许许 许许许 2006-3-3 2006-3-3

description

WINX A C++ Template GUI Library. 许式伟 2006-3-3. 纲要. C++ 程序员的困惑 谈谈 WINX 的设计目标 WINX 概览 WINX 作为界面库的特性 界面风格问题 WINX 的高级特性 WINX 对自动化的支持 自动化支持与 ATL 相比足够简化、易用。 WINX 对 IPC 的支持 进程间的通讯 WINX 对对大型程序的支持 WINX 的大型程序设计的理念. WINX 的设计目标. C++ 程序员的困惑 WINX 的目标. C++ 程序员的困惑. 内存管理 垃圾回收器? - PowerPoint PPT Presentation

Transcript of WINX A C++ Template GUI Library

Page 1: WINX A C++ Template GUI Library

WINXWINXA C++ Template GUI LibraryA C++ Template GUI Library

许式伟许式伟2006-3-32006-3-3

Page 2: WINX A C++ Template GUI Library

纲要纲要• C++C++ 程序员的困惑程序员的困惑

– 谈谈谈谈 WINXWINX 的设计目标的设计目标• WINXWINX 概览概览

– WINXWINX 作为界面库的特性作为界面库的特性– 界面风格问题界面风格问题

• WINXWINX 的高级特性的高级特性– WINXWINX 对自动化的支持对自动化的支持

• 自动化支持与自动化支持与 ATLATL 相比足够简化、易用。相比足够简化、易用。– WINXWINX 对对 IPCIPC 的支持的支持

• 进程间的通讯进程间的通讯– WINXWINX 对对大型程序的支持对对大型程序的支持

• WINXWINX 的大型程序设计的理念的大型程序设计的理念

Page 3: WINX A C++ Template GUI Library

WINXWINX 的设计目标的设计目标

• C++C++ 程序员的困惑程序员的困惑• WINXWINX 的目标的目标

Page 4: WINX A C++ Template GUI Library

C++C++ 程序员的困惑程序员的困惑• 内存管理内存管理

– 垃圾回收器?垃圾回收器?– 解决方案: 解决方案: WINXWINX !( !( AutoFreeAllocAutoFreeAlloc 等)等)

• 界面编程界面编程– 可视化?可视化?– 属性编程?事件?属性编程?事件?– 解决方案:解决方案: WINXWINX !!

• 自动化支持(自动化支持( AutomationAutomation ))– DispatchDispatch 调用?连接点?调用?连接点?– 解决方案:解决方案: #import + WINX#import + WINX !!

• 进程间通讯(进程间通讯( IPCIPC ))– 解决方案:解决方案: WINXWINX !!

• 大型程序支持大型程序支持– 如何解耦?如何解耦? Document/ViewDocument/View ??– WINXWINX 的界面设计理念不是的界面设计理念不是 MFCMFC 简单的简单的 Document/ViewDocument/View 模型。模型。

Page 5: WINX A C++ Template GUI Library

WINXWINX 的目标的目标

• 轻巧、易用、“傻瓜式”轻巧、易用、“傻瓜式”• 属性编程(类属性编程(类 DelphiDelphi ))• 可视化可视化

– 事实:事实: WTLWTL 的很多关键特性在模态对话框中不可的很多关键特性在模态对话框中不可用。例如用。例如 PreTranslateMessage PreTranslateMessage (包括快捷键的(包括快捷键的支持)、支持)、 UpdateUIUpdateUI 等等。等等。

– 与与 WTLWTL 对模态对话框的“轻视”相反,对模态对话框的“轻视”相反, WINXWINX 极极大化的强化模态对话框的能力。从而使得多数的界大化的强化模态对话框的能力。从而使得多数的界面设计可以以可视化方式完成。面设计可以以可视化方式完成。

Page 6: WINX A C++ Template GUI Library

WINXWINX 中的基本概念中的基本概念

• 基础类(基础类( BasicTypesBasicTypes ))• 句柄类(句柄类( HandleClassHandleClass ))• 窗口类(窗口类( WindowClassWindowClass ))• 消息(消息( WindowMessageWindowMessage ))• 属性(属性( PropertyProperty ))• 行为(行为( WindowBehaviorWindowBehavior ))

Page 7: WINX A C++ Template GUI Library

WINXWINX 中的基本概念中的基本概念• 基础支撑基础支撑

– 基础类(基础类( BasicTypesBasicTypes ),多数来自),多数来自 WTLWTL– 辅助:调试诊断等辅助:调试诊断等

• 句柄类(句柄类( HandleClassHandleClass ))– Win32 SDKWin32 SDK 中的句柄的简单包装中的句柄的简单包装– WINXWINX 的所有句柄类直接取自的所有句柄类直接取自 ATL/WTLATL/WTL

• 窗口类(窗口类( WindowClassWindowClass ))– 消息(消息( MessageMessage )的接收者)的接收者– 窗口类不一定要保存有窗口句柄(!!!)窗口类不一定要保存有窗口句柄(!!!)

• 消息(消息( WindowMessageWindowMessage ))– 消息分派(消息分派( DispatchMessageDispatchMessage ))

• 属性(属性( PropertyProperty ))– 属性编程(类属性编程(类 DelphiDelphi ),易往可视化发展),易往可视化发展

Page 8: WINX A C++ Template GUI Library

基础支撑基础支撑

• 基础支撑的实现原则基础支撑的实现原则• 基础类(基础类( BasicTypesBasicTypes ))• 辅助辅助

Page 9: WINX A C++ Template GUI Library

基础支撑的实现原则基础支撑的实现原则• 不假设自己是用户独立使用的库。不假设自己是用户独立使用的库。• 所以尽量检测用户是否使用了某种流行的库,选择该库已有的。所以尽量检测用户是否使用了某种流行的库,选择该库已有的。• 举例:举例: WINX_ASSERTWINX_ASSERT

#if defined(ASSERT)#if defined(ASSERT)#define WINX_ASSERT(e)#define WINX_ASSERT(e) ASSERT(e)ASSERT(e)#elif defined(_ASSERTE)#elif defined(_ASSERTE)#define WINX_ASSERT(e)#define WINX_ASSERT(e) _ASSERTE(e)_ASSERTE(e)#else#else## ifdef _DEBUGifdef _DEBUG## define WINX_ASSERT(e)define WINX_ASSERT(e) assert(e)assert(e)## elseelse## define WINX_ASSERT(e)define WINX_ASSERT(e) 00## endifendif#endif#endif

Page 10: WINX A C++ Template GUI Library

基础类基础类 (BasicTypes)(BasicTypes) 列表列表

• 来自来自 WTLWTL– CPoint CPoint – CRectCRect– CSizeCSize– CStringCString– CFindFileCFindFile– CRecentDocumentListCRecentDocumentList

• 辅助辅助– WindowRectWindowRect– ClientRectClientRect

Page 11: WINX A C++ Template GUI Library

辅助辅助• 通用通用

– _offsetof_offsetof 、、 parent_class_ptrparent_class_ptr 、、 countofcountof– MsgBoxMsgBox– WINX_DEFINE_IIDWINX_DEFINE_IID 、、 WINX_UUIDWINX_UUID

• 调试调试 // 诊断诊断– WINX_ASSERTWINX_ASSERT– WINX_ASSERT_OKWINX_ASSERT_OK– WINX_ASSERT_ONCEWINX_ASSERT_ONCE– WINX_ASSERT_DERIVEWINX_ASSERT_DERIVE– WINX_REPORTWINX_REPORT– WINX_VERIFYWINX_VERIFY– WINX_VERIFY_OKWINX_VERIFY_OK– WINX_TRACEWINX_TRACE

Page 12: WINX A C++ Template GUI Library

句柄类句柄类 (HandleClass)(HandleClass) 列表列表

• 窗口句柄类窗口句柄类– StaticStatic 、、 RichEditRichEdit 等等

• 资源句柄类资源句柄类– 图片、光标、图标等图片、光标、图标等

• GDIGDI 句柄类句柄类– DCDC 、、 PenPen 、、 BrushBrush 等等

• 其他句柄类其他句柄类– ImageListImageList 等等

Page 13: WINX A C++ Template GUI Library

窗口句柄类窗口句柄类• WindowHandle - ATL::CWindowWindowHandle - ATL::CWindow• AxCtrlHandle - ATL::CAxWindowAxCtrlHandle - ATL::CAxWindow

– ActiveXActiveX 控件句柄类控件句柄类• StaticHandle - StaticHandle - WTL::CStaticWTL::CStatic• ButtonHandle - WTL::CButtonButtonHandle - WTL::CButton• EditHandle - WTL::CEditHandle - WTL::CEEditdit• ComboBoxHandleComboBoxHandle - - WTL::CComboBoxWTL::CComboBox• ScrollBarHandleScrollBarHandle - - WTL::CScrollBarWTL::CScrollBar• FlatScrollBarHandleFlatScrollBarHandle - - WTL::CFlatScrollBarWTL::CFlatScrollBar• ListBoxHandle - WTL::CListBoxListBoxHandle - WTL::CListBox• DragListBoxHandle - WTL::CDragListBoxDragListBoxHandle - WTL::CDragListBox• ListCtrlHandle - WTL::CListViewCtrlListCtrlHandle - WTL::CListViewCtrl• HeaderCtrlHandle - WTL::CHeaderCtrlHeaderCtrlHandle - WTL::CHeaderCtrl• TreeCtrlHandle - WTL::CTreeViewCtrlTreeCtrlHandle - WTL::CTreeViewCtrl

Page 14: WINX A C++ Template GUI Library

• ToolBarCtrlHandle - WTL::CToolBarCtrlToolBarCtrlHandle - WTL::CToolBarCtrl• TabCtrlHandle - WTL::CTabCtrlTabCtrlHandle - WTL::CTabCtrl• ToolTipCtrlHandle - WTL::CToolTipCtrlToolTipCtrlHandle - WTL::CToolTipCtrl• StatusBarCtrlHandle - WTL::CStatusBarCtrlStatusBarCtrlHandle - WTL::CStatusBarCtrl• SliderCtrlHandle/TrackBarCtrlHandle - WTL::CTrackBarCtrlSliderCtrlHandle/TrackBarCtrlHandle - WTL::CTrackBarCtrl• SpinButtonCtrlHandle/UpDownCtrlHandle - WTL::CUpDownCtrlSpinButtonCtrlHandle/UpDownCtrlHandle - WTL::CUpDownCtrl• ProgressCtrlHandle - WTL::CProgressBarCtrlProgressCtrlHandle - WTL::CProgressBarCtrl• HotKeyCtrlHandle - WTL::CHotKeyCtrlHotKeyCtrlHandle - WTL::CHotKeyCtrl• AnimateCtrlHandle - WTL::CAnimateCtrlAnimateCtrlHandle - WTL::CAnimateCtrl• ReBarCtrlHandle - WTL::CReBarCtrlReBarCtrlHandle - WTL::CReBarCtrl• ComboBoxExHandle - WTL::CComboBoxExComboBoxExHandle - WTL::CComboBoxEx• DateTimeCtrlHandle - WTL::CDateTimePickerCtrlDateTimeCtrlHandle - WTL::CDateTimePickerCtrl• MonthCalCtrlHandle - WTL::CMonthCalendarCtrlMonthCalCtrlHandle - WTL::CMonthCalendarCtrl• IPAddressCtrlHandle - WTL::CIPAddressCtrlIPAddressCtrlHandle - WTL::CIPAddressCtrl• PagerCtrlHandle - WTL::CPagerCtrlPagerCtrlHandle - WTL::CPagerCtrl• RichEditHandle - WTL::CRichEditCtrlRichEditHandle - WTL::CRichEditCtrl

窗口句柄类窗口句柄类 (2)(2)

Page 15: WINX A C++ Template GUI Library

资源句柄类资源句柄类

• BitmapHandle - WTL::CBitmapHandleBitmapHandle - WTL::CBitmapHandle• Bitmap - WTL::CBitmapBitmap - WTL::CBitmap• IconHandle - WTL::CIconHandleIconHandle - WTL::CIconHandle• Icon - WTL::CIconIcon - WTL::CIcon• CursorHandle - WTL::CCursorHandleCursorHandle - WTL::CCursorHandle• Cursor - WTL::CCursorCursor - WTL::CCursor• MenuHandle - WTL::CMenuHandleMenuHandle - WTL::CMenuHandle• Menu - WTL::CMenuMenu - WTL::CMenu• AcceleratorHandle - WTL::CAcceleratorHandleAcceleratorHandle - WTL::CAcceleratorHandle• Accelerator - WTL::CAcceleratorAccelerator - WTL::CAccelerator

Page 16: WINX A C++ Template GUI Library

GDIGDI 句柄类句柄类• RgnHandle - WTL::CRgnHandleRgnHandle - WTL::CRgnHandle• Rgn - WTL::CRgnRgn - WTL::CRgn• PenHandle - WTL::CPenHandlePenHandle - WTL::CPenHandle• Pen - WTL::CPenPen - WTL::CPen• BrushHandle - WTL::CBrushHandleBrushHandle - WTL::CBrushHandle• Brush - WTL::CBrushBrush - WTL::CBrush• FontHandle - WTL::CFontHandleFontHandle - WTL::CFontHandle• Font - WTL::CFontFont - WTL::CFont• PaletteHandle - WTL::CPaletteHandlePaletteHandle - WTL::CPaletteHandle• Palette - WTL::CPalettePalette - WTL::CPalette• EnhMetaFileHandle - WTL::CEnhMetaFileHandleEnhMetaFileHandle - WTL::CEnhMetaFileHandle• EnhMetaFile - WTL::CEnhMetaFileEnhMetaFile - WTL::CEnhMetaFile

Page 17: WINX A C++ Template GUI Library

GDIGDI 句柄类 – 句柄类 – DCDC

• DCHandle - WTL::CDCHandleDCHandle - WTL::CDCHandle• ClientDC - WTL::CClientDCClientDC - WTL::CClientDC• WindowDC - WTL::CWindowDCWindowDC - WTL::CWindowDC• PaintDC - WTL::CPaintDCPaintDC - WTL::CPaintDC• MemoryDC - WTL::CMemoryDCMemoryDC - WTL::CMemoryDC• EnhMetaFileDC - WTL::CEnhMetaFileDCEnhMetaFileDC - WTL::CEnhMetaFileDC

Page 18: WINX A C++ Template GUI Library

其他句柄类其他句柄类

• ImageListHandle - WTL::CImageListImageListHandle - WTL::CImageList

Page 19: WINX A C++ Template GUI Library

窗口类(窗口类( WindowClassWindowClass ))

• 窗口分类窗口分类• 窗口类的注册窗口类的注册• 通用控件的窗口类通用控件的窗口类

– 属于属于 SubclassWindowSubclassWindow– 子类化(或:超类化)子类化(或:超类化)

• 使用高版本特有控件使用高版本特有控件– SafeCtrlSafeCtrl

Page 20: WINX A C++ Template GUI Library

窗口分类窗口分类• WindowWindow

– 普通窗口,普通窗口,例:例:Hello, Hello, WinxWinx!!!!!!• SubclassWindowSubclassWindow

– 子类(子类( SubclassSubclass ),),例:禁止例:禁止EditEdit的右键菜单的右键菜单– 超类(超类( SuperclassSuperclass ),),例:禁止例:禁止EditEdit的右键菜单的右键菜单

• LightSubclassWindowLightSubclassWindow– 对一个窗口对一个窗口子类化子类化,轻量级,这要求窗口类没有数据。,轻量级,这要求窗口类没有数据。

• LightSuperclassWindowLightSuperclassWindow– 对一个窗口超类化,轻量级,这要求窗口类没有数据。对一个窗口超类化,轻量级,这要求窗口类没有数据。

• ModalessDialogModalessDialog– 非模态对话框,非模态对话框,例:将对话框嵌入到另一个对话框例:将对话框嵌入到另一个对话框– 对话框超类,对话框超类,例:将对话框嵌入到另一个对话框例:将对话框嵌入到另一个对话框

• ModalDialog/AxModalDialogModalDialog/AxModalDialog– 模态对话框,模态对话框,例:例:Hello, Hello, WinxWinx!!!!!!– 允许插入允许插入 ActiveXActiveX 控件的对话框,控件的对话框,例:嵌入例:嵌入IEIE

Page 21: WINX A C++ Template GUI Library

窗口类的注册窗口类的注册• MFCMFC 、、 WTLWTL 弱化了窗口类的注册,与此相反,弱化了窗口类的注册,与此相反, WINXWINX 强调窗口类概强调窗口类概

念,并要求用户主动注册窗口类。念,并要求用户主动注册窗口类。– 表面上看,表面上看, WINXWINX 的用法比的用法比 MFCMFC 、、 WTLWTL繁琐了(多了主动繁琐了(多了主动 RegisterClasRegisterClas

ss过程),但是深究下去,你将发现这恰恰是过程),但是深究下去,你将发现这恰恰是 WINXWINX推崇可视化界面开发推崇可视化界面开发的关键点。的关键点。

• 窗口类注册相关窗口类注册相关– WINX_CLASSWINX_CLASS– WindowClass::RegisterClassWindowClass::RegisterClass

• 只有普通窗口、窗口超类(只有普通窗口、窗口超类( SuperclassSuperclass )需要注册。子类化窗口、)需要注册。子类化窗口、普通对话框不需要注册。普通对话框不需要注册。– RegisterClassRegisterClass 相关的例子:相关的例子:

• 普通窗口,普通窗口,例:例:Hello, Hello, WinxWinx!!!!!!• 超类(超类( SuperclassSuperclass ),),例:禁止例:禁止EditEdit的右键菜单的右键菜单• 对话框超类,对话框超类,例:将对话框嵌入到另一个对话框例:将对话框嵌入到另一个对话框

Page 22: WINX A C++ Template GUI Library

通用控件的窗口类(列表)通用控件的窗口类(列表)• Static/Button/Edit/ComboBoxStatic/Button/Edit/ComboBox• ScrollBar/FlatScrollBarScrollBar/FlatScrollBar• ListBox/DragListBoxListBox/DragListBox• ListCtrl/HeaderCtrl/TreeCtrlListCtrl/HeaderCtrl/TreeCtrl• ToolBarCtrl/ReBarCtrlToolBarCtrl/ReBarCtrl• SliderCtrlSliderCtrl (即:(即: TrackBarCtrlTrackBarCtrl ))• SpinButtonCtrlSpinButtonCtrl (即:(即: UpDownCtrlUpDownCtrl ))• TabCtrl/ToolTipCtrl/StatusBarCtrl/ProgressCtrlTabCtrl/ToolTipCtrl/StatusBarCtrl/ProgressCtrl• HotKeyCtrl/AnimateCtrl/IPAddressCtrlHotKeyCtrl/AnimateCtrl/IPAddressCtrl• DateTimeCtrl/MonthCalCtrlDateTimeCtrl/MonthCalCtrl• ComboBoxEx/RichEditComboBoxEx/RichEdit• LinkCtrlLinkCtrl

考虑到MFC 的接受程度远远高于WTL ,故此命名以兼容MFC 为主。

Page 23: WINX A C++ Template GUI Library

使用高版本特有控件使用高版本特有控件

• SafeCtrlSafeCtrl– 这是一个特殊的窗口类。在以下用况使用:这是一个特殊的窗口类。在以下用况使用:

• 高版本高版本 WindowsWindows 提供了一个控件(例如提供了一个控件(例如 LinkCtrlLinkCtrl)。我们希)。我们希望在该版本的望在该版本的 WindowsWindows 版本使用它,而在低版本的版本使用它,而在低版本的 WindowWindowss下,我们提供一个替换控件(下,我们提供一个替换控件( AltCtrlAltCtrl )。)。

•我们使用了一个第三方控件。我们希望在用户安装了该控件时我们使用了一个第三方控件。我们希望在用户安装了该控件时使用它,否则使用替换控件(使用它,否则使用替换控件( AltCtrlAltCtrl )。)。

• 概念概念– OrgCtrl/OrgClassNameOrgCtrl/OrgClassName

• 高版本高版本 WindowsWindows 提供(或第三方提供)的控件提供(或第三方提供)的控件– AltCtrl/AltClassNameAltCtrl/AltClassName

•替换控件。你需要实现的。替换控件。你需要实现的。– SafeCtrl/SafeClassNameSafeCtrl/SafeClassName

•安全控件。安全控件。 WINXWINX 提供的。例如提供的。例如 SafeLinkCtrlSafeLinkCtrl 。。

Page 24: WINX A C++ Template GUI Library

消息(消息( WindowMessageWindowMessage ))

• 消息分派总流程消息分派总流程– DispatchMessageDispatchMessage

• 消息分类消息分类– 位置消息、焦点消息等位置消息、焦点消息等

• 局部分派局部分派– 命令分派(命令分派( CommandCommand ))– 通知分派(通知分派( NotifyNotify ))

• 键盘与快捷键键盘与快捷键• 反射(反射( ReflectReflect ))

Page 25: WINX A C++ Template GUI Library

消息分派(消息分派( DispatchMessagDispatchMessagee ))• 消息分派机制是消息分派机制是 WINXWINX 的特色之一。的特色之一。•区别于区别于 WTLWTL或者或者 MFCMFC ,你不需要主动写一,你不需要主动写一个消息分派的映射表。个消息分派的映射表。

• WINXWINX 易用性的第一体现。易用性的第一体现。• 高性能高性能

– WINXWINX 为了实现消息分派使用了一个庞大的虚表?为了实现消息分派使用了一个庞大的虚表?NONO !!

– 对比产生的汇编代码表明,对比产生的汇编代码表明, WINXWINX 的消息分派产的消息分派产生的代码比生的代码比 WTLWTL和和 MFCMFC更为短小精悍。更为短小精悍。

Page 26: WINX A C++ Template GUI Library

WINXWINX 和和 WTLWTL 消息分派的比较消息分派的比较

•各有特色各有特色– WTLWTL :强灵活性,容易进行第三方的功能扩展。:强灵活性,容易进行第三方的功能扩展。缺点是看起来比较丑陋。缺点是看起来比较丑陋。

– WINXWINX :强调易用性,并且实现了用户不需要:强调易用性,并且实现了用户不需要某个特性时无额外开销。故此,系统可以不断某个特性时无额外开销。故此,系统可以不断的进行新特性的添加(但是缺点是不能以第三的进行新特性的添加(但是缺点是不能以第三方的方式添加——注:当然你可以按方的方式添加——注:当然你可以按 WTLWTL 的方的方式进行功能扩展,在式进行功能扩展,在 WINXWINX 中这是允许的,但中这是允许的,但与与 WINXWINX 的设计理念有背)。的设计理念有背)。

Page 27: WINX A C++ Template GUI Library

消息分类消息分类

• 位置事件(位置事件( MouseEventMouseEvent ))• 焦点事件(焦点事件( KeyboardKeyboard 、、 AccelAccel 、、 CommandCommand ))

– 目标的不确定性,是焦点事件(目标的不确定性,是焦点事件( Focus MessageFocus Message )最显)最显著特征。著特征。

• 绘制事件(绘制事件( Paint/NcPaint/EraseBkgndPaint/NcPaint/EraseBkgnd 等)等)• 定时事件(定时事件( TimerTimer ))• 通知事件通知事件

– 子通知父子通知父– 系统通知系统通知– 广播广播

Page 28: WINX A C++ Template GUI Library

命令分派(命令分派( CommandCommand ))

•命令事件命令事件– WINX_CMDS_BEGIN [_EX]WINX_CMDS_BEGIN [_EX]– WINX_CMDWINX_CMD– WINX_CMD_EXWINX_CMD_EX– WINX_CMDS_END [_EX]WINX_CMDS_END [_EX]

• ForwardCommandForwardCommand– WINX_CMDS_BEGIN_EX/END_EXWINX_CMDS_BEGIN_EX/END_EX配对,区别与配对,区别与 WW

INX_CMDS_BEGIN/ENDINX_CMDS_BEGIN/END 的是,如果消息自身没有的是,如果消息自身没有处理,会发给活动的子视图处理。处理,会发给活动的子视图处理。

Page 29: WINX A C++ Template GUI Library

命令状态(命令状态( UpdateUIUpdateUI ))

• WTLWTL 的命令状态维护机制不错,但是的命令状态维护机制不错,但是 ModModalDialogalDialog 不完全支持该机制。主要的问题不完全支持该机制。主要的问题在于没有在于没有 OnIdleOnIdle 消息。消息。

• WINXWINX 的的 UpdateUIUpdateUI 基于基于 WTLWTL 的命令状态的命令状态维护机制实现,并作出改进。维护机制实现,并作出改进。

Page 30: WINX A C++ Template GUI Library

区别:命令状态机制与界面更新区别:命令状态机制与界面更新

• 相同点:相同点:– 均属于界面更新。所以理论上也可以使用界面更均属于界面更新。所以理论上也可以使用界面更新机制来进行命令状态的更新。新机制来进行命令状态的更新。

•区别:区别:– 界面更新机制更关注的是界面与其他组件的交互界面更新机制更关注的是界面与其他组件的交互

(订阅事件、响应事件)。(订阅事件、响应事件)。– 命令状态更新是比较细粒度的界面更新过程。用命令状态更新是比较细粒度的界面更新过程。用

事件订阅有时显得不值得。因此,通常命令状态事件订阅有时显得不值得。因此,通常命令状态更新是一个更新是一个 OnIdleOnIdle过程。过程。

Page 31: WINX A C++ Template GUI Library

键盘与快捷键(键盘与快捷键( Keyboard&AcceKeyboard&Accell ))•和命令一样,属于焦点事件,有事件的目标窗和命令一样,属于焦点事件,有事件的目标窗

口不确定性。口不确定性。– 考虑用况:整个应用程序支持考虑用况:整个应用程序支持 Undo/RedoUndo/Redo ,但是,但是

程序某个时刻处于一个程序某个时刻处于一个 EditEdit 控件中,此时希望控件中,此时希望 UnUndo/Redodo/Redo 是是 EditEdit 控件的文本,而不是应用程序一控件的文本,而不是应用程序一级的级的 Undo/RedoUndo/Redo 。。

• 解决方案:解决方案:– 使用使用 ForwardCommandForwardCommand– 使用使用 TestTranslateAccelTestTranslateAccel (见后文)(见后文)

Page 32: WINX A C++ Template GUI Library

通知消息分派(通知消息分派( NotifyNotify ))

• WINX_NOTIFY_BEGINWINX_NOTIFY_BEGIN

• WINX_NOTIFYWINX_NOTIFY

• WINX_NOTIFY_ENDWINX_NOTIFY_END

Page 33: WINX A C++ Template GUI Library

反射(反射( ReflectReflect ))• WINX_REFLECTWINX_REFLECT

– 反射,即将子窗口发给父窗口的消息返回给子窗反射,即将子窗口发给父窗口的消息返回给子窗口自己处理。反射机制通常用于口自己处理。反射机制通常用于解耦解耦。。

• WINX_REFLECT_CMDWINX_REFLECT_CMD•WINX_REFLECT_CMDS_BEGINWINX_REFLECT_CMDS_BEGIN•WINX_REFLECT_CMDWINX_REFLECT_CMD•WINX_REFLECT_CMDS_ENDWINX_REFLECT_CMDS_END

• WINX_REFLECT_NOTIFYWINX_REFLECT_NOTIFY•WINX_REFLECT_NOTIFY_BEGINWINX_REFLECT_NOTIFY_BEGIN•WINX_REFLECT_NOTIFYWINX_REFLECT_NOTIFY•WINX_REFLECT_NOTIFY_ENDWINX_REFLECT_NOTIFY_END

Page 34: WINX A C++ Template GUI Library

鼠标滚轮消息鼠标滚轮消息

• WM_MOUSEWHEELWM_MOUSEWHEEL– Note: SetFocus();Note: SetFocus();

Page 35: WINX A C++ Template GUI Library

属性(属性( PropertyProperty ))

• 属性属性• 属性命名规则属性命名规则• 支持的属性列表支持的属性列表

Page 36: WINX A C++ Template GUI Library

属性属性

• 基于属性的编程,容易向可视化发展。基于属性的编程,容易向可视化发展。• DelphiDelphi 中优良的用户体验中优良的用户体验•区别于区别于 DelphiDelphi :如果某个特性没有使用,:如果某个特性没有使用,

不会带来额外的代价。不会带来额外的代价。

Page 37: WINX A C++ Template GUI Library

属性的命名规则属性的命名规则• 规则规则

– WINX[_WINX[_适用范围适用范围 ]_]_ 属性属性 [_[_ 属性子类属性子类 ]]• WINX_BKGND_PATTERNWINX_BKGND_PATTERN

– 其中,其中, BKGNDBKGND 为属性,为属性, PATTERNPATTERN 为属性子类。为属性子类。• WINX_APP_ICONWINX_APP_ICON

– 其中,其中, APPAPP 为适用范围,为适用范围, ICONICON 为属性。为属性。• WINX_SYSICONWINX_SYSICON

– 有时,为了减少宏名长度,在属性子类可以表意的情况下,可以省略属性。如:有时,为了减少宏名长度,在属性子类可以表意的情况下,可以省略属性。如: WWINX_SYSICONINX_SYSICON ,完整名应该称为,完整名应该称为 WINX_ICON_SYSICONWINX_ICON_SYSICON 。。

• 适用范围适用范围– WINX_XXXWINX_XXX

• 该属性所有窗口均适用该属性所有窗口均适用– WINX_DLG_XXXWINX_DLG_XXX

• 该属性只在对话框类中使用。该属性只在对话框类中使用。– WINX_APP_XXXWINX_APP_XXX

• 该属性属于该属性属于 ApplicationApplication 属性,应该在属性,应该在 WinMainWinMain函数中使用。这类属性比较函数中使用。这类属性比较特殊,属于全局设置,作用于所有窗口。特殊,属于全局设置,作用于所有窗口。

– ............

Page 38: WINX A C++ Template GUI Library

WINXWINX 支持的属性列表支持的属性列表• 快捷键(快捷键( AccelAccel ))• 窗口图标(窗口图标( IconIcon ))• 窗口背景(窗口背景( BkgndBkgnd ))• 窗口子控件统一背景(窗口子控件统一背景( CtlBkgndCtlBkgnd ))• 窗口窗口 ResizeResize最小大小(最小大小( MinInfoMinInfo ))• 窗口布局(窗口布局( LayoutLayout ))• 窗口锚点(窗口锚点( Anchor - todoAnchor - todo ))• 应用程序图标(应用程序图标( AppIconAppIcon ))• 应用程序菜单风格(应用程序菜单风格( AppMenu - todoAppMenu - todo ))• 应用程序观感(应用程序观感( AppLookNFeel - todoAppLookNFeel - todo ))

Page 39: WINX A C++ Template GUI Library

WINX_ACCELWINX_ACCEL

• WINX_ACCELWINX_ACCEL– 指定一个窗口的快捷键表指定一个窗口的快捷键表

• WINX_DLG_ACCELWINX_DLG_ACCEL– 对话框及其子控件支持快捷键,默认不支持。对话框及其子控件支持快捷键,默认不支持。

• TestTranslateAccelTestTranslateAccel– 快捷键派发机制的修正。因为父窗口可能截获快捷键派发机制的修正。因为父窗口可能截获

子窗口的快捷键。故此提供一个修正机会。子窗口的快捷键。故此提供一个修正机会。

Page 40: WINX A C++ Template GUI Library

WINX_ICONWINX_ICON

• 设置窗口的图标设置窗口的图标– WINX_ICONWINX_ICON– WINX_ICONSMWINX_ICONSM– WINX_SYSICONWINX_SYSICON– WINX_SYSICONSMWINX_SYSICONSM

Page 41: WINX A C++ Template GUI Library

WINX_BKGNDWINX_BKGND

• 设置窗口背景设置窗口背景– WINX_BKGND_COLORWINX_BKGND_COLOR

例:例: WINX_BKGND_COLOR(COLOR_WINDOW);WINX_BKGND_COLOR(COLOR_WINDOW);– WINX_BKGND_BRUSHWINX_BKGND_BRUSH

例: 例: WINX_BKGND_BRUSH(GRAY_BRUSH);WINX_BKGND_BRUSH(GRAY_BRUSH);– WINX_BKGND_PATTERNWINX_BKGND_PATTERN

例:例: WINX_BKGND_PATTERN(WINX_BKGND_PATTERN(IDB_BKGNDIDB_BKGND););功能:以资源文件中的一幅位图作为窗口背景功能:以资源文件中的一幅位图作为窗口背景

– WINX_BKGND_NULLWINX_BKGND_NULL功能:透明背景。功能:透明背景。

Page 42: WINX A C++ Template GUI Library

WINX_CTLBKGNDWINX_CTLBKGND

• 类似于类似于 WINX_BKGNDWINX_BKGND ,但是是统一设置某,但是是统一设置某类型的子控件背景。类型的子控件背景。– WINX_CTLBKGND_COLORWINX_CTLBKGND_COLOR– WINX_CTLBKGND_BRUSHWINX_CTLBKGND_BRUSH– WINX_CTLBKGND_PATTERNWINX_CTLBKGND_PATTERN– WINX_CTLBKGND_NULLWINX_CTLBKGND_NULL– WINX_CTLBKGND_NULL_ALLWINX_CTLBKGND_NULL_ALL

Page 43: WINX A C++ Template GUI Library

WINX_MININFOWINX_MININFO

• 设置窗口的最小设置窗口的最小 SIZESIZE– WINX_MININFOWINX_MININFO– WINX_MININFO_PTWINX_MININFO_PT– WINX_MININFO_DEFAULTWINX_MININFO_DEFAULT

Page 44: WINX A C++ Template GUI Library

设置窗口布局(设置窗口布局( 11 ))

• WINX_ANCHORWINX_ANCHOR– 子控件使用,指定自己的子控件使用,指定自己的 AnchorAnchor 方法。方法。– 暂屏蔽。暂屏蔽。

Page 45: WINX A C++ Template GUI Library

设置窗口布局(设置窗口布局( 22 ))

•提供以下方案:提供以下方案:– WINX_DLGRESIZE_BEGINWINX_DLGRESIZE_BEGIN– WINX_DLGRESIZEWINX_DLGRESIZE– WINX_DLGRESIZE_ENDWINX_DLGRESIZE_END

•这是利用这是利用 WTLWTL提供的提供的 DLGRESIZE_MAPDLGRESIZE_MAP 实实现,使用上略有简化。现,使用上略有简化。

• 例子:例子:– LayoutLayout

Page 46: WINX A C++ Template GUI Library

WINX_APP_ICONWINX_APP_ICON

• 设置应用程序图标。设置应用程序图标。•这将使得所有有标题的弹出窗口自动设置这将使得所有有标题的弹出窗口自动设置

了该图标(除非该窗口使用了该图标(除非该窗口使用 WINX_ICONWINX_ICON 自自己设置了图标)。己设置了图标)。

• 包括包括 MessageBoxMessageBox 。。

Page 47: WINX A C++ Template GUI Library

WINX_APP_MENUWINX_APP_MENU

• 设置应用程序菜单的风格。设置应用程序菜单的风格。– 自动、强制经典风格、强制自动、强制经典风格、强制 XPXP 风格。风格。– 暂屏蔽。暂屏蔽。

Page 48: WINX A C++ Template GUI Library

WINX_APP_LOOKNFEELWINX_APP_LOOKNFEEL

• 设置应用程序的总体风格。包括设置应用程序的总体风格。包括 AppIconAppIcon 、、AppMenuAppMenu 的设定。的设定。

• 从用户角度来讲,它只是一个从用户角度来讲,它只是一个 AppIconAppIcon 、、AppMenuAppMenu 的组合属性。但应当注意,它比的组合属性。但应当注意,它比单独指定单独指定 AppIconAppIcon 、、 AppMenuAppMenu 有一点点有一点点的性能优势。的性能优势。

•暂屏蔽。暂屏蔽。

Page 49: WINX A C++ Template GUI Library

窗口行为(窗口行为( WindowBehavioWindowBehaviorr ))

• 窗口行为窗口行为• 行为的禁止行为的禁止 // 许可许可• 行为的切换行为的切换

Page 50: WINX A C++ Template GUI Library

窗口行为窗口行为

• 可以施加于任何窗口上的行为特征可以施加于任何窗口上的行为特征• WINX_BEHAVIORWINX_BEHAVIOR• 目前支持的行为列表目前支持的行为列表

– DefaultBehaviorDefaultBehavior (无行为)(无行为)– MovelessMoveless (不可移动)(不可移动)– WithinScreenWithinScreen (不可出屏幕)(不可出屏幕)– LimitScreenTop/Left/RightLimitScreenTop/Left/Right– AutoHiddenTop/Left/RightAutoHiddenTop/Left/Right ((在上在上//左左//右方自动隐藏右方自动隐藏))– AutoHiddenAnySideAutoHiddenAnySide ((自动隐藏自动隐藏))– FullScreenDockableFullScreenDockable (全屏停靠在窗口的左(全屏停靠在窗口的左 //右方)右方)

Page 51: WINX A C++ Template GUI Library

窗口行为的切换(窗口行为的切换( SwitchSwitch ))

• BehaviorPermitBehaviorPermit– 是否允许一个行为是否允许一个行为– 即:在某种行为与即:在某种行为与 DefaultBehaviorDefaultBehavior之间切换之间切换

• BehaviorSwitchBehaviorSwitch– 在多种行为之间切换在多种行为之间切换

Page 52: WINX A C++ Template GUI Library

WINXWINX 的高级特性的高级特性

• 自定义快捷键自定义快捷键• 通用对话框通用对话框• PropertySheetPropertySheet• AutoCompleteAutoComplete• IPCIPC

– 拖放拖放 //复制粘贴复制粘贴– IDataObjectIDataObject– ......

Page 53: WINX A C++ Template GUI Library

自定义快捷键(自定义快捷键( CustomizeCustomize ))

•暂未实现。暂未实现。

Page 54: WINX A C++ Template GUI Library

自动完成(自动完成( AutoCompleteAutoComplete ))

• Edit/ComboBoxEdit/ComboBox 控件的自动完成控件的自动完成• 可保存历史到可保存历史到 WindowsWindows 注册表或者文件。注册表或者文件。

Page 55: WINX A C++ Template GUI Library

XPXP 风格风格

• 如何如何 XPXP 风格化?风格化?• 风格问题风格问题• 绘制绘制

Page 56: WINX A C++ Template GUI Library

XPXP 风格化风格化

• Common ControlCommon Control– 用用 InitCommControls()InitCommControls() 和和 manifestmanifest文件搞定。文件搞定。

• User Custom ControlUser Custom Control– #include <winx/Theme.h>#include <winx/Theme.h>– 需要引入需要引入 themetheme ,自己绘制出,自己绘制出 XPXP 风格的界面。风格的界面。

• MenuMenu– 用用 WINX_APP_MENUWINX_APP_MENU指定指定 XPXP 风格(建议选自动),风格(建议选自动),或者用或者用 WINX_APP_LOOKNFEELWINX_APP_LOOKNFEEL 。。

• WebBrowserWebBrowser– ActiveXActiveX 控件中,控件中, IEIE 控件的控件的 XPXP 风格化需要调用风格化需要调用 IEIE 控控

件相关接口支持。件相关接口支持。

Page 57: WINX A C++ Template GUI Library

让让 Win2000Win2000 支持支持 XP StyleXP Style ??

•这个问题我这样看:既然用户选择了这个问题我这样看:既然用户选择了 WindWindows 2000ows 2000 ,说明他喜欢,说明他喜欢 20002000 的精简风格,的精简风格,那么你又何必自作多情非要把你自己喜爱那么你又何必自作多情非要把你自己喜爱的的 XPXP 风格强加给他?风格强加给他?

• 风格一致性。风格一致性。

Page 58: WINX A C++ Template GUI Library

绘制(绘制( DrawDraw ))

• OwnerDraw - ListViewOwnerDraw - ListView• DoubleBufferDoubleBuffer

– WINX_ON_PAINTWINX_ON_PAINT– WINX_ON_PAINT_DBWINX_ON_PAINT_DB– WINX_ON_PAINT_DB_CONDWINX_ON_PAINT_DB_COND– WINX_ON_PAINT_DB_DBGWINX_ON_PAINT_DB_DBG

• XP StylesXP Styles

Page 59: WINX A C++ Template GUI Library

自动化支持(自动化支持( AutomationAutomation ))

• DispatchDispatch 调用?调用?• 接收连接点事件?接收连接点事件?

Page 60: WINX A C++ Template GUI Library

DispatchDispatch 调用调用

• #import#import– 编译器的支持编译器的支持

• DispObjectDispObject– InvokeInvoke 的包装的包装– 暂屏蔽暂屏蔽

Page 61: WINX A C++ Template GUI Library

接收连接点事件接收连接点事件

• DispEventBaseImplDispEventBaseImpl• DispEventSimpleImplDispEventSimpleImpl

– WINX_SINK_BEGINWINX_SINK_BEGIN•WINX_SINK_DEFIWINX_SINK_DEFI

– WINX_SINK_ENDWINX_SINK_END

Page 62: WINX A C++ Template GUI Library

ActiveX ControlActiveX Control

• 如何添加如何添加 ActiveXActiveX 控件?控件?– AxModalDialogAxModalDialog

• 如何接收连接点事件?如何接收连接点事件?– 简化的事件接收机制。简化的事件接收机制。

Page 63: WINX A C++ Template GUI Library

大型应用的支持(大型应用的支持( ViewModeViewModell ))

• 模型模型• ApplicationApplication• Ctrl (View)Ctrl (View)• ContainerContainer• 解耦解耦

– 基于基于 conceptconcept– IUpdateViewsIUpdateViews

Page 64: WINX A C++ Template GUI Library

大型应用的支持:大型应用的支持: ViewModelViewModel

• ContainerContainer ,, ApplicationApplication ,, CtrlsCtrls (( ViewViewss ))

• 程序架构:界面与内核的交互法则程序架构:界面与内核的交互法则• 程序应该有三种组件:程序应该有三种组件: Container, ApplicaContainer, Applica

tion, Ctrltion, Ctrl

Page 65: WINX A C++ Template GUI Library

ApplicationApplication

• Application - AppLogicApplication - AppLogic ,以,以 _Application_Application接口为根的一个业务层。接口为根的一个业务层。

Page 66: WINX A C++ Template GUI Library

CtrlCtrl (( ViewView ))

• Ctrl - Ctrl - 独立的界面控件。独立的界面控件。 CtrlCtrl 之间互不相关。之间互不相关。CtrlCtrl 不知道不知道 ContainerContainer ,与,与 AppLogicAppLogic 通过通过conceptconcept 关联。关联。

Page 67: WINX A C++ Template GUI Library

ContainerContainer

• Container - AppLogicContainer - AppLogic 与与 CtrlsCtrls 的粘合剂。将两者的粘合剂。将两者组合在一起。组合在一起。

• ContainerContainer 一般是一个对话框类。一般是一个对话框类。• 我最初希望我最初希望 ContainerContainer 可以规范可以规范 AppLogicAppLogic和和 CtrCtr

lsls 的粘合方式。但是没有成功。还要继续探索。的粘合方式。但是没有成功。还要继续探索。• 如果成功,理论上只要开发如果成功,理论上只要开发 AppLogicAppLogic ,和开发,和开发

独立的独立的 CtrlCtrl ,然后把,然后把 AppLogicAppLogic 、、 CtrlCtrl拖到拖到 ContContainerainer上,就完成了应用程序的开发。上,就完成了应用程序的开发。

Page 68: WINX A C++ Template GUI Library

11 )内核界面交互:基于)内核界面交互:基于 conceconceptpt• 目的:降低界面元素和内核数据的绑定代价目的:降低界面元素和内核数据的绑定代价• 这就像这就像 C++C++ 的模板,只是基于的模板,只是基于 NameName上的协议上的协议

(( conceptconcept ),不是基于),不是基于 InterfaceInterface 。。• 我希望内核和界面控件的接口是基于我希望内核和界面控件的接口是基于 conceptconcept 的,的,

不是基于不是基于 interfaceinterface 。。• 界面和内核的协议是二进制的协议,不是语法一界面和内核的协议是二进制的协议,不是语法一

级的。级的。• IDispatchIDispatch 是最佳选择是最佳选择

Page 69: WINX A C++ Template GUI Library

22 )内核界面交互:界面没有数据)内核界面交互:界面没有数据

• 数据来源是数据来源是 AppLogicAppLogic 。。• 举个例子,理论上我只要开发一个颜色选举个例子,理论上我只要开发一个颜色选

择框,就可以在任何地方使用。只要内核择框,就可以在任何地方使用。只要内核提供提供 get_Color, put_Colorget_Color, put_Color 这样的这样的 concepconceptt 。。

Page 70: WINX A C++ Template GUI Library

33 )内核界面交互:如何更新界面?)内核界面交互:如何更新界面?

• IUpdateViewsIUpdateViews– ViewsUpdaterViewsUpdater

•想象一下整个流程(图示)想象一下整个流程(图示)– 订阅事件(订阅事件( SubscibeEventSubscibeEvent ))– 产生事件(产生事件( InvalidateInvalidate ))– 引发事件(引发事件( UpdateAllViewsUpdateAllViews ))