WndX.h
上传用户:oldpeter23
上传日期:2013-01-09
资源大小:1111k
文件大小:8k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*------------------------------------------------------------------------------*
  2.  =============================
  3.    模块名称: WndX.h
  4.  =============================
  5.  [目的]
  6.  
  7.       当我刚开始用VC编程的时候,VC+MFC是我的主要开发手段。在开发过程中,我越来越
  8.    发觉,MFC太复杂,而且速度又慢,虽然它在某些方面简化了Windows编程,但综合考虑其
  9.    它一些方面的问题,比如说控制的深入性等发面,MFC显然有些力不从新,我还觉得MFC把
  10.    WINAPI封装得太严实了,很多细节都被隐藏了。
  11.       现在我一直用SDK,我喜欢SDK,虽然它被看来很麻烦。
  12.       我还没用写过什么大程序(大概超过10000行的就算大程序了吧),但是我已经发现代
  13.    码封装的必要性,SDK虽好,我总不能通篇的回调函数和事件响应函数吧。为此我决定写
  14.    一个我自己的窗口封装类,就象MFC中的CWnd一样,但首先应该明白的是,我的窗口封装类
  15.    只是MFC中窗口类的简化,而不是重复。有些人或许会说,微软的MFC不错啊,我已经说过,
  16.    MFC太慢,我需要的是一个快速的窗口封装类,不要封得太严实。象CWnd类中的一些对窗口
  17.    操作的函数,如GetWindowText之类的,根本没有必要去封装,多写个句柄真有那么烦吗?
  18.       
  19.      
  20.         
  21.  [描述]
  22.   为了封装对窗口的操作,我需要一套组织模式和一组额外类,为了这些,我已经花了很
  23.    多时间、想了很多办法。最后我选择了该模块中的方案。模块中有一个CWndMgr类,看
  24.    表面意思好象觉得它的作用很大,其实不然,在不断的修改中,它的作用已经和我的本意
  25.    不符了,现在,它的唯一作用是:当窗口创建时在其中登记一下,当窗口接收到第一个消
  26.    息的时候就删掉。CWndX和MFC中的CWnd类似,它实现了最基本窗口的创建等功能,所有窗
  27.    口都由此派生。CWndX比较抽象,一般由它派生类,而不直接由此创建对象。
  28.      
  29.    注意!!:
  30.  有几个很重要的全局函数和全局变量,这对外部是不公开的,不允许对这些对象直接访
  31.    问。
  32.      
  33.   
  34.  [用法]
  35.    
  36.    CWndX类比较抽象,请不要直接用它创建对象,你可以从它派生一个类来扩充它的功能.
  37.      
  38.  1.如何派生一个类
  39.     
  40. 每个学过C++的人都知道,class YourClass:plublic CWndX
  41.  
  42.  2.如何响应窗口消息
  43.     
  44. 首先,在你派生得到的类中,一般来说应该有一个形为
  45. LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
  46. 的虚函数,这是消息的入口
  47.   如果你用SDK写过程序,那么这将变得很简单,用一个switch语句就可以搞定.在你派
  48. 生出的类中,应该有一个WndProc的虚函数,这个函数是WINDOWS消息的入口,就相当于
  49. SDK中的窗口过程函数.在这个函数中,你用一个switch来获得你想要的消息,并定义一
  50. 系列响应的函数     
  51.  
  52.  [依赖性]
  53.   CHash
  54.  [修改记录]
  55.  
  56.   版本:    1.01.01
  57.   日期:    01-9-19         
  58.   作者:    Brant Q
  59.   备注:
  60.        这个模块能工作了,而且工作得不错,我用它创建了几个窗口,还用它将一个基于MFC的
  61. 模块改写了,基本符合要求.
  62.    目前对外只有一个CWndX类,一个CEditX类,和一个CDialogX类,以后如还要用到一些基
  63. 本的控件或窗口,将临时扩充此模块.
  64.   -----------------------------------
  65.   版本:    1.01.02
  66.   日期:    01-9-24
  67.   作者:    Brant Q
  68.   备注:
  69.       加入了菜单类CMenuX
  70.   修正了好多BUG,下面是主要的两个
  71.   1.在多线程环境下,有可能出现CWndMgr中访问争夺                 --已修正
  72.   2.窗口无法收到WM_CREATE及其之前的消息                        --已修正
  73.   
  74.   -----------------------------------
  75.   版本:   1.01.02
  76.   日期:   01-10-12
  77.   作者:   Brant Q
  78.   备注:
  79.       
  80.   原先是用普通线性链表存储窗口对象的,现在改用hash表,由于只有当窗口创建时才涉及
  81. 到Hash表的访问,因此性能没有明显提高.
  82.  [版权]
  83.  
  84.    2000-2002  115软件工厂  版权所有
  85.                                               
  86. *------------------------------------------------------------------------------*/
  87. #ifndef _WNDX_H_
  88. #define _WNDX_H_
  89. #include <Windows.h>
  90. #include <commctrl.h>
  91. #include "GDIX.h"
  92. #include "Hash.h"
  93. #define WND_OBJ_ID         "@"    //窗口对象标识
  94. #define WND_OLD_PROC       "~"    //旧窗口过程
  95. class CWndMgr;                   //窗口管理类
  96. class CObjectChain;              //窗口对象表
  97. class CWndX;                   //窗口类(基础类)
  98. extern HINSTANCE hInstX;       //程序实例句柄
  99. //负责消息派送
  100. LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
  101. //消息预处理
  102. BOOL PreTranslateMessageX(MSG* pMsg);
  103. //初始化X系统
  104. void InitXSystem(HINSTANCE hInst);
  105. ///////////////////////////////////////////////////////////////////
  106. //CWndX
  107. class CWndX
  108. {
  109. protected:
  110. HWND m_hWnd;//窗口句柄
  111. public:
  112. CWndX();    
  113. virtual ~CWndX();
  114. void operator =(HWND hWnd);
  115. operator HWND() const;
  116. HWND GetHwnd() const;
  117. //创建窗口,支持扩展风格
  118. virtual BOOL Create(DWORD dwExStyle,LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,
  119.    const RECT& rect,HWND hParentWnd,HMENU hMenu,LPVOID lpParam=NULL);
  120. BOOL Attach(HWND hWnd);
  121. HWND Detach();
  122. friend class CWndMgr;
  123. friend class CObjectChain;
  124. friend LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
  125. friend BOOL PreTranslateMessageX(MSG* pMsg);
  126. protected:
  127. WNDPROC m_OldProc;//旧窗口句柄
  128. virtual void OnNcDestroy();
  129. virtual BOOL PreTranslateMessage(MSG* pMsg);
  130. //窗口过程
  131. virtual LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
  132. private:
  133. };
  134. /////////////////////////////////////////////////////
  135. //CWndMgr
  136. class CWndMgr
  137. {
  138. public:
  139. CWndMgr();
  140. virtual ~CWndMgr();
  141. BOOL RemoveObject(CWndX* pWndObj);
  142. BOOL AddObject(CWndX* pWndObj);
  143. friend LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
  144. friend BOOL PreTranslateMessageX(MSG* pMsg);
  145. protected:
  146. CRITICAL_SECTION m_cs;//临界区对象
  147. };
  148. /////////////////////////////////////////
  149. //CDialogX
  150. class CDialogX:public CWndX
  151. {
  152. public:
  153. CDialogX();
  154. virtual ~CDialogX();
  155. //创建一个非模式对话框
  156. BOOL Create(LPCTSTR lpszTemplateName,HWND hWndParent);
  157. //创建一个模式对话框
  158. virtual int DoModal(LPCTSTR lpszTemplateName,HWND hWndParent);
  159. protected:
  160. virtual BOOL OnCommand(WPARAM wParam,LPARAM lParam);
  161.     //消息响应
  162. virtual void OnClose();
  163. virtual void OnNcDestroy();
  164. virtual void OnOK();
  165. virtual void OnCancel();
  166. //
  167. //窗口过程
  168. virtual LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
  169. private:
  170. BOOL m_bModal;//是否为模式
  171. };
  172. /////////////////////////////////////////////
  173. //CCtrlX 控件基础类
  174. class CCtrlX:public CWndX
  175. {
  176. public:
  177. //创建一个控件
  178. BOOL Create(DWORD dwStyleEx,LPCTSTR pszClass,LPCTSTR pszCaption,DWORD dwStyle, const RECT &rect, HWND hParentWnd, UINT nID);
  179. //与一个已存在控件关联
  180. BOOL Associate(HWND hWndParent,UINT uIDDlgItem);
  181. protected:
  182. virtual LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
  183. private:
  184. };
  185. /////////////////////////////////////////////////
  186. //CButtonX
  187. class CButtonX:public CCtrlX
  188. {
  189. public:
  190. BOOL Create(LPCTSTR pszCaption,DWORD dwStyle, const RECT &rect, HWND hParentWnd, UINT nID);
  191. protected:
  192. private:
  193. };
  194. ////////////////////////////////////////////////
  195. //CEditX
  196. class CEditX:public CCtrlX
  197. {
  198. public:
  199. BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
  200. private:
  201. protected:
  202. };
  203. ///////////////////////////////////////////////
  204. //CStaticX
  205. class CStaticX:public CCtrlX
  206. {
  207. public:
  208. BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
  209. private:
  210. protected:
  211. };
  212. ///////////////////////////////////////////////
  213. //CComboBoxX
  214. class CComboBoxX:public CCtrlX
  215. {
  216. public:
  217. BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
  218. protected:
  219. private:
  220. };
  221. //////////////////////////////////////////////////
  222. //CListBoxX
  223. class CListBoxX:public CCtrlX
  224. {
  225. public:
  226. BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
  227. protected:
  228. private:
  229. };
  230. ///////////////////////////////////////////////////
  231. //CScrollBarX
  232. class CScrollBarX:public CCtrlX
  233. {
  234. public:
  235. BOOL Create(DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
  236. };
  237. ////////////////////////////////////////////////////
  238. //CStatusBarX
  239. class CStatusBarX:public CCtrlX
  240. {
  241. public:
  242. BOOL Create(LPCTSTR pszCaption,DWORD dwStyle, HWND hParentWnd,UINT nID);
  243. };
  244. ///////////////////////////////////////////////////
  245. //CToolBarX
  246. class CToolBarX:public CCtrlX
  247. {
  248. public:
  249. BOOL Create(DWORD dwStyle,HWND hParentWnd,UINT nID);
  250. };
  251. /////////////////////////////////////////////////
  252. //CMenuX
  253. class CMenuX
  254. {
  255. public:
  256. CMenuX();
  257. virtual ~CMenuX();
  258. HMENU GetHandle();
  259. BOOL Attach(HMENU hMenu);
  260. HMENU Detach();
  261. protected:
  262. HMENU m_hMenu;
  263. };
  264. #endif//#