coolsb_test.c
上传用户:xhri001
上传日期:2022-07-04
资源大小:99k
文件大小:6k
源码类别:

界面编程

开发平台:

Visual C++

  1. //
  2. // Simple Win32 sample of the Cool Scrollbar Library
  3. // Written by J Brown.
  4. // Freeware
  5. //
  6. #include <windows.h>
  7. #include <commctrl.h>
  8. #include <shlobj.h>
  9. #include "..coolsbcoolscroll.h"
  10. #include "resource.h"
  11. char szAppName[]    = "CoolScroll Demo";
  12. char szChildClass[] = "TestCustCtrl";
  13. HINSTANCE hInstance;
  14. HWND hwndMain;
  15. HWND hwndCtrl;
  16. LRESULT CommandHandler(HWND hwnd, WPARAM wParam, LPARAM lParam);
  17. void InitTest(void);
  18. LRESULT HandleCustomDraw(UINT, NMCSBCUSTOMDRAW *);
  19. int nVScrollMax, nVScrollPos, nVScrollPage;
  20. int nHScrollMax, nHScrollPos, nHScrollPage;
  21. int nVMaxLines = 20;
  22. int nHMaxLines = 80;
  23. int xChar = 10;
  24. int yChar = 10;
  25. void SetupScrollbars(HWND hwnd)
  26. {
  27. SCROLLINFO si;
  28. RECT rect;
  29. GetClientRect(hwnd, &rect);
  30. // VERT
  31. nVScrollPage = min(nVMaxLines + 1, (rect.bottom - rect.top) / yChar);
  32. nVScrollMax  = max(0, nVMaxLines);
  33.     nVScrollPos  = min(nVScrollPos, nVScrollMax - nVScrollPage + 1);
  34. si.cbSize = sizeof(si);
  35. si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_DISABLENOSCROLL;
  36. si.nMin = 0;
  37. si.nMax = nVScrollMax;
  38. si.nPos = nVScrollPos;
  39. si.nPage = min(nVScrollPage, nVScrollMax + 1);
  40. CoolSB_SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
  41. // HORZ
  42. nHScrollPage = min(nHMaxLines + 1, (rect.right - rect.left) / xChar);
  43. nHScrollMax  = max(0, nHMaxLines);
  44.     nHScrollPos  = min(nHScrollPos, nHScrollMax - nHScrollPage + 1);
  45. si.cbSize = sizeof(si);
  46. si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_DISABLENOSCROLL;
  47. si.nMin = 0;
  48. si.nMax = nHScrollMax;
  49. si.nPos = nHScrollPos;
  50. si.nPage = min(nHScrollPage, nHScrollMax + 1);
  51. CoolSB_SetScrollInfo (hwnd, SB_HORZ, &si, TRUE);
  52. }
  53. //
  54. // Child window procedure
  55. //
  56. LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  57. {
  58. static int count;
  59. char ach[80];
  60. switch(msg)
  61. {
  62. case WM_VSCROLL:
  63. switch(LOWORD(wParam))
  64. {
  65. case SB_LINEUP: nVScrollPos --; break;
  66. case SB_LINEDOWN: nVScrollPos ++; break;
  67. case SB_PAGEUP: nVScrollPos -= nVScrollPage; break;
  68. case SB_PAGEDOWN: nVScrollPos += nVScrollPage; break;
  69. case SB_TOP: nVScrollPos = 0; break;
  70. case SB_BOTTOM: nVScrollPos = nVScrollMax -1; break;
  71. case SB_THUMBTRACK: nVScrollPos = HIWORD(wParam); break;
  72. }
  73. wsprintf(ach, "WM_VSCROLL %dn", count++);
  74. OutputDebugString(ach);
  75. if(nVScrollPos < 0) 
  76. nVScrollPos = 0;
  77. if(nVScrollPos > nVScrollMax - nVScrollPage + 1) 
  78. nVScrollPos = nVScrollMax - nVScrollPage + 1;
  79. CoolSB_SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE);
  80. return 0;
  81. case WM_HSCROLL:
  82. wsprintf(ach, "WM_HSCROLL %dn", count++);
  83. OutputDebugString(ach);
  84. switch(LOWORD(wParam))
  85. {
  86. case SB_LINEUP: nHScrollPos --; break;
  87. case SB_LINEDOWN: nHScrollPos ++; break;
  88. case SB_PAGEUP: nHScrollPos -= nHScrollPage; break;
  89. case SB_PAGEDOWN: nHScrollPos += nHScrollPage; break;
  90. case SB_TOP: nHScrollPos = 0; break;
  91. case SB_BOTTOM: nHScrollPos = nHScrollMax -1; break;
  92. case SB_THUMBTRACK: nHScrollPos = HIWORD(wParam); break;
  93. }
  94. if(nHScrollPos < 0) 
  95. nHScrollPos = 0;
  96. if(nHScrollPos > nHScrollMax - nHScrollPage + 1) 
  97. nHScrollPos = nHScrollMax - nHScrollPage + 1;
  98. CoolSB_SetScrollPos(hwnd, SB_HORZ, nHScrollPos, TRUE);
  99. return 0;
  100. case WM_SIZE:
  101. SetupScrollbars(hwnd);
  102. return 0;
  103. }
  104. return DefWindowProc(hwnd, msg, wParam, lParam);
  105. }
  106. //
  107. // Main window procedure
  108. //
  109. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  110. {
  111. int width, height;
  112. NMHDR *hdr = (NMHDR *)lParam;
  113. SCROLLINFO si;
  114. switch(msg)
  115. {
  116. case WM_CREATE:
  117. hwndCtrl   = CreateWindowEx(WS_EX_CLIENTEDGE,
  118. szChildClass, "Test", 
  119. WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
  120. 0,0,0,0, hwnd, 0, GetModuleHandle(0), 0);
  121. InitializeCoolSB(hwndCtrl);
  122. CoolSB_SetStyle(hwndCtrl, SB_BOTH, CSBS_NORMAL);
  123. si.cbSize = sizeof(si);
  124. si.fMask  = SIF_ALL;
  125. si.nMin   = 0;
  126. si.nMax   = 100;
  127. si.nPos   = 0;
  128. si.nPage  = 10;
  129. SetScrollInfo(hwndCtrl, SB_VERT, &si, TRUE);
  130. return 0;
  131. case WM_DESTROY:
  132. PostQuitMessage(0);
  133. return 0;
  134. case WM_CLOSE:
  135. DestroyWindow(hwnd);
  136. return 0;
  137. case WM_SIZE:
  138. width  = (short)LOWORD(lParam);
  139. height = (short)HIWORD(lParam);
  140. MoveWindow(hwndCtrl, 0, 0, width, height, TRUE);
  141. return 0;
  142. case WM_COMMAND:
  143. return CommandHandler(hwnd, wParam, lParam);
  144. case WM_NOTIFY:
  145. if(hdr->code == NM_COOLSB_CUSTOMDRAW)
  146. {
  147. return HandleCustomDraw(wParam, (NMCSBCUSTOMDRAW *)lParam);
  148. }
  149. break;
  150. }
  151. return DefWindowProc(hwnd, msg, wParam, lParam);
  152. }
  153. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int iShowCmd)
  154. {
  155. HWND hwnd;
  156. MSG msg;
  157. WNDCLASSEX wndclass;
  158. hInstance = hInst;
  159. InitTest();
  160. //Window class for the main application parent window
  161. wndclass.cbSize = sizeof(wndclass);
  162. wndclass.style = 0;
  163. wndclass.lpfnWndProc = WndProc;
  164. wndclass.cbClsExtra = 0;
  165. wndclass.cbWndExtra = 0;
  166. wndclass.hInstance = hInstance;
  167. wndclass.hIcon = LoadIcon(0, MAKEINTRESOURCE(IDI_APPLICATION));
  168. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
  169. wndclass.hbrBackground = (HBRUSH)0;
  170. wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
  171. wndclass.lpszClassName = szAppName;
  172. wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  173. RegisterClassEx(&wndclass);
  174. //Window class for the child window 
  175. wndclass.cbSize = sizeof(wndclass);
  176. wndclass.style = 0;
  177. wndclass.lpfnWndProc = ChildWndProc;
  178. wndclass.cbClsExtra = 0;
  179. wndclass.cbWndExtra = 0;
  180. wndclass.hInstance = hInst;
  181. wndclass.hIcon = 0;
  182. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
  183. wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  184. wndclass.lpszMenuName = 0;
  185. wndclass.lpszClassName = szChildClass;
  186. wndclass.hIconSm = 0;
  187. RegisterClassEx(&wndclass);
  188. hwnd = CreateWindowEx(0,
  189. szAppName, // window class name
  190. szAppName, // window caption
  191. WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
  192. CW_USEDEFAULT, // initial x position
  193. CW_USEDEFAULT, // initial y position
  194. 350, // initial x size
  195. 200, // initial y size
  196. NULL, // parent window handle
  197. NULL, // use window class menu
  198. hInstance, // program instance handle
  199. NULL); // creation parameters
  200. hwndMain = hwnd;
  201. ShowWindow(hwnd, iShowCmd);
  202. while(GetMessage(&msg, NULL,0,0))
  203. {
  204. TranslateMessage(&msg);
  205. DispatchMessage(&msg);
  206. }
  207. return 0;
  208. }