CWnd.h
上传用户:lswyart
上传日期:2008-06-12
资源大小:3441k
文件大小:7k
源码类别:

杀毒

开发平台:

Visual C++

  1. /*-----------------------------------------------------------------------------
  2. # Name:        CWnd.h
  3. # Product:     ClamWin Antivirus
  4. # Licence:     
  5. #   This program is free software; you can redistribute it and/or modify
  6. #   it under the terms of the GNU General Public License as published by
  7. #   the Free Software Foundation; either version 2 of the License, or
  8. #   (at your option) any later version.
  9. #   This program is distributed in the hope that it will be useful,
  10. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. #   GNU General Public License for more details.
  13. #   You should have received a copy of the GNU General Public License
  14. #   along with this program; if not, write to the Free Software
  15. #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. #-----------------------------------------------------------------------------
  17. this code is based on the following article by Jason Henderson:
  18. http://www.codeproject.com/win32/win32windowwrapperclass.asp
  19. */
  20. #ifndef _CWND_H_
  21. #define _CWND_H_
  22. #include "StdString.h"
  23. class CWnd
  24. {
  25. public:
  26. // many different ways to register
  27. virtual BOOL RegisterWindow();
  28. virtual BOOL RegisterWindow(UINT style, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, 
  29. LPCTSTR lpszMenuName, LPCTSTR lpszClassName, HICON hIconSm);
  30. virtual BOOL RegisterWindow(CONST WNDCLASSEX* wcx);
  31. // static message handler to put in WNDCLASSEX structure
  32. static LRESULT CALLBACK stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  33. // just so you can change the window caption...
  34. void SetWindowTitle(LPCTSTR lpszTitle) 
  35. {
  36. m_sWindowTitle = lpszTitle;
  37. };
  38. // 3 ways to create
  39. virtual BOOL Create();
  40. virtual BOOL Create(DWORD dwStyles, RECT* rect);
  41. virtual BOOL CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
  42. LPCTSTR lpszWindowName, DWORD dwStyle, 
  43. RECT& rect, HWND hwndParent, 
  44. HMENU nIDorHMenu, LPVOID lpParam = NULL );
  45. void SetIcon(HICON hIcon) { m_hIcon = hIcon; };
  46. //void MsgLoop();
  47. BOOL IsWindowClosed() { return m_bWindowClosed; };
  48. protected:
  49. HINSTANCE m_hInstance;
  50. HWND m_hWnd;
  51. BOOL m_bWindowClosed;
  52. CStdString m_sClassName;
  53. CStdString m_sWindowTitle;
  54. HICON m_hIcon;
  55. //contructor 
  56. CWnd(HINSTANCE hInst, CONST WNDCLASSEX* wcx = NULL) 
  57. :m_hWnd(NULL),
  58. m_hInstance(NULL),
  59. m_hIcon(NULL),
  60. m_bWindowClosed(FALSE)
  61. m_hInstance = hInst; 
  62. if (wcx != NULL) RegisterWindow(wcx);
  63. };
  64. ~CWnd() 
  65. {
  66. if(m_hIcon != NULL)
  67. CloseHandle(m_hIcon);
  68. m_hIcon = NULL;
  69. }
  70. // the real message handler
  71. virtual LRESULT CALLBACK WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) = 0;
  72. // returns a pointer the window (stored as the WindowLong)
  73. inline static CWnd *GetObjectFromWindow(HWND hWnd)
  74. {
  75. return (CWnd *)GetWindowLong(hWnd, GWL_USERDATA);
  76. }
  77. };
  78. inline BOOL CWnd::RegisterWindow()
  79. {
  80.     WNDCLASSEX wcx; 
  81.  
  82.     // Fill in the window class structure with default parameters 
  83.  
  84.     wcx.cbSize = sizeof(WNDCLASSEX); // size of structure 
  85.     wcx.style = CS_HREDRAW | CS_VREDRAW; // redraw if size changes 
  86.     wcx.lpfnWndProc = CWnd::stWinMsgHandler; // points to window procedure 
  87.     wcx.cbClsExtra = 0; // no extra class memory 
  88.     wcx.cbWndExtra = 0; // no extra window memory 
  89.     wcx.hInstance = m_hInstance; // handle to instance 
  90.     wcx.hIcon = m_hIcon; // predefined app. icon 
  91.     wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // predefined arrow 
  92.     wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // white background brush 
  93.     wcx.lpszMenuName = NULL; // name of menu resource 
  94.     wcx.lpszClassName = "BaseWindow"; // name of window class 
  95.     wcx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // small class icon 
  96.  
  97.     // Register the window class. 
  98.     return RegisterWindow(&wcx); 
  99. }
  100. inline BOOL CWnd::RegisterWindow(UINT style, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, 
  101. LPCTSTR lpszMenuName, LPCTSTR lpszClassName, HICON hIconSm)
  102. {
  103.     WNDCLASSEX wcx; 
  104.  
  105.     // Fill in the window class structure with default parameters 
  106.  
  107.     wcx.cbSize = sizeof(WNDCLASSEX); // size of structure 
  108.     wcx.style = style; // redraw if size changes 
  109.     wcx.lpfnWndProc = CWnd::stWinMsgHandler; // points to window procedure 
  110.     wcx.cbClsExtra = 0; // no extra class memory 
  111.     wcx.cbWndExtra = 0; // no extra window memory 
  112.     wcx.hInstance = m_hInstance; // handle to instance 
  113.     wcx.hIcon = hIcon; // predefined app. icon 
  114.     wcx.hCursor = hCursor; // predefined arrow 
  115.     wcx.hbrBackground = hbrBackground; // white background brush 
  116.     wcx.lpszMenuName = lpszMenuName; // name of menu resource 
  117.     wcx.lpszClassName = lpszClassName; // name of window class 
  118.     wcx.hIconSm = hIconSm; // small class icon 
  119.  
  120.     // Register the window class. 
  121.     return RegisterWindow(&wcx); 
  122. }
  123. inline BOOL CWnd::RegisterWindow(CONST WNDCLASSEX* wcx)
  124. {
  125. // Register the window class. 
  126. m_sClassName = wcx->lpszClassName;
  127. if (RegisterClassEx(wcx) == 0)
  128. return FALSE;
  129. else
  130. return TRUE;
  131. }
  132. inline LRESULT CALLBACK CWnd::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  133. {
  134. CWnd* pWnd;
  135. if (uMsg == WM_NCCREATE)
  136. {
  137. // get the pointer to the window from lpCreateParams which was set in CreateWindow
  138. SetWindowLong(hwnd, GWL_USERDATA, (long)((LPCREATESTRUCT(lParam))->lpCreateParams));
  139. }
  140. // get the pointer to the window
  141. pWnd = GetObjectFromWindow(hwnd);
  142. // if we have the pointer, go to the message handler of the window
  143. // else, use DefWindowProc
  144. if (pWnd)
  145. return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam);
  146. else
  147. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  148. }
  149. inline BOOL CWnd::Create()
  150. // Create the window
  151. RECT rect;
  152. rect.top = 0;
  153. rect.left = 0;
  154. rect.right = 600;
  155. rect.bottom = 400;
  156. return Create(WS_OVERLAPPEDWINDOW | WS_VISIBLE, &rect);
  157. }
  158. inline BOOL CWnd::Create(DWORD dwStyles, RECT* rect)
  159. // Create the window
  160. // send the this pointer as the window creation parameter
  161. m_hWnd = CreateWindow(m_sClassName, m_sWindowTitle, dwStyles, rect->left, rect->top, 
  162. rect->right - rect->left, rect->bottom - rect->top, NULL, NULL, m_hInstance, 
  163. (void *)this);
  164. return (m_hWnd != NULL);
  165. }
  166. inline BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
  167. LPCTSTR lpszWindowName, DWORD dwStyle, RECT& rect,
  168. HWND hwndParent, HMENU nIDorHMenu, LPVOID lpParam)
  169. {
  170. if(HIWORD(lpszClassName))
  171. m_sClassName = lpszClassName;
  172. m_sWindowTitle = lpszWindowName;
  173. m_hWnd = ::CreateWindowEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect.left, rect.top, 
  174. rect.right - rect.left, rect.bottom - rect.top, hwndParent, nIDorHMenu, m_hInstance, (void *)this);
  175. return !!m_hWnd;
  176. }
  177. #endif