/*------------------------------------------------------------------------------*\
 =============================
   模块名称: WndX.h
 =============================

 [目的]
 
      当我刚开始用VC编程的时候，VC+MFC是我的主要开发手段。在开发过程中，我越来越
   发觉，MFC太复杂，而且速度又慢，虽然它在某些方面简化了Windows编程，但综合考虑其
   它一些方面的问题，比如说控制的深入性等发面，MFC显然有些力不从新，我还觉得MFC把
   WINAPI封装得太严实了，很多细节都被隐藏了。

      现在我一直用SDK，我喜欢SDK，虽然它被看来很麻烦。

      我还没用写过什么大程序（大概超过10000行的就算大程序了吧），但是我已经发现代
   码封装的必要性，SDK虽好，我总不能通篇的回调函数和事件响应函数吧。为此我决定写
   一个我自己的窗口封装类，就象MFC中的CWnd一样，但首先应该明白的是，我的窗口封装类
   只是MFC中窗口类的简化，而不是重复。有些人或许会说，微软的MFC不错啊，我已经说过，
   MFC太慢，我需要的是一个快速的窗口封装类，不要封得太严实。象CWnd类中的一些对窗口
   操作的函数，如GetWindowText之类的，根本没有必要去封装，多写个句柄真有那么烦吗？
      
     
     	  
 [描述]

	  为了封装对窗口的操作，我需要一套组织模式和一组额外类，为了这些，我已经花了很
   多时间、想了很多办法。最后我选择了该模块中的方案。模块中有一个CWndMgr类，看
   表面意思好象觉得它的作用很大，其实不然，在不断的修改中，它的作用已经和我的本意
   不符了，现在，它的唯一作用是：当窗口创建时在其中登记一下，当窗口接收到第一个消
   息的时候就删掉。CWndX和MFC中的CWnd类似，它实现了最基本窗口的创建等功能，所有窗
   口都由此派生。CWndX比较抽象，一般由它派生类，而不直接由此创建对象。
     
   注意!!:

	 有几个很重要的全局函数和全局变量，这对外部是不公开的，不允许对这些对象直接访
   问。
     
	  
 [用法]
   
   CWndX类比较抽象,请不要直接用它创建对象,你可以从它派生一个类来扩充它的功能.
     
	 1.如何派生一个类
	    
		每个学过C++的人都知道,class YourClass:plublic CWndX
	 
	 2.如何响应窗口消息
	    
		首先,在你派生得到的类中,一般来说应该有一个形为
		LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
		的虚函数,这是消息的入口

	  如果你用SDK写过程序,那么这将变得很简单,用一个switch语句就可以搞定.在你派
	生出的类中,应该有一个WndProc的虚函数,这个函数是WINDOWS消息的入口,就相当于
	SDK中的窗口过程函数.在这个函数中,你用一个switch来获得你想要的消息,并定义一
	系列响应的函数	    
	 
 [依赖性]
	
	  CHash

 [修改记录]
 
  版本:    1.01.01
  日期:    01-9-19         
  作者:    Brant Q
  备注:

       这个模块能工作了,而且工作得不错,我用它创建了几个窗口,还用它将一个基于MFC的
	模块改写了,基本符合要求.
	   目前对外只有一个CWndX类,一个CEditX类,和一个CDialogX类,以后如还要用到一些基
	本的控件或窗口,将临时扩充此模块.

  -----------------------------------
  版本:    1.01.02
  日期:    01-9-24
  作者:    Brant Q
  备注:

      加入了菜单类CMenuX

	  修正了好多BUG,下面是主要的两个
	  1.在多线程环境下,有可能出现CWndMgr中访问争夺                 --已修正
	  2.窗口无法收到WM_CREATE及其之前的消息                        --已修正
	  
  -----------------------------------
  版本:   1.01.02
  日期:   01-10-12
  作者:   Brant Q
  备注:
      
	  原先是用普通线性链表存储窗口对象的,现在改用hash表,由于只有当窗口创建时才涉及
	到Hash表的访问,因此性能没有明显提高.

 [版权]
 
   2000-2002  115软件工厂  版权所有
                                              
\*------------------------------------------------------------------------------*/
#ifndef _WNDX_H_
#define _WNDX_H_

#include <Windows.h>
#include <commctrl.h>
#include "GDIX.h"
#include "Hash.h"



#define WND_OBJ_ID         "@"    //窗口对象标识
#define WND_OLD_PROC       "~"    //旧窗口过程

class CWndMgr;                   //窗口管理类
class CObjectChain;              //窗口对象表

class CWndX;                   //窗口类(基础类)
extern HINSTANCE hInstX;       //程序实例句柄


//负责消息派送
LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

//消息预处理
BOOL PreTranslateMessageX(MSG* pMsg);

//初始化X系统
void InitXSystem(HINSTANCE hInst);


///////////////////////////////////////////////////////////////////
//CWndX
class CWndX
{
protected:
	HWND m_hWnd;//窗口句柄

public:	
	
	CWndX();    
	virtual ~CWndX();
	
	void operator =(HWND hWnd);
	operator HWND() const;
	HWND GetHwnd() const;

	//创建窗口，支持扩展风格
	virtual BOOL Create(DWORD dwExStyle,LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,
				   const RECT& rect,HWND hParentWnd,HMENU hMenu,LPVOID lpParam=NULL);
	
	

	BOOL Attach(HWND hWnd);
	HWND Detach();

	friend class CWndMgr;
	friend class CObjectChain;
	friend LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
	friend BOOL PreTranslateMessageX(MSG* pMsg);

protected:
		
	WNDPROC m_OldProc;//旧窗口句柄

	virtual void OnNcDestroy();
	virtual BOOL PreTranslateMessage(MSG* pMsg);

	//窗口过程
	virtual LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
	
private:	

};
/////////////////////////////////////////////////////
//CWndMgr
class CWndMgr
{
public:
	
	CWndMgr();	
	virtual ~CWndMgr();

	BOOL RemoveObject(CWndX* pWndObj);
	BOOL AddObject(CWndX* pWndObj);
	
	friend LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
	friend BOOL PreTranslateMessageX(MSG* pMsg);
protected:
	
	CRITICAL_SECTION m_cs;//临界区对象
};



/////////////////////////////////////////
//CDialogX
class CDialogX:public CWndX
{
public:
	CDialogX();
	virtual ~CDialogX();

	//创建一个非模式对话框
	BOOL Create(LPCTSTR lpszTemplateName,HWND hWndParent);
	//创建一个模式对话框
	virtual int DoModal(LPCTSTR lpszTemplateName,HWND hWndParent);

protected:
	virtual BOOL OnCommand(WPARAM wParam,LPARAM lParam);
    //消息响应
	virtual void OnClose();
	virtual void OnNcDestroy();
	virtual void OnOK();
	virtual void OnCancel();
	//
	//窗口过程
	virtual LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam);

private:
	
	BOOL m_bModal;//是否为模式
};


/////////////////////////////////////////////
//CCtrlX 控件基础类
class CCtrlX:public CWndX
{
public:
	//创建一个控件
	BOOL Create(DWORD dwStyleEx,LPCTSTR pszClass,LPCTSTR pszCaption,DWORD dwStyle, const RECT &rect, HWND hParentWnd, UINT nID);
	//与一个已存在控件关联
	BOOL Associate(HWND hWndParent,UINT uIDDlgItem);

protected:

	virtual LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
private:

};

/////////////////////////////////////////////////
//CButtonX
class CButtonX:public CCtrlX
{
public:

	BOOL Create(LPCTSTR pszCaption,DWORD dwStyle, const RECT &rect, HWND hParentWnd, UINT nID);
	
protected:
	
private:
};


////////////////////////////////////////////////
//CEditX
class CEditX:public CCtrlX
{
public:	
	BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
		
private:
	
protected:
	
};

///////////////////////////////////////////////
//CStaticX
class CStaticX:public CCtrlX
{
public:
	BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
private:
	
protected:
	
};

///////////////////////////////////////////////
//CComboBoxX
class CComboBoxX:public CCtrlX
{
public:
	BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);

protected:
	
private:
};


//////////////////////////////////////////////////
//CListBoxX
class CListBoxX:public CCtrlX
{
public:
	BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
protected:
	
private:

};



///////////////////////////////////////////////////
//CScrollBarX
class CScrollBarX:public CCtrlX
{

public:
	BOOL Create(DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
};


////////////////////////////////////////////////////
//CStatusBarX
class CStatusBarX:public CCtrlX
{

public:
	BOOL Create(LPCTSTR pszCaption,DWORD dwStyle, HWND hParentWnd,UINT nID);
};

///////////////////////////////////////////////////
//CToolBarX
class CToolBarX:public CCtrlX
{

public:
	BOOL Create(DWORD dwStyle,HWND hParentWnd,UINT nID);
};


/////////////////////////////////////////////////
//CMenuX
class CMenuX
{
public:
	CMenuX();
	virtual ~CMenuX();

	HMENU GetHandle();
	BOOL Attach(HMENU hMenu);
	HMENU Detach();

protected:
	HMENU m_hMenu;
};

#endif//#
