山东大学软件工程应用与实践——WeaselUI(五)
作者:互联网
2021SC@SDUSC
前两篇分析完WeaselPanel.h引用的头文件,这一篇终于可以来看一下WeaselPanel.h以及WeaselPanel.cpp的具体内容。
typedef CWinTraits<WS_POPUP|WS_CLIPSIBLINGS|WS_DISABLED, WS_EX_TOOLWINDOW|WS_EX_TOPMOST> CWeaselPanelTraits;
class WeaselPanel :
public CWindowImpl<WeaselPanel, CWindow, CWeaselPanelTraits>,
CDoubleBufferImpl<WeaselPanel>
{
public:
BEGIN_MSG_MAP(WeaselPanel)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
CHAIN_MSG_MAP(CDoubleBufferImpl<WeaselPanel>)
END_MSG_MAP()
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
void CloseDialog(int nVal);
WeaselPanel(weasel::UI &ui);
~WeaselPanel();
void MoveTo(RECT const& rc);
void Refresh();
void DoPaint(CDCHandle dc);
private:
void _CreateLayout();
void _ResizeWindow();
void _RepositionWindow();
bool _DrawPreedit(weasel::Text const& text, CDCHandle dc, CRect const& rc);
bool _DrawCandidates(CDCHandle dc);
void _HighlightText(CDCHandle dc, CRect rc, COLORREF color);
void _TextOut(CDCHandle dc, int x, int y, CRect const& rc, LPCWSTR psz, int cch);
weasel::Layout *m_layout;
weasel::Context &m_ctx;
weasel::Status &m_status;
weasel::UIStyle &m_style;
CRect m_inputPos;
CIcon m_iconDisabled;
CIcon m_iconEnabled;
CIcon m_iconAlpha;
};
public CWindowImpl<WeaselPanel, CWindow, CWeaselPanelTraits>
ATL中的CWindowImpl模板类
- 首先看一下这个模板类的声明
template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl;
从声明中可以看出,这个类有两个默认参数。其中,TBase是默认的窗口基类,这个CWindow简单封装了HWND,并且封装了几乎所有的Use32 APIs中以HWND为第一个参数的接口。CWindow提供一个共有的成员m_hWnd,可以直接处理HWND,也提供了一个operator HWND(),可以直接是CWindow作为需要HWND对象的函数参数。CWindow不同于MFC中的 CWnd。CWindow易于创建的,它不提供像MFC中的HWND到CWnd的对象关系。当CWindow对象超出作用域时,它被销毁,但是它关联的实际窗口不会被销毁。因此不需要detach你创建的临时的CWindow对象。TWinTraits 是默认的窗口特征。
- 定义的代码
template <class T, class TBase /* = CWindow */, class TWinTraits /* = CControlWinTraits */>
class ATL_NO_VTABLE CWindowImpl :
public CWindowImplBaseT< TBase, TWinTraits >
这里又继承了CWindowImplBaseT模板类
template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImplBaseT :
public CWindowImplRoot< TBase >
最终继承了CWindowImplRoot模板类
template <class TBase /* = CWindow */>
class ATL_NO_VTABLE CWindowImplRoot :
public TBase,
public CMessageMap
CWindowImplRoot类继承了一个TBase和CMessageMap。TBase默认就是CWindow类。当然,这个TBase基类也可以使用自己封装的,但一般情况下使用CWindow就可以了。
这个类允许你创建一个新的窗口或使一个存在的窗口变成一个子类。CWindowImpl窗口程序使用消息映射来导向详细到响应的句柄。
T:你的类,继承自CWindowImpl
TBase:你类的基类,默认的类是CWindow
TWinTrait:一个定义你窗口风格的特性类。默认是CControlWinTraits
public CDoubleBufferImpl<WeaselPanel>
WTL 双缓冲(double buffer)绘图
WTL中有两个Mix-in类: CDoubleBufferImpl和CDoubleBufferWindowImpl,用于创建双缓冲绘图窗口。在WTL中使用Vista提供的这一功能非常容易,最新的WTL库中提供了CBufferedPaintImpl和CBufferedPaintWindowImpl两个类,这两个类的用法和前面提到的两个WTL自带的双缓冲类几乎一样。区别仅仅是所重载的DoPaint()函数的参数稍有不同。
标签:WeaselUI,TBase,WeaselPanel,void,CWindowImpl,软件工程,CWindow,山东大学,public 来源: https://blog.csdn.net/m0_51158844/article/details/121449248