文章目录
1.WindowImplBase基类
- 1.WindowImplBase基类
- 2.作者答疑
在第一小节部分,给读者介绍了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压缩包
};
支持注释所写的那几种形式。这是主窗口的类对象,然其它部分子功能在父类和父接口中实现和约定。接下来,我们从两个父类和四个接口的角度,阐述这个主窗口的其它功能。最后再回到该主窗口,做一个小节。
2.作者答疑如有疑问,请留言。