<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [duilib界面庫](https://github.com/duilib/duilib) 1.問題 * DuiLib vs2010編譯 無法打開源文件stdafx 項目屬性–>配置屬性–>C\C++–>常規–>附加包含目錄–>添加$(ProjectDir)路徑 這是因為在低版本的編譯器中,需要添加這部分,比如vc6.0到vs2008,而在vs2010以上版本的編譯器中如果出現了這種報錯,就查看一下屬性->c/c++->預編譯頭->預編譯頭文件,其中是否包含了”stdafx.h”文件,如果有注釋掉上述代碼就好,不會對程序造成影響。 一、核心 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
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看