ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

山东大学软件工程应用与实践——WeaselUI(五)

2021-11-21 09:05:07  阅读:171  来源: 互联网

标签:WeaselUI TBase WeaselPanel void CWindowImpl 软件工程 CWindow 山东大学 public


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有