第一章 第四小節在duilib中WindowImplBase基類(一)

  在第一小節部分,給讀者介紹了duilib,它是一個DirectUI界面控件。換而言之,它採用繪製的方法在界面上直接繪製各種子控件,那既然要繪製,它本身也是不能脫離操作系統平臺的,而windows的基本UI部件就是窗口,所以duilib的繪製方法的對象,自然也是窗口。接下來給讀者分析,在duilib中,這個繪製對象WindowImplBase類。首先展示部分源碼,如下所示:

class UILIB_API WindowImplBase
        : public CWindowWnd
        , public CNotifyPump
        , public INotifyUI
        , public IMessageFilterUI
        , public IDialogBuilderCallback
        , public IQueryControlText
    {
    public:
        WindowImplBase() {
            m_ResourceType = UILIB_FILE; // UILIB_RESOURCE; // 
            m_SkilFolder = TEXT("");
            m_SkilFile = TEXT("none.xml");
            m_WindowsClassName = TEXT("WindowImplBase");
            memset(&m_ParentRect, 0, sizeof(RECT));
        };
        virtual ~WindowImplBase(){};
        // 只需主窗口重寫(初始化資源與多語言接口)
        virtual void InitResource(){};
        // 每個窗口都可以重寫
        virtual void InitWindow(){};
        virtual void OnFinalMessage( HWND hWnd );
        virtual void Notify(TNotifyUI& msg);

        virtual void OnPrepare() { };  //windowinit消息 時調用

        CDuiString m_SkilFolder, m_SkilFile, m_WindowsClassName; // 資源路勁,以及文件名
        UILIB_RESTYPE m_ResourceType;
        RECT m_ParentRect; //指定初始化移動到的區域大小

        //用於判斷指定控件是否選中,不存在則返回FALSE。COptionUI
        BOOL IsOptionChecked(CDuiString contorlName);
        //設置Option控件的選擇狀態。COptionUI
        void SetOptionChecked(CDuiString contorlName, bool flag = true);

        //CheckBoxUI
        BOOL IsCheckBoxChecked(CDuiString contorlName);
        void SetCheckBoxChecked(CDuiString contorlName, bool flag = true);

        //刪除控件中所有的子元素。 CComboBoxUI、ListUI
        void ListContorlRemoveAll(CDuiString contorlName);

        //設置Combo控件的子元素  CComboBoxUI
        void ComboBoxAdd(CDuiString contorlName, CDuiString addText);
        void ComboBoxDel(CDuiString contorlName, CDuiString delText);
        void ComboBoxClear(CDuiString contorlName);
        //設置Combo控件選中子項 CComboBoxUI
        void ComboBoxSelect(CDuiString contorlName, CDuiString selectText);
        void ComboBoxSelect(CDuiString contorlName, UINT_PTR tag);

        //兩個控件可見與不可見狀態互換
        void ChangeControlState(CDuiString st1, CDuiString st2);

        //設置控件是否可見
        void SetControlVisible(CDuiString contorlName, bool flag = true);
        //設置控件是否可用
        void SetControlEnabled(CDuiString contorlName, bool flag = true);

        //獲取控件的text
        CDuiString GetControlText(CDuiString contorlName);
        //設置控件的text
        void SetControlText(CDuiString contorlName, CDuiString contorlText);

        virtual void SetBKColor2(DWORD dwBkColor2);
        virtual void SetBKColor3(DWORD dwBkColor3);
        virtual void SetBkColor(DWORD dwBackColor);

        virtual DWORD GetBkColor3() const;
        virtual DWORD GetBkColor2() const;
        virtual DWORD GetBkColor() const;
        virtual void SetBkImage(CDuiString strBkImage);
        virtual LPCTSTR GetBkImage();
        CControlUI * GetBkControlUI();

        void SetTrans(int nValue);


        DUI_DECLARE_MESSAGE_MAP()
        virtual void OnClick(TNotifyUI& msg);
        virtual BOOL IsInStaticControl(CControlUI *pControl);

    protected:
        virtual CDuiString GetSkinFile() { 
            return m_SkilFile; 
        };
        virtual CDuiString GetSkinFolder() { 
            return m_SkilFolder; };
        virtual UILIB_RESTYPE GetResourceType() const {
            return m_ResourceType;
        }

        virtual CDuiString GetZIPFileName() const {
            return _T("");
        }
        virtual LPCTSTR GetResourceID() const {
            return _T("");
        }

        virtual LPCTSTR GetWindowClassName(void) const = 0 ;
        virtual LPCTSTR GetManagerName() { return NULL; }
        virtual LRESULT ResponseDefaultKeyEvent(WPARAM wParam);
        CPaintManagerUI m_pm;

    public:
        virtual UINT GetClassStyle() const;
        virtual CControlUI* CreateControl(LPCTSTR pstrClass);
        virtual LPCTSTR QueryControlText(LPCTSTR lpstrId, LPCTSTR lpstrType);

        virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/);
        virtual LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);

#if defined(WIN32) && !defined(UNDER_CE)
        virtual LRESULT OnNcActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnNcPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
        virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnMouseWheel(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
#endif
        virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
        virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
        virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
        virtual LONG GetStyle();
    };
}

  這個類首先繼承至CWindowWnd和CNotifyPump兩個類,以及INotifyUI、 IMessageFilterUI、 IDialogBuilderCallback和IQueryControlText四個接口。
從其中,可以看出關鍵的幾個參數,如下所示:

        CDuiString m_SkilFolder, m_SkilFile, m_WindowsClassName; // 資源路勁,以及文件名
        UILIB_RESTYPE m_ResourceType;
        RECT m_ParentRect; //指定初始化移動到的區域大小

  m_SkilFolder是繪圖所需的圖片等資源所在文件夾,m_SkilFile是繪圖所需的XML文件全名,m_WindowsClassName是主窗口的類名,m_ResourceType是資源的形式,如下所示:

    enum UILIB_RESTYPE
    {
        UILIB_FILE=1,        // 來自磁盤文件
        UILIB_ZIP,            // 來自磁盤zip壓縮包
        UILIB_RESOURCE,        // 來自資源
        UILIB_ZIPRESOURCE,    // 來自資源的zip壓縮包
    };

  支持註釋所寫的那幾種形式。這是主窗口的類對象,然其它部分子功能在父類和父接口中實現和約定。接下來,我們從兩個父類和四個接口的角度,闡述這個主窗口的其它功能。最後再回到該主窗口,做一個小節。


  歡迎光臨知了軟件開發網絡平臺,本公司定製開發各類軟件,主要方向爲桌面專業軟件開發和插件定製開發,桌面軟件主要包括文字圖形識別類軟件,信息管理類軟件,3D打印類軟件,視頻類軟件以及其它涉及專業的各類圖形圖像處理軟件。插件包含AE插件,AI插件,PS插件,PDF插件,3DMAX插件以及Word,Excel等Office插件開發。詳情請諮詢,微信QQ:312117271,手機:18928899728,郵箱: [email protected].
公司網址:http://www.zhiliaos.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章