dragsize.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 6k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*
  2. **  DRAGSIZE.C
  3. **
  4. **  Drag size bar code
  5. **
  6. */
  7. #include "precomp.h"
  8. #pragma hdrstop
  9. typedef struct tagDRAGSIZEINFO
  10. {
  11. DWORD_PTR lpData;
  12. BOOL bDragging;
  13. POINT ptNow;
  14. HFONT hFont;
  15. } DRAGSIZEINFO, *PDRAGSIZEINFO;
  16. extern HINSTANCE hInstance;
  17. extern TCHAR g_szNULL[];
  18. static TCHAR szDragSizeClass[] = DRAGSIZECLASSNAME;
  19. LRESULT NEAR PASCAL InitDragSizeWnd(HWND hWnd, LPCREATESTRUCT lpCreate)
  20. {
  21. PDRAGSIZEINFO pDragSizeInfo;
  22. /* Create the status info struct; abort if it does not exist,
  23. ** otherwise save it in the window structure
  24. */
  25. pDragSizeInfo = ALLOCWINDOWPOINTER(PDRAGSIZEINFO, sizeof(DRAGSIZEINFO));
  26. if (!pDragSizeInfo)
  27. {
  28. return(-1);
  29. }
  30. SETWINDOWPOINTER(hWnd, PDRAGSIZEINFO, pDragSizeInfo);
  31. pDragSizeInfo->lpData = (DWORD_PTR)lpCreate->lpCreateParams;
  32. pDragSizeInfo->bDragging = FALSE;
  33. return(0);
  34. }
  35. /* Track the mouse and send messages to the parent whenever it moves.
  36. */
  37. void NEAR PASCAL DragSize(HWND hWnd, PDRAGSIZEINFO pDragSizeInfo, POINT ptStart)
  38. {
  39. MSG msg;
  40. HWND hwndParent;
  41.         LONG wID;
  42. if (!pDragSizeInfo || pDragSizeInfo->bDragging)
  43. {
  44. return;
  45. }
  46. pDragSizeInfo->bDragging = TRUE;
  47. pDragSizeInfo->ptNow     = ptStart;
  48. SetCapture(hWnd);
  49. hwndParent = GetParent(hWnd);
  50.         wID = GETWINDOWID(hWnd);
  51.         SendMessage(hwndParent, WM_COMMAND, MAKEWPARAM(wID, DSN_BEGINDRAG), (LPARAM)hWnd);
  52. for ( ; ; )
  53. {
  54. if (GetCapture() != hWnd)
  55. {
  56. EndAbort:
  57. /* Abort the process.
  58. */
  59. pDragSizeInfo->ptNow = ptStart;
  60.                         SendMessage(hwndParent, WM_COMMAND, MAKEWPARAM(wID, DSN_DRAGGING), (LPARAM)hWnd);
  61. goto EndAdjust;
  62. }
  63. if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  64. {
  65. continue;
  66. }
  67. switch (msg.message)
  68. {
  69. case WM_KEYDOWN:
  70. switch (msg.wParam)
  71. {
  72. case VK_ESCAPE:
  73. AbortAdjust:
  74. SetCapture(NULL);
  75. goto EndAbort;
  76. default:
  77. break;
  78. }
  79. break;
  80. case WM_KEYUP:
  81. case WM_CHAR:
  82. break;
  83. case WM_LBUTTONDOWN:
  84. /* This shouldn't happen.
  85. */
  86. goto AbortAdjust;
  87. case WM_MOUSEMOVE:
  88.             LPARAM2POINT( msg.lParam, &(pDragSizeInfo->ptNow) );
  89.             
  90.             TraceMsg(TF_GENERAL, "DragSize: ptNow = (%d, %d)n", pDragSizeInfo->ptNow.x, pDragSizeInfo->ptNow.y);
  91.             
  92.             SendMessage(hwndParent, WM_COMMAND, MAKEWPARAM(wID, DSN_DRAGGING), (LPARAM)hWnd);
  93. break;
  94. case WM_LBUTTONUP:
  95. /* All done.
  96. */
  97. SetCapture(NULL);
  98. goto EndAdjust;
  99. case WM_RBUTTONDOWN:
  100. goto AbortAdjust;
  101. default:
  102. TranslateMessage(&msg);
  103. DispatchMessage(&msg);
  104. break;
  105. }
  106. }
  107. EndAdjust:
  108.         SendMessage(hwndParent, WM_COMMAND, MAKEWPARAM(wID, DSN_ENDDRAG), (LPARAM)hWnd);
  109. pDragSizeInfo->bDragging = FALSE;
  110. }
  111. /* Ask the parent to paint the window.
  112. */
  113. void NEAR PASCAL PaintDragSizeWnd(HWND hWnd, PDRAGSIZEINFO pDragSizeInfo)
  114. {
  115. PAINTSTRUCT ps;
  116. DRAWITEMSTRUCT dis;
  117. HDC hDC;
  118. HFONT hOldFont = NULL;
  119. if (!pDragSizeInfo)
  120. {
  121. return;
  122. }
  123. hDC = BeginPaint(hWnd, &ps);
  124. if (pDragSizeInfo->hFont)
  125. {
  126. hOldFont = SelectObject(hDC, pDragSizeInfo->hFont);
  127. }
  128. /* Fill in the DRAWITEMSTRUCT.  Note that some of the fields are
  129. ** undefined.
  130. */
  131. dis.CtlID    = GetDlgCtrlID(hWnd);
  132. dis.hwndItem = hWnd;
  133. dis.hDC      = hDC;
  134. GetClientRect(hWnd, &dis.rcItem);
  135. dis.itemData = pDragSizeInfo->lpData;
  136. SendMessage(GetParent(hWnd), WM_DRAWITEM, GetDlgCtrlID(hWnd),
  137. (LPARAM)(LPDRAWITEMSTRUCT)&dis);
  138. if (hOldFont)
  139. {
  140. SelectObject(hDC, hOldFont);
  141. }
  142. EndPaint(hWnd, &ps);
  143. }
  144. LRESULT CALLBACK DragSizeWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
  145. {
  146. #define lpCreate ((LPCREATESTRUCT)lParam)
  147. PDRAGSIZEINFO pDragSizeInfo;
  148. pDragSizeInfo = GETWINDOWPOINTER(hWnd, PDRAGSIZEINFO);
  149. switch (uMessage)
  150. {
  151. case WM_NCCREATE:
  152.                 SendMessage(lpCreate->hwndParent, WM_COMMAND,
  153.                         MAKEWPARAM((SHORT)(lpCreate->hMenu), DSN_NCCREATE), (LPARAM)hWnd);
  154. break;
  155. case WM_CREATE:
  156. InitDragSizeWnd(hWnd, (LPCREATESTRUCT)lParam);
  157. break;
  158. case WM_DESTROY:
  159. if (pDragSizeInfo)
  160. {
  161. FREEWINDOWPOINTER(pDragSizeInfo);
  162. SETWINDOWPOINTER(hWnd, PDRAGSIZEINFO, NULL);
  163. }
  164. break;
  165.         case WM_LBUTTONDOWN: {
  166.                     POINT pt;
  167.                     LPARAM2POINT( lParam, &pt );
  168.                     DragSize(hWnd, pDragSizeInfo, pt);
  169.                 }
  170.                 break;
  171. case WM_PAINT:
  172. PaintDragSizeWnd(hWnd, pDragSizeInfo);
  173. return(0);
  174. case WM_SETFONT:
  175. if (!pDragSizeInfo)
  176. {
  177. return(1L);
  178. }
  179. pDragSizeInfo->hFont = (HFONT)wParam;
  180. if (LOWORD(lParam))
  181. {
  182. InvalidateRect(hWnd, NULL, TRUE);
  183. UpdateWindow(hWnd);
  184. }
  185. return(0L);
  186. case WM_GETFONT:
  187. if (!pDragSizeInfo)
  188. {
  189.                         return(LRESULT)(NULL);
  190. }
  191. return(MAKELRESULT(pDragSizeInfo->hFont, 0));
  192.         case DSM_DRAGPOS: {
  193.                     LPPOINT lppt = (LPPOINT)lParam;
  194.                     if (!pDragSizeInfo || !pDragSizeInfo->bDragging || lppt == NULL)
  195.                     {
  196.                             return(-1L);
  197.                     }
  198.                     *lppt = pDragSizeInfo->ptNow;
  199.                     return(0);
  200.                 }
  201. break;
  202. default:
  203. break;
  204. }
  205. return(DefWindowProc(hWnd, uMessage, wParam, lParam));
  206. }
  207. BOOL FAR PASCAL InitDragSizeClass(void)
  208. {
  209. WNDCLASS rClass;
  210. if (GetClassInfo(hInstance, szDragSizeClass, &rClass))
  211. {
  212. return(TRUE);
  213. }
  214. rClass.style         = 0;
  215. rClass.lpfnWndProc   = DragSizeWndProc;
  216. rClass.cbClsExtra    = 0;
  217. rClass.cbWndExtra    = sizeof(PDRAGSIZEINFO);
  218. rClass.hInstance     = hInstance;
  219. rClass.hIcon         = NULL;
  220. rClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  221. rClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
  222. rClass.lpszMenuName  = NULL;
  223. rClass.lpszClassName = szDragSizeClass;
  224. return(RegisterClass(&rClass));
  225. }
  226. HWND WINAPI CreateDragSizeWindow(LONG style, int x, int y, int wid, int hgt, HWND hwndParent, LONG wID)
  227. {
  228. /* Create a default window and return
  229. */
  230. return(CreateWindow(szDragSizeClass, g_szNULL, style,
  231. x, y, wid, hgt, hwndParent, (HMENU)wID, hInstance, NULL));
  232. }