其他分享
首页 > 其他分享> > 山东大学软件工程应用与实践——WeaselUI(五)

山东大学软件工程应用与实践——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