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

界面编程

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include "..coolsbcoolscroll.h"
  4. UINT CALLBACK CoolSB_DrawProc(HDC hdc, UINT uCmdId, UINT uButflags, RECT *rect);
  5. extern HWND hwndScroll;
  6. extern BOOL fCustomDraw  ;
  7. extern BOOL fButtons     ;
  8. extern BOOL fThumbAlways ;
  9. extern HDC hdcSkin;
  10. HPEN hpen, oldpen;
  11. HPEN whitepen;
  12. HFONT hfont;
  13. HENHMETAFILE hemf=0;
  14. typedef struct 
  15. {
  16. int x, y;
  17. int width, height;
  18. } CustomDrawTable;
  19. //
  20. // Define a set of structures which describe
  21. // where-abouts the source "textures" are in the
  22. // custom draw bitmap. We need to know x, y, width and height
  23. // for each scrollbar segment.
  24. //
  25. CustomDrawTable cdt_horz_normal[] = 
  26. {
  27. { 0,  0,  18, 18 }, //left arrow  NORMAL
  28. { 0,  19, 18, 18 }, //right arrow NORMAL
  29. { 0,  83, 1,  18 }, //page left   NORMAL
  30. { 0,  83, 1,  18 }, //page right  NORMAL
  31. { -1, -1, -1, -1 }, //padding
  32. { 54, 0,  9,  18 }, //horz thumb (left)
  33. { 54+9, 0, 1, 18 }, //horz thumb (middle)
  34. { 54+9, 0, 9, 18 }, //horz thumb (right)
  35. };
  36. CustomDrawTable cdt_horz_hot[] = 
  37. {
  38. { 18, 0,  18, 18 }, //left arrow  ACTIVE
  39. { 18, 19, 18, 18 }, //right arrow ACTIVE
  40. { 4,  83, 1,  18 }, //page left   ACTIVE
  41. { 4,  83, 1,  18 }, //page right  ACTIVE
  42. { -1, -1, -1, -1 }, //padding
  43. { 54,   19, 9, 18 }, //horz thumb (left)
  44. { 54+9, 19, 1, 18 }, //horz thumb (middle)
  45. { 54+9, 19, 9, 18 }, //horz thumb (right)
  46. };
  47. CustomDrawTable cdt_horz_active[] = 
  48. {
  49. { 36, 0,  18, 18 }, //left arrow  ACTIVE
  50. { 36, 19, 18, 18 }, //right arrow ACTIVE
  51. { 4,  83, 1,  18 }, //page left   ACTIVE
  52. { 4,  83, 1,  18 }, //page right  ACTIVE
  53. { -1, -1, -1, -1 }, //padding
  54. { 54,   38, 9, 18 }, //horz thumb (left)
  55. { 54+9, 38, 1, 18 }, //horz thumb (middle)
  56. { 54+9, 38, 9, 18 }, //horz thumb (right)
  57. };
  58. CustomDrawTable cdt_vert_normal[] = 
  59. {
  60. { 72, 0,  18, 18 }, //up arrow   NORMAL
  61. { 72, 19, 18, 18 }, //down arrow NORMAL
  62. { 0,  112, 18, 1 }, //page up  NORMAL
  63. { 0,  112, 18, 1 }, //page down  NORMAL
  64. { -1, -1, -1, -1 }, //padding
  65. { 126, 0,  18, 9  }, //vert thumb (left)
  66. { 126, 9,  18, 1  }, //vert thumb (middle)
  67. { 126, 9,  18, 9  }, //vert thumb (right)
  68. };
  69. CustomDrawTable cdt_vert_hot[] = 
  70. {
  71. { 90, 0,  18, 18 }, //up arrow   ACTIVE
  72. { 90, 19, 18, 18 }, //down arrow ACTIVE
  73. { 4,  83, 18, 1  }, //page up  ACTIVE
  74. { 4,  83, 18, 1  }, //page down  ACTIVE
  75. { -1, -1, -1, -1 }, //padding
  76. { 126, 19,  18, 9  }, //vert thumb (left)
  77. { 126, 28,  18, 1  }, //vert thumb (middle)
  78. { 126, 28,  18, 9  }, //vert thumb (right)
  79. };
  80. CustomDrawTable cdt_vert_active[] = 
  81. {
  82. { 108, 0,  18, 18 }, //up arrow   ACTIVE
  83. { 108, 19, 18, 18 }, //down arrow ACTIVE
  84. { 4,  83, 18, 1  }, //page up  ACTIVE
  85. { 4,  83, 18, 1  }, //page down  ACTIVE
  86. { -1, -1, -1, -1 }, //padding
  87. { 126, 38,  18, 9  }, //vert thumb (left)
  88. { 126, 47,  18, 1  }, //vert thumb (middle)
  89. { 126, 47,  18, 9  }, //vert thumb (right)
  90. };
  91. LRESULT HandleCustomDraw(UINT ctrlid, NMCSBCUSTOMDRAW *nm)
  92. {
  93. RECT *rc;
  94. CustomDrawTable *cdt;
  95. UINT code = NM_CUSTOMDRAW;
  96. UNREFERENCED_PARAMETER(ctrlid);
  97. // inserted buttons do not use PREPAINT etc..
  98. if(nm->nBar == SB_INSBUT)
  99. {
  100. CoolSB_DrawProc(nm->hdc, nm->uItem, nm->uState, &nm->rect);
  101. return CDRF_SKIPDEFAULT;
  102. }
  103. if(!fCustomDraw) return CDRF_DODEFAULT;
  104. if(nm->dwDrawStage == CDDS_PREPAINT)
  105. {
  106. if(fCustomDraw)
  107. return CDRF_SKIPDEFAULT;
  108. else
  109. return CDRF_DODEFAULT;
  110. }
  111. if(nm->dwDrawStage == CDDS_POSTPAINT)
  112. {
  113. }
  114. //the sizing gripper in the bottom-right corner
  115. if(nm->nBar == SB_BOTH)
  116. {
  117. RECT *rc = &nm->rect;
  118. StretchBlt(nm->hdc, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top,
  119. hdcSkin, 100, 100, 18, 18, SRCCOPY);
  120. return CDRF_SKIPDEFAULT;
  121. }
  122. else if(nm->nBar == SB_HORZ)
  123. {
  124. rc = &nm->rect;
  125. if(nm->uState == CDIS_HOT)
  126. cdt = &cdt_horz_hot[nm->uItem];
  127. else if(nm->uState == CDIS_SELECTED) 
  128. cdt = &cdt_horz_active[nm->uItem];
  129. else    
  130. cdt = &cdt_horz_normal[nm->uItem];
  131. if(nm->uItem == HTSCROLL_THUMB)
  132. {
  133. StretchBlt(nm->hdc, rc->left,   rc->top, 9, rc->bottom-rc->top, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  134. cdt++;
  135. StretchBlt(nm->hdc, rc->left+9, rc->top, (rc->right-rc->left)-18, rc->bottom-rc->top, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  136. cdt++;
  137. StretchBlt(nm->hdc, rc->left+(rc->right-rc->left)-9, rc->top, 9, rc->bottom-rc->top, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  138. return CDRF_SKIPDEFAULT;
  139. }
  140. }
  141. else if(nm->nBar == SB_VERT)
  142. {
  143. rc = &nm->rect;
  144. if(nm->uState == CDIS_HOT)
  145. cdt = &cdt_vert_hot[nm->uItem];
  146. else if(nm->uState == CDIS_SELECTED)  
  147. cdt = &cdt_vert_active[nm->uItem];
  148. else     
  149. cdt = &cdt_vert_normal[nm->uItem];
  150. if(nm->uItem == HTSCROLL_THUMB)
  151. {
  152. StretchBlt(nm->hdc, rc->left, rc->top,   rc->right-rc->left, 9, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  153. cdt++;
  154. StretchBlt(nm->hdc, rc->left, rc->top+9, rc->right-rc->left, (rc->bottom-rc->top)-18, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  155. cdt++;
  156. StretchBlt(nm->hdc, rc->left, rc->top+(rc->bottom-rc->top)-9, rc->right-rc->left, 9,hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  157. return CDRF_SKIPDEFAULT;
  158. }
  159. }
  160. //INSERTED BUTTONS are handled here...
  161. else if(nm->nBar == SB_INSBUT)
  162. {
  163. CoolSB_DrawProc(nm->hdc, nm->uItem, nm->uState, &nm->rect);
  164. return CDRF_SKIPDEFAULT;
  165. }
  166. else
  167. {
  168. return CDRF_DODEFAULT;
  169. }
  170. //normal bitmaps, use same code for HORZ and VERT
  171. StretchBlt(nm->hdc, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top,
  172. hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  173. return CDRF_SKIPDEFAULT;
  174. }
  175. void DrawTab(HDC hdcEMF, int x, int tabwidth, int tabheight, int xslope, BOOL active)
  176. {
  177. POINT pts[4];
  178. pts[0].x = x + 0;
  179. pts[0].y = 0;
  180. pts[1].x = x + xslope;
  181. pts[1].y = tabheight;
  182. pts[2].x = x + tabwidth - xslope;
  183. pts[2].y = tabheight;
  184. pts[3].x = x + tabwidth;
  185. pts[3].y = 0;
  186. if(active)
  187. SelectObject(hdcEMF, GetStockObject(WHITE_BRUSH));
  188. else
  189. SelectObject(hdcEMF, GetSysColorBrush(COLOR_3DFACE));
  190. Polygon(hdcEMF, pts, 4);
  191. oldpen = SelectObject(hdcEMF, hpen);
  192. MoveToEx(hdcEMF, pts[1].x+1, pts[1].y, 0);
  193. LineTo(hdcEMF, pts[2].x, pts[2].y);
  194. if(active)
  195. SelectObject(hdcEMF, whitepen);
  196. MoveToEx(hdcEMF, pts[3].x - 1, pts[3].y, 0);
  197. LineTo(hdcEMF, pts[0].x, pts[0].y);
  198. SelectObject(hdcEMF, oldpen);
  199. }
  200. //
  201. // Draw a series of "tabs" into a meta-file,
  202. // which we will use to custom-draw one of the inserted
  203. //  scrollbar buttons
  204. //
  205. void InitMetaFile(void)
  206. {
  207. HDC hdcEMF;
  208. RECT rect;
  209. int totalwidth = 120;
  210. int width = 110, height = GetSystemMetrics(SM_CYHSCROLL);
  211. LOGFONT lf;
  212. POINT pts[4];
  213. int tabwidth = 40, tabxslope = 5;
  214. pts[0].x = 0;
  215. pts[0].y = 0;
  216. pts[1].x = tabxslope;
  217. pts[1].y = height - 1;
  218. pts[2].x = tabwidth - tabxslope;
  219. pts[2].y = height - 1;
  220. pts[3].x = tabwidth;
  221. pts[3].y = 0;
  222. hpen = CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
  223. whitepen = CreatePen(PS_INSIDEFRAME,0,RGB(0xff,0xff,0xff));
  224. SetRect(&rect, 0, 0, totalwidth, height+1);
  225. hdcEMF = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
  226. ZeroMemory(&lf, sizeof(lf));
  227. lf.lfHeight = -MulDiv(7, GetDeviceCaps(hdcEMF, LOGPIXELSY), 72);
  228. lf.lfPitchAndFamily = DEFAULT_PITCH;
  229. lf.lfCharSet = ANSI_CHARSET;
  230. lstrcpy(lf.lfFaceName, "Arial");//Small fonts");
  231. hfont = CreateFontIndirect(&lf);
  232. pts[0].x = 0;
  233. pts[0].y = 0;
  234. pts[1].x = tabxslope;
  235. pts[1].y = height - 1;
  236. pts[2].x = tabwidth - tabxslope;
  237. pts[2].y = height - 1;
  238. pts[3].x = tabwidth;
  239. pts[3].y = 0;
  240. FillRect  (hdcEMF, &rect, GetSysColorBrush(COLOR_3DFACE));//GetStockObject(WHITE_BRUSH);
  241. //fit as many lines in as space permits
  242. SelectObject(hdcEMF, GetSysColorBrush(COLOR_3DFACE));
  243. DrawTab(hdcEMF, width-tabwidth, tabwidth, height - 1, tabxslope, FALSE);
  244. DrawTab(hdcEMF, width-tabwidth-tabwidth+tabxslope, tabwidth, height - 1, tabxslope, FALSE);
  245. DrawTab(hdcEMF, 0, tabwidth, height - 1, tabxslope, TRUE);
  246. SelectObject(hdcEMF, hpen);
  247. MoveToEx(hdcEMF, 110, 0, 0);
  248. LineTo(hdcEMF, totalwidth, 0);
  249. SelectObject(hdcEMF, hfont);
  250. SetBkMode(hdcEMF, TRANSPARENT);
  251. TextOut(hdcEMF, 10,1, "Build", 5);
  252. TextOut(hdcEMF, 42,1, "Debug", 5);
  253. TextOut(hdcEMF, 78,1, "Result", 6);
  254. SelectObject(hdcEMF, oldpen);
  255. DeleteObject(hpen);
  256. DeleteObject(whitepen);
  257. hemf  = CloseEnhMetaFile(hdcEMF);
  258. }
  259. //
  260. // function for drawing the custom-draw inserted buttons
  261. // Called from the WM_NOTIFY handler (HandleCustomDraw)
  262. //
  263. UINT CALLBACK CoolSB_DrawProc(HDC hdc, UINT uCmdId, UINT uButflags, RECT *rect)
  264. {
  265. RECT rc;
  266. POINT pt;
  267. HPEN hpen, hold;
  268. HBITMAP hbm, oldbm;
  269. HDC hdcmem;
  270. if(hemf == 0)
  271. InitMetaFile();
  272. SetRect(&rc, 0, 0, 120, rect->bottom-rect->top);
  273. hdcmem = CreateCompatibleDC(hdc);
  274. hbm = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
  275. oldbm = SelectObject(hdcmem, hbm);
  276. SetWindowOrgEx(hdc, -rect->left, -rect->top, &pt);
  277. PlayEnhMetaFile(hdcmem, hemf, &rc);
  278. BitBlt(hdc, 0, 0, rc.right, rc.bottom, hdcmem, 0, 0, SRCCOPY);
  279. SetRect(&rc, 120, 0, rect->right-rect->left, rect->bottom-rect->top);
  280. FillRect(hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
  281. hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW));
  282. hold = SelectObject(hdc, hpen);
  283. MoveToEx(hdc, 120, 0, 0);
  284. LineTo(hdc, rect->right-rect->left, 0);
  285. SetWindowOrgEx(hdc, pt.x, pt.y, 0);
  286. SelectObject(hdc, hold);
  287. SelectObject(hdcmem, oldbm);
  288. DeleteObject(hbm);
  289. DeleteDC(hdcmem);
  290. DeleteObject(hpen);
  291. UNREFERENCED_PARAMETER(uButflags);
  292. UNREFERENCED_PARAMETER(uCmdId);
  293. return 0;
  294. }