在第一小節部分,給讀者介紹了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