自己实现WTL的CWindowWnd

首先对接口进行声明,包括重要的几个属性和方法。窗体生命周期相关的方法有如下几个

1.预处理

      预处理阶段,需要设置创建窗体所需要的一些前提条件,比如类名、窗体样式等。考虑到CWindowWnd会被其他类继承产生新的窗体,需要将相关函数声明为虚函数。本例当中有GetWindowClassName、GetSuperClassName和GetClassStyle三个相关函数。其中superxxx用在cwindowwnd作控件类时。

      创建窗体时需要当前的HINSTANCE,这个也在预处理阶段设置。

2.创建

      创建阶段,会根据当前类的状态,进行类注册(RegisterClass),注意由于本类可能当作一个控件使用,注册时需要区分,消息处理函数分为两个__WindProc和__ControlProc,分别对应本类为窗体时和本类为控件时。

3.消息处理

      消息处理阶段,需要注意如何正确保留当前上下文环境,说白了就是如何在每次消息处理时获取当前类指针。可以采用SetWindowLongPtr或者SetProp方法来存储当前类指类。在需要使用时,通过GetWindowLongPtr或者GetProp函数来取得。

      在消息处理函数当中需要调用消息处理函数HandleMessage,此函数为虚函数,可由子类来重写。

4.展示

     展示阶段,将创建的窗体通过ShowWindow显示出现即可。本类当中实现了两种显示方式ShowWindow和ShowModal,从名字上可以看出,一种是非模态,一种是模态。非模态只需要将窗体Show出来即可,函数会返回。Domal方式会屏蔽父窗体,然后接口并转发消息,直到遇到退出消息。

5.关闭及销毁

    窗体关闭时需要注意恢复现场和正常释放资源。


以下是头文件

class CWindowWnd
{
public:
	CWindowWnd();
	
	HWND GetHWND() const;
	operator HWND() const;

	HINSTANCE GetInstance();
	void SetInstance(HINSTANCE hinst);

	bool RegisterWindowClass();
	bool RegisterSuperClass();

	HWND Create(HWND hwndParent,LPCTSTR pstrName,DWORD dwSytle,DWORD dwExStyle,const RECT rc,HMENU hMenu=NULL);
	HWND Create(HWND hwndParent,LPCTSTR pstrName,DWORD dwSytle,DWORD dwExStyle,int x=CW_USEDEFAULT,int y=CW_USEDEFAULT,int cx=CW_USEDEFAULT,int cy=CW_USEDEFAULT,HMENU hMenu=NULL);
	
	HWND SubClass(HWND hWnd);
	void UnsubClass();
	void ShowWindow(bool bShow=true,bool bTakeFocus=true);
	bool ShowModal();
	void Close();
	void CenterWindow();
	void SetIcon(UINT nRes);

	LRESULT SendMessage(UINT uMsg,WPARAM wParam=0,LPARAM lParam=0L);
	LRESULT PostMessage(UINT Msg, WPARAM wParam=0,LPARAM lParam=0L);
	void ResizeClient(int cx=-1,int cy=-1);

protected:
	virtual LPCTSTR GetWindowClassName() const =0;
	virtual LPCTSTR GetSuperClassName() const;
	virtual UINT GetClassStyle() const;
	virtual LRESULT HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam);
	virtual void OnFinalMessage(HWND hWnd);

	static LRESULT CALLBACK __WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
	static LRESULT CALLBACK __ControlProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

protected:
	HWND m_hWnd;
	WNDPROC m_oldWndProc;
	bool m_bSubclassed;
	HINSTANCE m_hInstance;

};


你可能感兴趣的:(GUI)