WndClass.h
上传用户:ghyvgy
上传日期:2009-05-26
资源大小:547k
文件大小:24k
源码类别:

其他游戏

开发平台:

Python

  1. /*
  2. s_p_oneil@hotmail.com
  3. Copyright (c) 2000, Sean O'Neil
  4. All rights reserved.
  5. Redistribution and use in source and binary forms, with or without
  6. modification, are permitted provided that the following conditions are met:
  7. * Redistributions of source code must retain the above copyright notice,
  8.   this list of conditions and the following disclaimer.
  9. * Redistributions in binary form must reproduce the above copyright notice,
  10.   this list of conditions and the following disclaimer in the documentation
  11.   and/or other materials provided with the distribution.
  12. * Neither the name of this project nor the names of its contributors
  13.   may be used to endorse or promote products derived from this software
  14.   without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  19. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  20. CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  21. SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  22. INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  23. CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  24. ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  25. POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #ifndef __WndClass_h__
  28. #define __WndClass_h__
  29. #include "Resource.h"
  30. // Assertion and trace declarations
  31. #include <assert.h>
  32. #ifdef _DEBUG
  33. #define ASSERT assert
  34. #define TRACE Trace
  35. #else
  36. #define ASSERT ((void)0)
  37. #define TRACE ((void)0)
  38. #endif
  39. #define RELEASE(a) if(a) { a->Release(); a = NULL; }
  40. inline void Trace(const char *pszFormat, ...)
  41. {
  42. char szBuffer[8192];
  43. va_list va;
  44. va_start(va, pszFormat);
  45. vsprintf(szBuffer, pszFormat, va);
  46. va_end(va);
  47. strcat(szBuffer, "n");
  48. OutputDebugString(szBuffer);
  49. }
  50. // Window and control wrapper classes
  51. class CRect : public RECT
  52. {
  53. public:
  54. CRect() {}
  55. CRect(int x1, int y1, int x2, int y2) { left = x1; top = y1; right = x2; bottom = y2; }
  56. CRect(POINT tl, POINT br) { left = tl.x; top = tl.y; right = br.x; bottom = br.y; }
  57. int Width() { return right - left; }
  58. int Height() { return bottom - top; }
  59. void SetRect(int x1, int y1, int x2, int y2) { left = x1; top = y1; right = x2; bottom = y2; }
  60. void SetRect(POINT tl, POINT br) { left = tl.x; top = tl.y; right = br.x; bottom = br.y; }
  61. void SetRectEmpty() { left = top = right = bottom = 0; }
  62. };
  63. class CWnd
  64. {
  65. public:
  66. HWND m_hWnd;
  67. CWnd(HWND hWnd=NULL) { m_hWnd = hWnd; }
  68. virtual ~CWnd() {}
  69. operator HWND() { return m_hWnd; }
  70. bool operator==(HWND hWnd) { return hWnd == m_hWnd; }
  71. bool operator!=(HWND hWnd) { return hWnd != m_hWnd; }
  72. void operator=(HWND hWnd) { m_hWnd = hWnd; }
  73. BOOL CreateEx(HINSTANCE hInstance, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwExStyle, DWORD dwStyle, LPCRECT pRect, HWND hParent=NULL, HMENU hMenu=NULL, LPVOID lpParam=NULL)
  74. {
  75. m_hWnd = ::CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, pRect->left, pRect->top, pRect->right-pRect->left, pRect->bottom-pRect->top, hParent, hMenu, hInstance, lpParam);
  76. return (m_hWnd != NULL);
  77. }
  78. BOOL DestroyWindow() { return ::DestroyWindow(m_hWnd); }
  79. long SetWindowLong(int nIndex, long nValue) { return ::SetWindowLong(m_hWnd, nIndex, nValue); }
  80. long GetWindowLong(int nIndex) { return ::GetWindowLong(m_hWnd, nIndex); }
  81. DWORD GetStyle() { return (DWORD)::GetWindowLong(m_hWnd, GWL_STYLE); }
  82. void SetStyle(DWORD dw) { ::SetWindowLong(m_hWnd, GWL_STYLE, dw); }
  83. DWORD GetExStyle() { return (DWORD)::GetWindowLong(m_hWnd, GWL_EXSTYLE); }
  84. void SetExStyle(DWORD dw) { ::SetWindowLong(m_hWnd, GWL_EXSTYLE, dw); }
  85. LRESULT SendMessage(UINT n, WPARAM w=0, LPARAM l=0) { return ::SendMessage(m_hWnd, n, w, l); }
  86. BOOL PostMessage(UINT n, WPARAM w=0, LPARAM l=0){ return ::PostMessage(m_hWnd, n, w, l); }
  87. void SetWindowText(LPCTSTR psz) { ::SetWindowText(m_hWnd, psz); }
  88. int GetWindowText(LPTSTR psz, int n) { return ::GetWindowText(m_hWnd, psz, n); }
  89. int GetWindowTextLength() { return ::GetWindowTextLength(m_hWnd); }
  90. void UpdateWindow() { ::UpdateWindow(m_hWnd); }
  91. BOOL ShowWindow(int nCmdShow) { return ::ShowWindow(m_hWnd, nCmdShow); }
  92. BOOL EnableWindow(BOOL bEnable) { return ::EnableWindow(m_hWnd, bEnable); }
  93. BOOL IsWindowEnabled() { return ::IsWindowEnabled(m_hWnd); }
  94. BOOL IsWindowVisible() { return ::IsWindowVisible(m_hWnd); }
  95. BOOL IsIconic() { return ::IsIconic(m_hWnd); }
  96. BOOL IsZoomed() { return ::IsZoomed(m_hWnd); }
  97. void MoveWindow(LPCRECT pRect, BOOL b=TRUE) { MoveWindow(pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top, b); }
  98. void MoveWindow(int x, int y, int w, int h, BOOL b=TRUE) { ::MoveWindow(m_hWnd, x, y, w, h, b); }
  99. BOOL SetWindowPos(HWND hWnd, LPCRECT pRect, UINT n=0) { return ::SetWindowPos(m_hWnd, hWnd, pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top, n); }
  100. BOOL SetWindowPos(HWND hWnd, int x, int y, int w, int h, UINT n=0) { return ::SetWindowPos(m_hWnd, hWnd, x, y, w, h, n); }
  101. void BringWindowToTop() { ::BringWindowToTop(m_hWnd); }
  102. void GetWindowRect(LPRECT pRect) { ::GetWindowRect(m_hWnd, pRect); }
  103. void GetClientRect(LPRECT pRect) { ::GetClientRect(m_hWnd, pRect); }
  104. void ClientToScreen(LPPOINT pPoint) { ::ClientToScreen(m_hWnd, pPoint); }
  105. void ClientToScreen(LPRECT pRect) { ::ClientToScreen(m_hWnd, (LPPOINT)pRect); ::ClientToScreen(m_hWnd, ((LPPOINT)pRect)+1); }
  106. void ScreenToClient(LPPOINT pPoint) { ::ScreenToClient(m_hWnd, pPoint); }
  107. void ScreenToClient(LPRECT pRect) { ::ScreenToClient(m_hWnd, (LPPOINT)pRect); ::ScreenToClient(m_hWnd, ((LPPOINT)pRect)+1); }
  108. void CalcWindowRect(LPRECT pRect, UINT n=0) { ::AdjustWindowRect(pRect, GetStyle(), TRUE); }
  109. HWND GetActiveWindow() { return ::GetActiveWindow(); }
  110. HWND SetActiveWindow() { return ::SetActiveWindow(m_hWnd); }
  111. HWND GetCapture() { return ::GetCapture(); }
  112. HWND SetCapture() { return ::SetCapture(m_hWnd); }
  113. HWND GetFocus() { return ::GetFocus(); }
  114. HWND SetFocus() { return ::SetFocus(m_hWnd); }
  115. HWND GetParent() { return ::GetParent(m_hWnd); }
  116. HWND SetParent(HWND hWnd) { return ::SetParent(m_hWnd, hWnd); }
  117. HICON SetIcon(HICON h, BOOL b) { return (HICON)::SendMessage(m_hWnd, WM_SETICON, b, (LPARAM)h); }
  118. HICON GetIcon(BOOL b) { return (HICON)::SendMessage(m_hWnd, WM_GETICON, b, 0); }
  119. HMENU GetMenu() { return ::GetMenu(m_hWnd); }
  120. BOOL SetMenu(HMENU hMenu) { return ::SetMenu(m_hWnd, hMenu); }
  121. void DrawMenuBar() { ::DrawMenuBar(m_hWnd); }
  122. void RedrawWindow(LPCRECT pRect, UINT n) { ::RedrawWindow(m_hWnd, pRect, NULL, n); }
  123. int GetDlgCtrlID() { return ::GetDlgCtrlID(m_hWnd); }
  124. void SetRedraw(BOOL b) { ::SendMessage(m_hWnd, WM_SETREDRAW, b, 0); }
  125. void Invalidate(BOOL b=TRUE, LPCRECT pRect=NULL){ ::InvalidateRect(m_hWnd, pRect, b); }
  126. void Validate(LPCRECT pRect=NULL) { ::ValidateRect(m_hWnd, pRect); }
  127. UINT SetTimer(UINT nID, UINT nElapse) { return ::SetTimer(m_hWnd, nID, nElapse, NULL); }
  128. BOOL KillTimer(int nID) { return ::KillTimer(m_hWnd, nID); }
  129. };
  130. class CDialog : public CWnd
  131. {
  132. protected:
  133. int m_nID;
  134. HINSTANCE m_hInstance;
  135. HWND m_hWndParent;
  136. public:
  137. CDialog(int nID=0, HINSTANCE hInstance=NULL, HWND hWndParent=NULL)
  138. {
  139. m_nID = nID;
  140. m_hInstance = hInstance;
  141. m_hWndParent = hWndParent;
  142. }
  143. static BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  144. {
  145. CDialog *pDlg;
  146. switch(uMsg)
  147. {
  148. case WM_INITDIALOG:
  149. {
  150. pDlg = (CDialog *)lParam;
  151. ::SetWindowLong(hWnd, GWL_USERDATA, (long)pDlg);
  152. pDlg->m_hWnd = hWnd;
  153. pDlg->CenterDialog();
  154. return pDlg->OnInitDialog(hWnd);
  155. }
  156. case WM_COMMAND:
  157. {
  158. pDlg = (CDialog *)::GetWindowLong(hWnd, GWL_USERDATA);
  159. if(wParam == IDOK)
  160. return pDlg->OnOK();
  161. if(wParam == IDCANCEL)
  162. return pDlg->OnCancel();
  163. return pDlg->OnCommand(wParam, lParam);
  164. }
  165. }
  166. return FALSE;
  167. }
  168. int DoModal() { return ::DialogBoxParam(m_hInstance, MAKEINTRESOURCE(m_nID), m_hWndParent, DlgProc, (LPARAM)this); }
  169. virtual bool OnInitDialog(HWND hWnd) { return true; }
  170. virtual bool OnOK() { ::EndDialog(m_hWnd, IDOK); return false; }
  171. virtual bool OnCancel() { ::EndDialog(m_hWnd, IDCANCEL); return false; }
  172. virtual bool OnCommand(WPARAM w, LPARAM l) { return false; }
  173. void CenterDialog()
  174. {
  175. RECT rect1, rect2;
  176. GetWindowRect(&rect1);
  177. CWnd(m_hWndParent ? m_hWndParent : GetDesktopWindow()).GetWindowRect(&rect2);
  178. rect1.left = rect2.left + ((rect2.right-rect2.left)-(rect1.right-rect1.left))/2;
  179. rect1.top = rect2.top + ((rect2.bottom-rect2.top)-(rect1.bottom-rect1.top))/2;
  180. SetWindowPos(NULL, &rect1, SWP_NOSIZE | SWP_NOZORDER);
  181. }
  182. };
  183. class CStatic : public CWnd
  184. {
  185. CStatic(HWND hWndParent, int nComboID)
  186. {
  187. m_hWnd = ::GetDlgItem(hWndParent, nComboID);
  188. ASSERT(::IsWindow(m_hWnd));
  189. }
  190. HICON SetIcon(HICON hIcon) { return (HICON)::SendMessage(m_hWnd, STM_SETICON, (WPARAM)hIcon, 0L); }
  191. HICON GetIcon() const { return (HICON)::SendMessage(m_hWnd, STM_GETICON, 0, 0L); }
  192. HENHMETAFILE SetEnhMetaFile(HENHMETAFILE h) { return (HENHMETAFILE)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)h); }
  193. HENHMETAFILE GetEnhMetaFile() const { return (HENHMETAFILE)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ENHMETAFILE, 0L); }
  194. HBITMAP SetBitmap(HBITMAP hBitmap) { return (HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); }
  195. HBITMAP GetBitmap() const { return (HBITMAP)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0L); }
  196. HCURSOR SetCursor(HCURSOR hCursor) { return (HCURSOR)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hCursor); }
  197. HCURSOR GetCursor() { return (HCURSOR)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_CURSOR, 0L); }
  198. };
  199. class CEdit : public CWnd
  200. {
  201. public:
  202. CEdit(HWND hWndParent, int nComboID)
  203. {
  204. m_hWnd = ::GetDlgItem(hWndParent, nComboID);
  205. ASSERT(::IsWindow(m_hWnd));
  206. }
  207. void GetSel(int& nStartChar, int& nEndChar) { ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar,(LPARAM)&nEndChar); }
  208. DWORD GetSel() { return ::SendMessage(m_hWnd, EM_GETSEL, 0, 0); }
  209. void SetSel(DWORD dwSelection) { ::SendMessage(m_hWnd, EM_SETSEL, LOWORD(dwSelection), HIWORD(dwSelection)); }
  210. void SetSel(int nStartChar, int nEndChar) { ::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar); }
  211. void SetLimitText(UINT nMax) { ::SendMessage(m_hWnd, EM_SETLIMITTEXT, nMax, 0); }
  212. void Clear() { ::SendMessage(m_hWnd, WM_CLEAR, 0, 0); }
  213. void Copy() { ::SendMessage(m_hWnd, WM_COPY, 0, 0); }
  214. void Cut() { ::SendMessage(m_hWnd, WM_CUT, 0, 0); }
  215. void Paste() { ::SendMessage(m_hWnd, WM_PASTE, 0, 0); }
  216. BOOL SetReadOnly(BOOL bReadOnly) { return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); }
  217. };
  218. class CButton : public CWnd
  219. {
  220. public:
  221. CButton(HWND hWndParent, int nComboID)
  222. {
  223. m_hWnd = ::GetDlgItem(hWndParent, nComboID);
  224. ASSERT(::IsWindow(m_hWnd));
  225. }
  226. UINT GetState() { return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0); }
  227. void SetState(BOOL b) { ::SendMessage(m_hWnd, BM_SETSTATE, b, 0); }
  228. int GetCheck() { return (int)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0); }
  229. void SetCheck(int n) { ::SendMessage(m_hWnd, BM_SETCHECK, n, 0); }
  230. UINT GetButtonStyle() { return (UINT)::GetWindowLong(m_hWnd, GWL_STYLE) & 0xff; }
  231. void SetButtonStyle(UINT n, BOOL b) { ::SendMessage(m_hWnd, BM_SETSTYLE, n, (LPARAM)b); }
  232. };
  233. class CComboBox : public CWnd
  234. {
  235. public:
  236. CComboBox(HWND hWndParent, int nComboID)
  237. {
  238. m_hWnd = ::GetDlgItem(hWndParent, nComboID);
  239. ASSERT(::IsWindow(m_hWnd));
  240. }
  241. int GetCount() { return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0); }
  242. int GetCurSel() { return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0); }
  243. int SetCurSel(int n) { return (int)::SendMessage(m_hWnd, CB_SETCURSEL, n, 0); }
  244. DWORD GetEditSel() { return (DWORD)::SendMessage(m_hWnd, CB_GETEDITSEL, 0, 0); }
  245. BOOL LimitText(int n) { return (BOOL)::SendMessage(m_hWnd, CB_LIMITTEXT, n, 0); }
  246. BOOL SetEditSel(int nStart, int nEnd) { return (BOOL)::SendMessage(m_hWnd, CB_SETEDITSEL, 0, MAKELONG(nStart, nEnd)); }
  247. DWORD GetItemData(int n) { return ::SendMessage(m_hWnd, CB_GETITEMDATA, n, 0); }
  248. int SetItemData(int n, DWORD dw) { return (int)::SendMessage(m_hWnd, CB_SETITEMDATA, n, (LPARAM)dw); }
  249. void *GetItemDataPtr(int n) { return (LPVOID)GetItemData(n); }
  250. int SetItemDataPtr(int n, void *pData) { return SetItemData(n, (DWORD)(LPVOID)pData); }
  251. int GetLBText(int n, LPTSTR psz) { return (int)::SendMessage(m_hWnd, CB_GETLBTEXT, n, (LPARAM)psz); }
  252. int GetLBTextLen(int n) { return (int)::SendMessage(m_hWnd, CB_GETLBTEXTLEN, n, 0); }
  253. int AddString(LPCTSTR psz) { return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)psz); }
  254. int DeleteString(UINT n) { return (int)::SendMessage(m_hWnd, CB_DELETESTRING, n, 0);}
  255. int InsertString(int n, LPCTSTR psz) { return (int)::SendMessage(m_hWnd, CB_INSERTSTRING, n, (LPARAM)psz); }
  256. void ResetContent() { ::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0); }
  257. int FindString(int n, LPCTSTR psz) { return (int)::SendMessage(m_hWnd, CB_FINDSTRING, n, (LPARAM)psz); }
  258. int SelectString(int n, LPCTSTR psz) { return (int)::SendMessage(m_hWnd, CB_SELECTSTRING, n, (LPARAM)psz); }
  259. };
  260. class CListBox : public CWnd
  261. {
  262. CListBox(HWND hWndParent, int nComboID)
  263. {
  264. m_hWnd = ::GetDlgItem(hWndParent, nComboID);
  265. ASSERT(::IsWindow(m_hWnd));
  266. }
  267. int GetCount() const { return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0); }
  268. int GetCurSel() const { return (int)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0); }
  269. int SetCurSel(int n) { return (int)::SendMessage(m_hWnd, LB_SETCURSEL, n, 0); }
  270. int GetHorizontalExtent() const { return (int)::SendMessage(m_hWnd, LB_GETHORIZONTALEXTENT, 0, 0); }
  271. void SetHorizontalExtent(int n) { ::SendMessage(m_hWnd, LB_SETHORIZONTALEXTENT, n, 0); }
  272. int GetSelCount() const { return (int)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0); }
  273. int GetSelItems(int n, LPINT rg) const { return (int)::SendMessage(m_hWnd, LB_GETSELITEMS, n, (LPARAM)rg); }
  274. int GetTopIndex() const { return (int)::SendMessage(m_hWnd, LB_GETTOPINDEX, 0, 0); }
  275. int SetTopIndex(int n) { return (int)::SendMessage(m_hWnd, LB_SETTOPINDEX, n, 0);}
  276. DWORD GetItemData(int n) const { return ::SendMessage(m_hWnd, LB_GETITEMDATA, n, 0); }
  277. int SetItemData(int n, DWORD dw) { return (int)::SendMessage(m_hWnd, LB_SETITEMDATA, n, (LPARAM)dw); }
  278. void* GetItemDataPtr(int n) const { return (LPVOID)::SendMessage(m_hWnd, LB_GETITEMDATA, n, 0); }
  279. int SetItemDataPtr(int n, void *pData) { return SetItemData(n, (DWORD)(LPVOID)pData); }
  280. int GetItemRect(int n, LPRECT p) const { return (int)::SendMessage(m_hWnd, LB_GETITEMRECT, n, (LPARAM)p); }
  281. int GetSel(int n) const { return (int)::SendMessage(m_hWnd, LB_GETSEL, n, 0); }
  282. int SetSel(int n, BOOL b) { return (int)::SendMessage(m_hWnd, LB_SETSEL, b, n); }
  283. int GetText(int n, LPTSTR psz) const { return (int)::SendMessage(m_hWnd, LB_GETTEXT, n, (LPARAM)psz); }
  284. int GetTextLen(int n) const { return (int)::SendMessage(m_hWnd, LB_GETTEXTLEN, n, 0); }
  285. void SetColumnWidth(int n) { ::SendMessage(m_hWnd, LB_SETCOLUMNWIDTH, n, 0); }
  286. BOOL SetTabStops(int n, LPINT rg) { return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, n, (LPARAM)rg); }
  287. void SetTabStops() { ::SendMessage(m_hWnd, LB_SETTABSTOPS, 0, 0); }
  288. BOOL SetTabStops(const int& cx) { return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&cx); }
  289. int SetItemHeight(int n, UINT cy) { return (int)::SendMessage(m_hWnd, LB_SETITEMHEIGHT, n, MAKELONG(cy, 0)); }
  290. int GetItemHeight(int n) const { return (int)::SendMessage(m_hWnd, LB_GETITEMHEIGHT, n, 0L); }
  291. int FindStringExact(int n, LPCTSTR psz) const { return (int)::SendMessage(m_hWnd, LB_FINDSTRINGEXACT, n, (LPARAM)psz); }
  292. int GetCaretIndex() const { return (int)::SendMessage(m_hWnd, LB_GETCARETINDEX, 0, 0L); }
  293. int SetCaretIndex(int n, BOOL bScroll) { return (int)::SendMessage(m_hWnd, LB_SETCARETINDEX, n, MAKELONG(bScroll, 0)); }
  294. int AddString(LPCTSTR lpszItem) { return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }
  295. int DeleteString(UINT n) { return (int)::SendMessage(m_hWnd, LB_DELETESTRING, n, 0); }
  296. int InsertString(int n, LPCTSTR psz) { return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, n, (LPARAM)psz); }
  297. void ResetContent() { ::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0); }
  298. int Dir(UINT attr, LPCTSTR psz) { return (int)::SendMessage(m_hWnd, LB_DIR, attr, (LPARAM)psz); }
  299. int FindString(int n, LPCTSTR psz) const{ return (int)::SendMessage(m_hWnd, LB_FINDSTRING, n, (LPARAM)psz); }
  300. int SelectString(int n, LPCTSTR psz) { return (int)::SendMessage(m_hWnd, LB_SELECTSTRING, n, (LPARAM)psz); }
  301. int SelItemRange(BOOL b, int f, int l) { return b ? (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, f, l) : (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, l, f); }
  302. void SetAnchorIndex(int n) { ::SendMessage(m_hWnd, LB_SETANCHORINDEX, n, 0); }
  303. int GetAnchorIndex() const { return (int)::SendMessage(m_hWnd, LB_GETANCHORINDEX, 0, 0); }
  304. LCID GetLocale() const { return (LCID)::SendMessage(m_hWnd, LB_GETLOCALE, 0, 0); }
  305. LCID SetLocale(LCID n) { return (LCID)::SendMessage(m_hWnd, LB_SETLOCALE, (WPARAM)n, 0); }
  306. };
  307. // Device context and drawing classes
  308. class CDC
  309. {
  310. public:
  311. HDC m_hDC;
  312. HWND m_hWnd;
  313. public:
  314. CDC(HDC hDC=NULL, HWND hWnd=NULL) { m_hDC = hDC; m_hWnd = hWnd; }
  315. operator HDC() { return m_hDC; }
  316. bool operator==(HDC hDC) { return hDC == m_hDC; }
  317. bool operator!=(HDC hDC) { return hDC != m_hDC; }
  318. void operator=(HDC hDC) { m_hDC = hDC; }
  319. COLORREF SetBkColor(COLORREF c) { return ::SetBkColor(m_hDC, c); }
  320. int SetBkMode(int nMode) { return ::SetBkMode(m_hDC, nMode); }
  321. COLORREF SetTextColor(COLORREF c) { return ::SetTextColor(m_hDC, c); }
  322. BOOL TextOut(int x, int y, const char *psz) { return ::TextOut(m_hDC, x, y, psz, strlen(psz)); }
  323. HGDIOBJ SelectObject(HGDIOBJ hGDI) { return ::SelectObject(m_hDC, hGDI); }
  324. BOOL BitBlt(HDC hDC, int x, int y, int w, int h, int xSrc=0, int ySrc=0, DWORD dwROP=SRCCOPY)
  325. {
  326. return ::BitBlt(hDC, x, y, w, h, m_hDC, xSrc, ySrc, dwROP);
  327. }
  328. BOOL CenteredTextOut(const char *psz)
  329. {
  330. CRect rect;
  331. SIZE size;
  332. int nLength = strlen(psz);
  333. ::GetClientRect(m_hWnd, &rect);
  334. ::GetTextExtentPoint32(m_hDC, psz, nLength, &size);
  335. return ::TextOut(m_hDC, (rect.Width()-size.cx)/2, (rect.Height()-size.cy)/2, psz, nLength);
  336. }
  337. };
  338. class CClientDC : public CDC
  339. {
  340. public:
  341. CClientDC(HWND hWnd=NULL) { if(hWnd) Init(hWnd); }
  342. void Init(HWND hWnd) { m_hWnd = hWnd; m_hDC = ::GetDC(m_hWnd); }
  343. void Release() { if(m_hDC) { ::ReleaseDC(m_hWnd, m_hDC); m_hDC = NULL; } }
  344. ~CClientDC() { Release(); }
  345. };
  346. class CWindowDC : public CDC
  347. {
  348. public:
  349. CWindowDC(HWND hWnd=NULL) { if(hWnd) Init(hWnd); }
  350. void Init(HWND hWnd) { m_hWnd = hWnd; m_hDC = ::GetWindowDC(m_hWnd); }
  351. void Release() { if(m_hDC) { ::ReleaseDC(m_hWnd, m_hDC); m_hDC = NULL; } }
  352. ~CWindowDC() { Release(); }
  353. };
  354. class CPaintDC : public CDC
  355. {
  356. public:
  357. PAINTSTRUCT m_ps;
  358. public:
  359. CPaintDC(HWND hWnd) { m_hWnd = hWnd; ::BeginPaint(m_hWnd, &m_ps); m_hDC = m_ps.hdc; }
  360. ~CPaintDC() { ::EndPaint(m_hWnd, &m_ps); }
  361. };
  362. class CCompatibleDC : public CDC
  363. {
  364. public:
  365. CCompatibleDC(HDC hDC=NULL) { m_hDC = ::CreateCompatibleDC(hDC); }
  366. ~CCompatibleDC() { if(m_hDC) ::DeleteDC(m_hDC); }
  367. };
  368. class CWinApp : public CWnd
  369. {
  370. // Attributes
  371. protected:
  372. HINSTANCE m_hInstance;
  373. HINSTANCE m_hPrevInstance;
  374. const char *m_pszCmdLine;
  375. int m_nShowCmd;
  376. char m_szAppName[_MAX_PATH];
  377. char m_szAppPath[_MAX_PATH];
  378. char m_szStartupPath[_MAX_PATH];
  379. char m_szRegistryKey[_MAX_PATH];
  380. public:
  381. static CWinApp *m_pMainApp;
  382. // Operations
  383. protected:
  384. public:
  385. CWinApp(HINSTANCE hInstance, HINSTANCE hPrevInstance=NULL, char *pszCmdLine="", int nShowCmd=SW_SHOWNORMAL)
  386. {
  387. m_pMainApp = this;
  388. m_hInstance = hInstance;
  389. m_hPrevInstance = hPrevInstance;
  390. m_pszCmdLine = pszCmdLine;
  391. m_nShowCmd = nShowCmd;
  392. LoadString(IDS_APPLICATION, m_szAppName);
  393. ::GetModuleFileName(NULL, m_szAppPath, _MAX_PATH);
  394. ::GetCurrentDirectory(_MAX_PATH, m_szStartupPath);
  395. sprintf(m_szRegistryKey, "Software\%s", m_szAppName);
  396. }
  397. ~CWinApp()
  398. {
  399. m_pMainApp = NULL;
  400. }
  401. virtual bool InitInstance() { return false; }
  402. virtual int ExitInstance() { return 0; }
  403. virtual bool OnIdle() { return false; }
  404. virtual bool PreTranslateMessage(MSG *pMsg) { return false; }
  405. virtual int Run()
  406. {
  407. MSG msg;
  408. msg.message = 0;
  409. while(msg.message != WM_QUIT)
  410. {
  411. OnIdle();
  412. while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  413. {
  414. if(msg.message == WM_QUIT)
  415. break;
  416. if(!PreTranslateMessage(&msg))
  417. {
  418. TranslateMessage(&msg);
  419. DispatchMessage(&msg);
  420. }
  421. }
  422. }
  423. return 0;
  424. }
  425. HINSTANCE GetInstanceHandle() { return m_hInstance; }
  426. const char *GetAppName() { return m_szAppName; }
  427. const char *GetAppPath() { return m_szAppPath; }
  428. const char *GetStartupPath() { return m_szStartupPath; }
  429. const char *GetRegistryKey() { return m_szRegistryKey; }
  430. const char *GetCommandLine() { return m_pszCmdLine; }
  431. void SetAppName(const char *psz) { strcpy(m_szAppName, psz); }
  432. void SetAppPath(const char *psz) { strcpy(m_szAppPath, psz); }
  433. void SetStartupPath(const char *psz) { strcpy(m_szStartupPath, psz); }
  434. void SetRegistryKey(const char *psz) { strcpy(m_szRegistryKey, psz); }
  435. int MessageBox(const char *psz, UINT uType=MB_OK) { return ::MessageBox(NULL, psz, m_szAppName, uType); }
  436. int LoadString(int nID, char *psz, int nMax=_MAX_PATH) { return ::LoadString(m_hInstance, nID, psz, nMax); }
  437. int GetProfileInt(const char *pszSection, const char *pszEntry, int nDefault=0)
  438. {
  439. HKEY hKey;
  440. DWORD dw, dwType, dwValue;
  441. char szBuffer[_MAX_PATH];
  442. sprintf(szBuffer, "%s\%s", m_szRegistryKey, pszSection);
  443. if(RegCreateKeyEx(HKEY_CURRENT_USER, szBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw) == ERROR_SUCCESS)
  444. {
  445. dw = sizeof(DWORD);
  446. if(RegQueryValueEx(hKey, pszEntry, NULL, &dwType, (unsigned char *)&dwValue, &dw) == ERROR_SUCCESS && dwType == REG_DWORD)
  447. nDefault = dwValue;
  448. RegCloseKey(hKey);
  449. }
  450. return nDefault;
  451. }
  452. bool WriteProfileInt(const char *pszSection, const char *pszEntry, int nValue)
  453. {
  454. HKEY hKey;
  455. DWORD dw;
  456. char szBuffer[_MAX_PATH];
  457. sprintf(szBuffer, "%s\%s", m_szRegistryKey, pszSection);
  458. bool bSuccess = false;
  459. if(RegCreateKeyEx(HKEY_CURRENT_USER, szBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw) == ERROR_SUCCESS)
  460. {
  461. bSuccess = (RegSetValueEx(hKey, pszEntry, 0, REG_DWORD, (unsigned char *)&nValue, sizeof(DWORD)) == ERROR_SUCCESS);
  462. RegCloseKey(hKey);
  463. }
  464. return bSuccess;
  465. }
  466. const char *GetProfileString(const char *pszSection, const char *pszEntry, const char *pszDefault="")
  467. {
  468. HKEY hKey;
  469. DWORD dw, dwType;
  470. static char szBuffer[_MAX_PATH];
  471. sprintf(szBuffer, "%s\%s", m_szRegistryKey, pszSection);
  472. if(RegCreateKeyEx(HKEY_CURRENT_USER, szBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw) == ERROR_SUCCESS)
  473. {
  474. dw = _MAX_PATH;
  475. if(RegQueryValueEx(hKey, pszEntry, NULL, &dwType, (unsigned char *)szBuffer, &dw) == ERROR_SUCCESS && dwType == REG_SZ)
  476. pszDefault = szBuffer;
  477. RegCloseKey(hKey);
  478. }
  479. return pszDefault;
  480. }
  481. bool WriteProfileString(const char *pszSection, const char *pszEntry, const char *pszValue)
  482. {
  483. HKEY hKey;
  484. DWORD dw;
  485. char szBuffer[_MAX_PATH];
  486. sprintf(szBuffer, "%s\%s", m_szRegistryKey, pszSection);
  487. bool bSuccess = false;
  488. if(RegCreateKeyEx(HKEY_CURRENT_USER, szBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw) == ERROR_SUCCESS)
  489. {
  490. bSuccess = pszValue ? (RegSetValueEx(hKey, pszEntry, 0, REG_SZ, (unsigned char *)pszValue, strlen(pszValue)+1) == ERROR_SUCCESS) :
  491.   (RegDeleteValue(hKey, pszEntry) == ERROR_SUCCESS);
  492. RegCloseKey(hKey);
  493. }
  494. return bSuccess;
  495. }
  496. };
  497. inline CWinApp *GetApp() { return CWinApp::m_pMainApp; }
  498. #endif // __WndClass_h__