CUSTDRAW.CPP
上传用户:popouu88
上传日期:2013-02-11
资源大小:2894k
文件大小:10k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. #include "../stdafx.h"
  2. #include "coolscroll.h"
  3. #include "detours.h"
  4. extern HDC hdcSkin;
  5. typedef struct 
  6. {
  7. int x, y;
  8. int width, height;
  9. } CustomDrawTable;
  10. // Define a set of structures which describe
  11. // where-abouts the source "textures" are in the
  12. // custom draw bitmap. We need to know x, y, width and height
  13. // for each scrollbar segment.
  14. CustomDrawTable cdt_horz_normal[] = 
  15. {
  16. { 0,  0,  18, 18 }, //left arrow  NORMAL
  17. { 0,  19, 18, 18 }, //right arrow NORMAL
  18. { 0,  83, 1,  18 }, //page left   NORMAL
  19. { 0,  83, 1,  18 }, //page right  NORMAL
  20. { -1, -1, -1, -1 }, //padding
  21. { 54, 0,  9,  18 }, //horz thumb (left)
  22. { 54+9, 0, 1, 18 }, //horz thumb (middle)
  23. { 54+9, 0, 9, 18 }, //horz thumb (right)
  24. };
  25. CustomDrawTable cdt_horz_hot[] = 
  26. {
  27. { 18, 0,  18, 18 }, //left arrow  ACTIVE
  28. { 18, 19, 18, 18 }, //right arrow ACTIVE
  29. { 4,  83, 1,  18 }, //page left   ACTIVE
  30. { 4,  83, 1,  18 }, //page right  ACTIVE
  31. { -1, -1, -1, -1 }, //padding
  32. { 54,   19, 9, 18 }, //horz thumb (left)
  33. { 54+9, 19, 1, 18 }, //horz thumb (middle)
  34. { 54+9, 19, 9, 18 }, //horz thumb (right)
  35. };
  36. CustomDrawTable cdt_horz_active[] = 
  37. {
  38. { 36, 0,  18, 18 }, //left arrow  ACTIVE
  39. { 36, 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,   38, 9, 18 }, //horz thumb (left)
  44. { 54+9, 38, 1, 18 }, //horz thumb (middle)
  45. { 54+9, 38, 9, 18 }, //horz thumb (right)
  46. };
  47. CustomDrawTable cdt_vert_normal[] = 
  48. {
  49. { 72, 0,  18, 18 }, //up arrow   NORMAL
  50. { 72, 19, 18, 18 }, //down arrow NORMAL
  51. { 0,  112, 18, 1 }, //page up  NORMAL
  52. { 0,  112, 18, 1 }, //page down  NORMAL
  53. { -1, -1, -1, -1 }, //padding
  54. { 126, 0,  18, 9  }, //vert thumb (left)
  55. { 126, 9,  18, 1  }, //vert thumb (middle)
  56. { 126, 9,  18, 9  }, //vert thumb (right)
  57. };
  58. CustomDrawTable cdt_vert_hot[] = 
  59. {
  60. { 90, 0,  18, 18 }, //up arrow   ACTIVE
  61. { 90, 19, 18, 18 }, //down arrow ACTIVE
  62. { 4,  83, 18, 1  }, //page up  ACTIVE
  63. { 4,  83, 18, 1  }, //page down  ACTIVE
  64. { -1, -1, -1, -1 }, //padding
  65. { 126, 19,  18, 9  }, //vert thumb (left)
  66. { 126, 28,  18, 1  }, //vert thumb (middle)
  67. { 126, 28,  18, 9  }, //vert thumb (right)
  68. };
  69. CustomDrawTable cdt_vert_active[] = 
  70. {
  71. { 108, 0,  18, 18 }, //up arrow   ACTIVE
  72. { 108, 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, 38,  18, 9  }, //vert thumb (left)
  77. { 126, 47,  18, 1  }, //vert thumb (middle)
  78. { 126, 47,  18, 9  }, //vert thumb (right)
  79. };
  80. LRESULT HandleCustomDraw(UINT ctrlid, NMCSBCUSTOMDRAW *nm)
  81. {
  82. RECT *rc;
  83. CustomDrawTable *cdt;
  84. UINT code = NM_CUSTOMDRAW;
  85. UNREFERENCED_PARAMETER(ctrlid);
  86. if(nm->dwDrawStage == CDDS_PREPAINT)
  87. return CDRF_SKIPDEFAULT;
  88. //the sizing gripper in the bottom-right corner
  89. if(nm->nBar == SB_BOTH)
  90. {
  91. RECT *rc = &nm->rect;
  92. StretchBlt(nm->hdc, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top,
  93. hdcSkin, 100, 100, 18, 18, SRCCOPY);
  94. return CDRF_SKIPDEFAULT;
  95. }
  96. else if(nm->nBar == SB_HORZ)
  97. {
  98. rc = &nm->rect;
  99. if(nm->uState == CDIS_HOT)
  100. cdt = &cdt_horz_hot[nm->uItem];
  101. else if(nm->uState == CDIS_SELECTED) 
  102. cdt = &cdt_horz_active[nm->uItem];
  103. else    
  104. cdt = &cdt_horz_normal[nm->uItem];
  105. if(nm->uItem == HTSCROLL_THUMB)
  106. {
  107. StretchBlt(nm->hdc, rc->left,   rc->top, 9, rc->bottom-rc->top, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  108. cdt++;
  109. 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);
  110. cdt++;
  111. 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);
  112. return CDRF_SKIPDEFAULT;
  113. }
  114. }
  115. else if(nm->nBar == SB_VERT)
  116. {
  117. rc = &nm->rect;
  118. if(nm->uState == CDIS_HOT)
  119. cdt = &cdt_vert_hot[nm->uItem];
  120. else if(nm->uState == CDIS_SELECTED)  
  121. cdt = &cdt_vert_active[nm->uItem];
  122. else     
  123. cdt = &cdt_vert_normal[nm->uItem];
  124. if(nm->uItem == HTSCROLL_THUMB)
  125. {
  126. StretchBlt(nm->hdc, rc->left, rc->top,   rc->right-rc->left, 9, hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  127. cdt++;
  128. 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);
  129. cdt++;
  130. 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);
  131. return CDRF_SKIPDEFAULT;
  132. }
  133. }
  134. else
  135. {
  136. return CDRF_DODEFAULT;
  137. }
  138. //normal bitmaps, use same code for HORZ and VERT
  139. StretchBlt(nm->hdc, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top,
  140. hdcSkin, cdt->x, cdt->y, cdt->width, cdt->height, SRCCOPY);
  141. return CDRF_SKIPDEFAULT;
  142. }
  143. //////////////////////////////////////////////////////
  144. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_EnableScrollBar(HWND hwnd, int wSBflags, UINT wArrows), EnableScrollBar);
  145. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi), GetScrollInfo);
  146. DETOUR_TRAMPOLINE(int  WINAPI Detour_GetScrollPos (HWND hwnd, int nBar), GetScrollPos);
  147. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_GetScrollRange (HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos), GetScrollRange);
  148. DETOUR_TRAMPOLINE(int  WINAPI Detour_SetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw), SetScrollInfo);
  149. DETOUR_TRAMPOLINE(int  WINAPI Detour_SetScrollPos (HWND hwnd, int nBar, int nPos, BOOL fRedraw), SetScrollPos);
  150. DETOUR_TRAMPOLINE(int  WINAPI Detour_SetScrollRange (HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw), SetScrollRange);
  151. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_ShowScrollBar (HWND hwnd, int wBar, BOOL fShow), ShowScrollBar);
  152. static BOOL WINAPI Tramp_EnableScrollBar(HWND hwnd, int wSBflags, UINT wArrows)
  153. {
  154. if(CoolSB_IsCoolScrollEnabled(hwnd))
  155. return CoolSB_EnableScrollBar(hwnd, wSBflags, wArrows);
  156. else
  157. return Detour_EnableScrollBar(hwnd, wSBflags, wArrows);
  158. }
  159. static BOOL WINAPI Tramp_GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
  160. {
  161. if(CoolSB_IsCoolScrollEnabled(hwnd))
  162. return CoolSB_GetScrollInfo(hwnd, fnBar, lpsi);
  163. else
  164. return Detour_GetScrollInfo(hwnd, fnBar, lpsi);
  165. }
  166. static int  WINAPI Tramp_GetScrollPos(HWND hwnd, int nBar)
  167. {
  168. if(CoolSB_IsCoolScrollEnabled(hwnd))
  169. return CoolSB_GetScrollPos(hwnd, nBar);
  170. else
  171. return Detour_GetScrollPos(hwnd, nBar);
  172. }
  173. static BOOL WINAPI Tramp_GetScrollRange(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
  174. {
  175. if(CoolSB_IsCoolScrollEnabled(hwnd))
  176. return CoolSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
  177. else
  178. return Detour_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
  179. }
  180. static int  WINAPI Tramp_SetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw)
  181. {
  182. if(CoolSB_IsCoolScrollEnabled(hwnd))
  183. return CoolSB_SetScrollInfo(hwnd, fnBar, lpsi, fRedraw);
  184. else
  185. return Detour_SetScrollInfo(hwnd, fnBar, lpsi, fRedraw);
  186. }
  187. static int  WINAPI Tramp_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw)
  188. {
  189. if(CoolSB_IsCoolScrollEnabled(hwnd))
  190. return CoolSB_SetScrollPos(hwnd, nBar, nPos, fRedraw);
  191. else
  192. return Detour_SetScrollPos(hwnd, nBar, nPos, fRedraw);
  193. }
  194. static int  WINAPI Tramp_SetScrollRange(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw)
  195. {
  196. if(CoolSB_IsCoolScrollEnabled(hwnd))
  197. return CoolSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, fRedraw);
  198. else
  199. return Detour_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, fRedraw);
  200. }
  201. static BOOL WINAPI Tramp_ShowScrollBar (HWND hwnd, int wBar, BOOL fShow)
  202. {
  203. if(CoolSB_IsCoolScrollEnabled(hwnd))
  204. return CoolSB_ShowScrollBar(hwnd, wBar, fShow);
  205. else
  206. return Detour_ShowScrollBar(hwnd, wBar, fShow);
  207. }
  208. BOOL WINAPI CoolSB_InitializeApp(void)
  209. {
  210. DWORD dwVersion = GetVersion();
  211. // Only available under Windows NT, 2000 and XP
  212. if(dwVersion < 0x80000000)
  213. {
  214. DetourFunctionWithTrampoline((PBYTE)Detour_EnableScrollBar, (PBYTE)Tramp_EnableScrollBar);
  215. DetourFunctionWithTrampoline((PBYTE)Detour_GetScrollInfo,   (PBYTE)Tramp_GetScrollInfo);
  216. DetourFunctionWithTrampoline((PBYTE)Detour_GetScrollPos,    (PBYTE)Tramp_GetScrollPos);
  217. DetourFunctionWithTrampoline((PBYTE)Detour_GetScrollRange,  (PBYTE)Tramp_GetScrollRange);
  218. DetourFunctionWithTrampoline((PBYTE)Detour_SetScrollInfo,   (PBYTE)Tramp_SetScrollInfo);
  219. DetourFunctionWithTrampoline((PBYTE)Detour_SetScrollPos,    (PBYTE)Tramp_SetScrollPos);
  220. DetourFunctionWithTrampoline((PBYTE)Detour_SetScrollRange,  (PBYTE)Tramp_SetScrollRange);
  221. DetourFunctionWithTrampoline((PBYTE)Detour_ShowScrollBar,   (PBYTE)Tramp_ShowScrollBar);
  222. // don't actually use this feature within coolsb yet, but we might need it
  223. CoolSB_SetESBProc(Detour_EnableScrollBar);
  224. return TRUE;
  225. }
  226. else
  227. {
  228. return FALSE;
  229. }
  230. }
  231. BOOL WINAPI CoolSB_UninitializeApp(void)
  232. {
  233. DWORD dwVersion = GetVersion();
  234. // Only available under Windows NT, 2000 and XP
  235. if(dwVersion < 0x80000000)
  236. {
  237. DetourRemove((PBYTE)Detour_EnableScrollBar, (PBYTE)Tramp_EnableScrollBar);
  238. DetourRemove((PBYTE)Detour_GetScrollInfo,   (PBYTE)Tramp_GetScrollInfo);
  239. DetourRemove((PBYTE)Detour_GetScrollPos,    (PBYTE)Tramp_GetScrollPos);
  240. DetourRemove((PBYTE)Detour_GetScrollRange,  (PBYTE)Tramp_GetScrollRange);
  241. DetourRemove((PBYTE)Detour_SetScrollInfo,   (PBYTE)Tramp_SetScrollInfo);
  242. DetourRemove((PBYTE)Detour_SetScrollPos,    (PBYTE)Tramp_SetScrollPos);
  243. DetourRemove((PBYTE)Detour_SetScrollRange,  (PBYTE)Tramp_SetScrollRange);
  244. DetourRemove((PBYTE)Detour_ShowScrollBar,   (PBYTE)Tramp_ShowScrollBar);
  245. // don't actually use this feature within coolsb yet, but we might need it
  246. CoolSB_SetESBProc(EnableScrollBar);
  247. return TRUE;
  248. }
  249. else
  250. {
  251. return FALSE;
  252. }
  253. }