青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

yehao's Blog

DirectUI的初步分析

最近由于項目的需要學習了一下DirectUI方面的東西,主要借鑒的是一個國外程序員寫的代碼(見引用一),看了后發現它更多的是探討一種實現的可能性和思路,和實際應用還是有距離的,不過其實現還是很有意思的。在寫此小結的時候又發現國內一個程序員將這個代碼部分移植到WINCE下的代碼(見引用二),因為平臺的差異性要完全開發一個WINCE下的實際代碼還是需要時間的。 
由于本人GUI開發做得少,工作中有關這方面的東西主要是提供思路和方法,學習DirectUI的主要目的是為了更新知識學習思路,文章中難免出現錯誤。 
 
一、核心 
 1 、CWindowWnd: 窗口對象類(窗口實例對象父類) 
 2 、CDialogBuilder: 創建控件類,分析腳本并用遞歸方式(_Parse函數)創建所有控件實例 
 3 、CPaintManagerUI: 窗口消息及圖形繪制管理器類 
 4 、CGUIRenderEngineUI: 圖形渲染引擎類,在離屏DC中生成最終顯示的圖形,可根據需要擴展多種圖形效果顯示。 
 5 、INotifyUI: 事件通知抽象類 
 6 、IMessageFilterUI: 消息過濾抽象類 
 
二、控件 
CControlUI: 控件管理抽象父類,父類INotifyUI 
 1 、button 
CButtonUI: 按鈕控件 
COptionUI: 選擇按鈕控件 
 
 2 、combox 
CSingleLinePickUI: 
CDropDownUI: 下拉控件,父類另有CContainerUI和IListOwnerUI 
 
 3 、decoration 
CTitleShadowUI: 陰影效果 
CListHeaderShadowUI 
CSeparatorLineUI 
CFadedLineUI 
 
 4 、edit 
CSingleLineEditUI: 單行編輯框控件 
CMultiLineEditUI: 多行編輯框控件 
 
 5 、label 
CLabelPanelUI: 可設置背景色和文字色的靜態標簽控件 
CGreyTextHeaderUI 
 
 6 、list 
第一種: 
CListUI: 列表控件,包含以下幾個子控件 
( 1 )CListHeaderItemUI: 列表頭 
( 2 )CListExpandElementUI: 列表項 
第二種:用法不明 
CListHeaderUI: 列表頭 
CListElementUI: 列表項,父類另有IListItemUI 
CListLabelElementUI: 列表項,父類CListElementUI 
CListTextElementUI: 列表項 
CListFooterUI: 列表尾 
 
 7 、panel 
CTextPanelUI: 父類CLabelPanelUI 
CTaskPanelUI: 
CNavigatorPanelUI: 導航面板,父類另有IListOwnerUI,包含CNavigatorButtonUI子控件 
CSearchTitlePanelUI: 
CImagePanelUI: 圖片顯示 
CWarningPanelUI: 警告提示,父類CTextPanelUI 
CPaddingPanelUI: 填充欄 
 
 8 、tab 
CTabFolderUI: 父類另有CContainerUI和IListOwnerUI 
CTabPageUI: 父類另有CContainerUI 
 
 9 、toolbar 
CToolbarUI: 工具欄,包含以下幾個子控件 
( 1 )CToolButtonUI: 圖形按鈕 
( 2 )CToolSeparatorUI: 分隔符 
( 3 )CToolGripperUI: gripper 
 
 10 、title 
CToolbarTitlePanelUI: 
 
 11 、statusbar 
CStatusbarUI: 狀態欄,父類另有CContainerUI 
 
 12 、anim 
CAnimJobUI: 動畫顯示類 
 
 13 、ActiveX 
CActiveXUI: 
 
三、容器: 
CContainerUI: 容器類,父類CControlUI和IContainerUI。可以認為容器是特殊的控件(見上面控件類關于父類的說明),其目的之一是具有容器特性的控件可以容納其它控件,這樣可以方便的實現控件的疊加;目的之二實際的窗口只有一個,對于疊加的控件必須要進行層次管理才能正確繪圖和事件分發。另外可參見引用三 
 1 、畫布: CCanvasUI(父類CContainerUI),可繪制背景色、畫線、貼圖 
CWindowCanvasUI: 父類CCanvasUI 
CControlCanvasUI: 父類CCanvasUI 
CWhiteCanvasUI: 父類CCanvasUI 
CDialogCanvasUI: 父類CCanvasUI 
CTabFolderCanvasUI: 父類CCanvasUI 
 2 、布局: 管理不同層次的控件 
CDialogLayoutUI: 父類CContainerUI 
CVerticalLayoutUI: 父類CContainerUI 
CHorizontalLayoutUI: 父類CContainerUI 
CTileLayoutUI: 父類CContainerUI 
 
四、通用 
 1 、script 
CMarkup 
CMarkupNode 
 
 2 、language 
CUIUtility 
 
 3 、multi - thread 
CriticalSection 
AutoCriticalSection 
CMutex 
CAutoMutex 
CEvent 
CAutoEvent 
CManualEvent 
 
五、主要數據成員 
 1 、CPaintManagerUI 
CControlUI * m_pRoot: 如果控件是疊加的則存放最下層的控件對象,否則存放第一個創建的控件對象 
CControlUI * m_pFocus: 存放獲得焦點的控件對象指針 
CControlUI * m_pEventHover: 存放當前有鼠標移進移出事件的控件對象指針 
CControlUI * m_pEventClick: 存放當前有點擊事件的控件對象指針 
CControlUI * m_pEventKey: 存放當前有按鍵事件的控件對象指針 
CStdPtrArray m_aNotifiers: 記錄所有需要事件通知的窗口,根據窗口名稱調用相應的消息處理函數 
CStdPtrArray m_aNameHash: 保存控件對象指針hash表(用控件名稱生成hash值) 
CStdPtrArray m_aPostPaint: panel的fade效果 
CStdPtrArray m_aMessageFilters: 保存需要進行消息過濾的控件或功能(如動畫類) 
CStdPtrArray m_aDelayedCleanup: 
CStdPtrArray m_aPreMessages: 預處理消息 
HWND m_hWndPaint: 控件布局窗口句柄 
HDC m_hDcPaint: 控件布局窗口設備DC 
HDC m_hDcOffscreen: 離屏內存DC 
HBITMAP m_hbmpOffscreen: 離屏內存DC相關聯HBITMAP 
 
 2 、CControlUI 
CPaintManagerUI * m_pManager: 窗口或控件繪圖及消息管理器 
CControlUI * m_pParent: 邏輯上的父窗口(控件)對象指針 
CStdString m_sName: 控件標識 
CStdString m_sText: 控件顯示標題或顯示腳本字符串 
CStdString m_sToolTip: 控制的Tip信息 
 
 3 、CContainerUI 
CStdPtrArray m_items: 同一層的控件對象或控件對象的子對象,例如canvas上放置的按鈕、combox由edit和list兩個子對象組成,其它還有tab等。具體見CDropDownUI、CTabFolderUI、CNavigatorPanelUI三個類定義 
 
 4 、CDialogLayoutUI 
CStdValArray m_aModes: 用于存放在Layout上絕對坐標轉成相對坐標(CDialogLayoutUI::RecalcArea)的控件對象(指針、大小、模式),目的是否為了讓布局上的控件隨布局變化而變化,能夠正確繪圖??? 
 
六、控件屬性 
待完成 
 
七、腳本例子 
 < Dialog > 
 < WindowCanvas pos = \ " 0,0,600,800\ " > 
 < DialogLayout pos = \ " 0,0,600,800\ " > 
 < Button pos = \ " 390, 30, 490, 58\ " text = \ " OK\ " name = \ " ok\ " /> 
 </ DialogLayout > 
 </ WindowCanvas > 
 </ Dialog > 
 
八、繪圖及事件處理 
 1 、繪圖 
STEP01. CWindowWnd::__WndProc: 主窗口程序 
STEP02. pThis -> HandleMessage: pThis是布局窗口對象指針,并與布局窗口綁定(SetWindowLongPtr) 
STEP03. m_pm.MessageHandler: m_pm為CPaintManagerUI唯一實例對象 
STEP04. CPaintManagerUI::MessageHandler: 處理WM_PAINT 
STEP05. m_pRoot -> DoPaint: m_pRoot為最下層的控件對象,在本例中為CWindowCanvasUI控件(對應腳本中的WindowCanvas) 
STEP06. CCanvasUI::DoPaint: 往畫布上繪制背景色、邊角弧形、水印等。 
STEP07. CContainerUI::DoPaint: 在布局窗口(對應腳本中DialogLayout)畫所有控件(控件實例對象保存在m_items中) 
STEP08. pControl -> DoPaint: pControl為控件對象實例之一,利用多態性來調用不同控件的繪圖方法 
STEP09. CButtonUI::DoPaint: 按鈕(對應腳本中Button)繪圖方法,有下面兩種方法 
i)文字方法: CGUIRenderEngineUI::DPaintButton 
ii)圖片方法: CGUIRenderEngineUI::DoPaintBitmap 
STEP10. 新一輪消息循環 
 
 2 、事件 
STEP01. CWindowWnd::__WndProc: 
STEP02. pThis -> HandleMessage: 
STEP03. m_pm.MessageHandler: 
STEP04. CPaintManagerUI::MessageHandler: 處理WM_LBUTTONDOWN 
STEP05. CPaintManagerUI::FindControl: 根據鼠標坐標查找相應控件對象 
STEP06. m_pRoot -> FindControl: 
STEP07. CContainerUI::FindControl: 在布局窗口上查找相應控件對象 
STEP08. CControlUI::FindControl: 在m_items中查找相對應的控件對象 
STEP09. pControl -> Event: pControl為控件對象實例之一,利用多態性來調用不同控件的事件方法 
STEP10. CPaintManagerUI::MessageHandler: 處理WM_LBUTTONUP 
STEP11. m_pEventClick -> Event: 利用多態性來調用不同控件的事件方法(m_pEventClick說明見 " 主要數據成員 " ) 
STEP12. CButtonUI::Event: 按鈕(對應腳本中Button)事件方法 
STEP13. CButtonUI::Activate: 
STEP14. m_pManager -> SendNotify: 傳遞控件對象指針和觸發事件(文本方式) 
STEP15. CPaintManagerUI::SendNotify: 注意以下兩點實現是完成控制和業務分離的關鍵 
i)利用重載特性調用注冊的監聽對象(窗口)的消息處理函數Notify(監聽對象保存在m_aNotifiers中) 
 for ( int i = 0 ; i < m_aNotifiers.GetSize(); ++ i ) 
  { 
 static_cast < INotifyUI *> (m_aNotifiers[i]) -> Notify(Msg); 

ii)布局窗口CStartPageWnd的消息處理,宏定義展開后實際就是重載的Notify函數 
DIRECT_BEGIN_NOTIFYMAP(CStartPageWnd) 
 PROCESS_BUTTON_CLICK(_T( " ok " ),OnOk) 
 。。。 
DIRECT_END_NOTIFYMAP(CStandardPageWnd) 
STEP16. CStartPageWnd::OnOk: 控件消息處理函數,此處可以加入具體的事務邏輯處理 
STEP17. 新一輪消息循環 
 
 3 、消息定義(文本) 
 " click " 、 " changed " 、 " link " 、 " browse " 、 " itemclick " 、 " itemselect " 、 " dropdown " 、 " itemactivate " 、 " headerdragging " 、 " headerclick " 、 " headerdragged " 、 " itemexpand " 、 " itemcollapse " 、 " windowinit " 、 " killfocus " 、 " setfocus " 、 " timer " 
 
九、疑問 
 1 、Edit、Combox的下拉列表部分、ScrollBar、Tooltip控件是創建的實際窗口,這個與DirectUI思路還是有差別的 
 2 、實例中有創建一個不進行消息處理的窗口(CFrameWindowWnd),然后又創建了一個窗口(CStandardPageWnd)用于具體的控件布局。但是我用一個窗口也能實現,原作者為什么這樣還不清楚 
 3 、控件是用文本形式來做標識的,消息類型是文本形式,是否改成數值型比較好 
 
十、引用 
引用一: http: // www.viksoe.dk/code/windowless1.htm 
 引用二: http: // directui.googlecode.com/ 
 引用三: http: // www.cnblogs.com/cutepig/archive/2010/06/14/1758204.html

handless UI (direct UI) 
http: // www.viksoe.dk/code/windowless1.htm 
 
viksoe的代碼很好,這個可以被運用到商業上。 
個人覺得這個框架比mfc甚至wtl的在構架、思想上高N倍。 
首先 viksoe采用layout機制動態計算各子窗口的坐標位置,自適應屏幕大小的變化。而MFC要求子窗口的坐標位置硬編碼,結果要適應不同分辨率的屏幕 非常困難。GTK + 在窗口布局時分為兩個階段,第一個階段父窗口先詢問子窗口的最佳大小,第二個階段父窗口根據自己的大小計算子窗口的實際大小,子窗口根 據實際大小進行調整。 
 
其次viksoe采用容器機制來合理分離控件的職責,MFC沒有容器這個概念,很難實現遞歸組合。viksoe中差 不多所有控件都是容器,都可以容納其它任何控件,而MFC只有頂層窗口才是容器,可以容納其它子控件。容器這個概念對代碼重用的影響非常之大,這里舉兩個 例子:其一是帶圖片的按鈕(BitmapButton),在viksoe中它就是CCanvasUI類和CButtonUI的組合,而在MFC中,圖片和 文字都要自己繪制。前者的CCanvasUI類和CButtonUI可以在很多地方重用,而后都的繪制代碼和事件處理代碼只有自己才能使用。在MFC中, 即使只是實現一個不同外觀的列表框,你都要采用自繪的方式,代碼重用非常困難,向列表框中加入其它控件就更麻煩了,要使用一些非同尋常的手段不可。 
 
另 外說句在驅動里畫gui,這個和普通gui有所不同,上面說的directUI還是用到了Windows的消息,而驅動里只能自己hook key 、mouse 中斷。然后實現各種消息的派發。但這樣對兼容usb接口的鍵盤很成問題。這實際相當于自己實現了win32k里面的內容。而驅動里面畫圖其實不過是自己寫 顯存。但又有很多兼容問題要解決,別的不說,每種顯卡的顯存位置就要自己實現,所以softICE直接做不下去了,syser在部分機器上也得靠 directX來獲取顯存。 
我的blog hi.baidu.com / weolar 
 
 
 
HTMLayoutSDK 有時間看下這個,比較好用,用spy ++ 去抓,也抓不到任何窗口,而且簡單.htm文件描述,做界面那叫一個方便,效果也很不錯,關鍵是免費,現在我都轉這個做界面了. 
 
 
 
我現在正在研究viksoe的這個DirectUI庫,把它改寫成wchar_t的了,并把類庫中使用的CWindowWnd換成了atl / wtl的 CWindowImpl, 我準備好好的在這個DirectUI庫的基礎上把這個庫進行進一步的開發,做一個好用的強大的DirectUI庫,有興趣一塊開發的可以聯系我,放到 Google code上,大家一塊做 ! 
 
davidxifeng@gmail.com 
csdn上留言也行.不過不會經常查看

posted on 2013-10-30 12:21 厚積薄發 閱讀(717) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性欧美大战久久久久久久免费观看 | 欧美日韩一区二区国产| 亚洲电影免费在线| 欧美不卡视频一区发布| 免费成人高清| 一本色道久久综合亚洲精品婷婷| 亚洲国产精品va在看黑人| 欧美成年人视频| 亚洲在线免费| 久久国产精品99国产精| 亚洲国产一区二区三区在线播 | 一本久道久久久| av72成人在线| 国产精品一页| 免费成人高清在线视频| 欧美精品色综合| 欧美一区二区三区免费视| 久久精品国产久精国产一老狼| 最新国产の精品合集bt伙计| 亚洲精品久久久久久久久久久| 国产精品少妇自拍| 美女任你摸久久| 国产精品草草| 嫩草影视亚洲| 国产精品亚洲网站| 欧美国产成人精品| 国产精品久久久久久久一区探花| 久久亚洲二区| 国产精品高精视频免费| 欧美不卡视频| 国产精品自拍在线| 亚洲区第一页| 黄色工厂这里只有精品| 日韩视频在线一区二区| 好吊妞**欧美| 亚洲午夜激情免费视频| 亚洲三级国产| 久久精品123| 亚洲欧美清纯在线制服| 葵司免费一区二区三区四区五区| 亚洲欧美精品中文字幕在线| 美日韩精品免费观看视频| 欧美一区免费| 欧美三级午夜理伦三级中视频| 久久免费国产精品1| 国产精品高潮呻吟| 亚洲精品一区二区三区在线观看| 激情综合在线| 欧美一区免费视频| 亚洲欧美日韩精品一区二区| 欧美精品999| 亚洲国产成人av在线| 黄色精品一区二区| 午夜性色一区二区三区免费视频| 亚洲一区二区毛片| 欧美区一区二区三区| 欧美激情aⅴ一区二区三区| 国内精品**久久毛片app| 亚洲一级黄色av| 亚洲欧美另类在线| 国产精品久久久久一区| 一二三区精品| 亚洲欧美国产毛片在线| 国产精品九九| 国产精品99久久久久久宅男| 亚洲性线免费观看视频成熟| 欧美日韩一区二区三区在线| 99精品国产99久久久久久福利| 一本色道久久88精品综合| 欧美精品一区二区久久婷婷| 亚洲日本成人| 一本色道88久久加勒比精品| 欧美日韩国产一中文字不卡| 亚洲精品三级| 亚洲先锋成人| 国产欧美一区二区三区久久人妖| 亚洲欧美影音先锋| 久久天天躁狠狠躁夜夜爽蜜月| 国模精品娜娜一二三区| 久久婷婷综合激情| 欧美国产日韩一区二区在线观看| 亚洲人成网站精品片在线观看| 欧美成人一品| 在线亚洲成人| 久久―日本道色综合久久| 在线日本成人| 欧美日韩亚洲一区二| 亚洲一区二区三区高清不卡| 久久国产免费看| 亚洲电影在线观看| 欧美日韩国产精品一区| 亚洲一卡二卡三卡四卡五卡| 久久久久久电影| 亚洲精品免费一二三区| 欧美天堂亚洲电影院在线观看 | 日韩亚洲视频| 久久精品国产精品亚洲综合| 亚洲第一精品在线| 欧美日韩伦理在线| 性欧美大战久久久久久久久| 欧美国产乱视频| 亚洲综合视频一区| 尤物九九久久国产精品的特点| 你懂的视频一区二区| 亚洲一区二区三区四区在线观看 | 牛牛精品成人免费视频| 99re在线精品| 激情av一区二区| 欧美日韩妖精视频| 久久嫩草精品久久久久| 亚洲一区二区三区免费观看| 欧美成人免费网站| 欧美一区亚洲一区| 日韩午夜三级在线| 狠狠综合久久av一区二区小说| 欧美精品v日韩精品v国产精品| 午夜久久资源| 一本一本a久久| 亚洲国产精品一区| 久久久久免费视频| 午夜精品免费视频| 99精品国产热久久91蜜凸| 国产一区二区三区最好精华液| 欧美视频二区36p| 欧美国产日韩一区二区在线观看| 久久精品成人一区二区三区| 亚洲一区二区三区精品在线观看 | 亚洲国产日本| 免费观看在线综合色| 久久av一区二区| 亚洲一区在线直播| 一本色道久久99精品综合| 亚洲激情成人在线| 精品白丝av| 韩国v欧美v日本v亚洲v| 国产日韩在线亚洲字幕中文| 国产精品二区在线| 欧美午夜宅男影院| 欧美视频成人| 欧美日韩在线综合| 欧美视频在线观看 亚洲欧| 欧美精品一区在线播放| 欧美日本精品| 国产精品99一区二区| 欧美午夜视频一区二区| 欧美性猛片xxxx免费看久爱| 欧美日韩另类在线| 国产精品v日韩精品| 国产精品美女一区二区| 国产精品免费看片| 国产视频精品va久久久久久| 国产亚洲成av人片在线观看桃| 国产一区二区三区的电影| 国产一区二区精品丝袜| 国内外成人在线视频| 黄色在线成人| 亚洲精品久久久久久下一站| 99riav国产精品| 亚洲中午字幕| 久久精品理论片| 麻豆久久精品| 亚洲人成欧美中文字幕| 亚洲天堂黄色| 欧美一区国产一区| 免费观看一区| 国产精品av免费在线观看| 国产亚洲va综合人人澡精品| 在线播放豆国产99亚洲| 亚洲麻豆国产自偷在线| 亚洲在线视频观看| 久久精品国产一区二区电影| 免费在线日韩av| av72成人在线| 欧美在线视屏| 欧美区二区三区| 国产亚洲一区二区在线观看| 亚洲电影天堂av| 亚洲制服欧美中文字幕中文字幕| 久久久美女艺术照精彩视频福利播放 | 国产精品影院在线观看| 黄色日韩网站视频| 妖精成人www高清在线观看| 欧美一区二区在线免费观看| 欧美成人免费全部观看天天性色| 99re国产精品| 久久久免费精品视频| 欧美性猛片xxxx免费看久爱 | 国产一区二区三区高清| 日韩午夜在线播放| 久久免费观看视频| 日韩午夜电影av| 久久影院亚洲| 国产日韩精品一区二区浪潮av| 最新国产の精品合集bt伙计| 欧美在线www| 99re热这里只有精品视频| 久久久人成影片一区二区三区观看| 欧美午夜电影网| 亚洲国产小视频| 久久亚洲精品网站|