说明.txt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. 说明
  2. ===================================
  3. 您可以使用此滚动条库并且可以跟据需要修改源代码,但请不要随意发布此源代码。请尊重者作原创!
  4. 此皮肤滚动条库可以在Windows标准控件或非标准控件上使用,如果您对此皮肤滚动条有何建议请随及联系作者.
  5. 作者 : 李俊
  6. E-Mail : notoldtree@126.com QQ : 154828
  7. 使用说明
  8. ====================================
  9. 1.首先将下列文件加入工程:
  10. detours.h
  11. detours.lib
  12. skinsb.h
  13. skinsb.lib
  14. 2.设置API HOOK
  15. 2.1.宣布需要HOOK到的API:
  16. DETOUR_TRAMPOLINE(int WINAPI SetScrollInfoT(HWND, int, LPCSCROLLINFO, BOOL), SetScrollInfo)
  17. DETOUR_TRAMPOLINE(BOOL WINAPI GetScrollInfoT(HWND, int, LPSCROLLINFO), GetScrollInfo)
  18. DETOUR_TRAMPOLINE(int WINAPI SetScrollPosT(HWND, int, int, BOOL), SetScrollPos)
  19. DETOUR_TRAMPOLINE(int WINAPI GetScrollPosT(HWND, int), GetScrollPos)
  20. DETOUR_TRAMPOLINE(BOOL WINAPI GetScrollRangeT(HWND, int, LPINT, LPINT), GetScrollRange)
  21. DETOUR_TRAMPOLINE(BOOL WINAPI SetScrollRangeT(HWND, int, int, int, BOOL), SetScrollRange)
  22. DETOUR_TRAMPOLINE(BOOL WINAPI ShowScrollBarT(HWND, int, BOOL), ShowScrollBar)
  23. DETOUR_TRAMPOLINE(BOOL WINAPI EnableScrollBarT(HWND, UINT, UINT), EnableScrollBar)
  24. 2.2.写下列全局函数,将HOOK到的函数的参数传递到skinsb函数中
  25. int WINAPI SetScrollInfoD(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
  26. {
  27. if( SkinSB_IsValid(hwnd) )
  28. return SkinSB_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);
  29. else
  30. return SetScrollInfoT(hwnd, fnBar, lpsi, bRedraw);
  31. }
  32. BOOL WINAPI GetScrollInfoD(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
  33. {
  34. if( SkinSB_IsValid(hwnd) )
  35. return SkinSB_GetScrollInfo(hwnd, fnBar, lpsi);
  36. else
  37. return GetScrollInfoT(hwnd, fnBar, lpsi);
  38. }
  39. int WINAPI SetScrollPosD(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
  40. {
  41. if( SkinSB_IsValid(hwnd) )
  42. return SkinSB_SetScrollPos(hwnd, nBar, nPos, bRedraw);
  43. else
  44. return SetScrollPosT(hwnd, nBar, nPos, bRedraw);
  45. }
  46. int WINAPI GetScrollPosD(HWND hwnd, int nBar)
  47. {
  48. if( SkinSB_IsValid(hwnd) )
  49. return SkinSB_GetScrollPos(hwnd, nBar);
  50. else
  51. return GetScrollPosT(hwnd, nBar);
  52. }
  53. BOOL WINAPI SetScrollRangeD(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw)
  54. {
  55. if( SkinSB_IsValid(hwnd) )
  56. return SkinSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
  57. else
  58. return SetScrollRangeT(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
  59. }
  60. BOOL WINAPI GetScrollRangeD(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
  61. {
  62. if( SkinSB_IsValid(hwnd) )
  63. return SkinSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
  64. else
  65. return GetScrollRangeT(hwnd, nBar, lpMinPos, lpMaxPos);
  66. }
  67. BOOL WINAPI ShowScrollBarD(HWND hwnd, int nBar, BOOL bShow)
  68. {
  69. if( SkinSB_IsValid(hwnd) )
  70. return SkinSB_ShowScrollBar(hwnd, nBar, bShow);
  71. else
  72. return ShowScrollBarT(hwnd, nBar, bShow);
  73. }
  74. BOOL WINAPI EnableScrollBarD(HWND hwnd, UINT wSBflags, UINT wArrows)
  75. {
  76. if( SkinSB_IsValid(hwnd) )
  77. return SkinSB_EnableScrollBar(hwnd, wSBflags, wArrows);
  78. else
  79. return EnableScrollBarT(hwnd, wSBflags, wArrows);
  80. }
  81. 2.3.加载API HOOK的代码,最好写在CXXXApp::InitInstance()函数中
  82. DetourFunctionWithTrampoline((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
  83. DetourFunctionWithTrampoline((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
  84. DetourFunctionWithTrampoline((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
  85. DetourFunctionWithTrampoline((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
  86. DetourFunctionWithTrampoline((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
  87. DetourFunctionWithTrampoline((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
  88. DetourFunctionWithTrampoline((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
  89. DetourFunctionWithTrampoline((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
  90. 2.4.卸载API HOOK,最好写在CXXXApp::ExitInstance()函数中
  91. DetourRemove((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
  92. DetourRemove((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
  93. DetourRemove((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
  94. DetourRemove((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
  95. DetourRemove((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
  96. DetourRemove((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
  97. DetourRemove((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
  98. DetourRemove((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
  99. 3.skinsb库函数使用说明:
  100. ====================================
  101. // 初始化窗口滚动条并加载皮肤,这个句柄可以是任何一个带滚动条的窗口,但这个窗口不是滚动条控件本身.
  102. BOOL WINAPI SkinSB_Init(
  103. HWND hwnd, // 指定一个需要加载皮肤滚动条的窗口句柄
  104. HBITMAP hBmp // 指定一个位图句柄,这是滚动条皮肤位图
  105. )
  106. // 移除窗口的滚动条皮肤,还原系统样式的滚动条
  107. BOOL WINAPI SkinSB_Uninit(
  108. HWND hwnd // 指定一个需要移除滚动条皮肤的窗口句柄
  109. )
  110. // 检查窗口是否加载了皮肤滚动条
  111. BOOL WINAPI SkinSB_IsValid(
  112. HWND hwnd // 指定一个窗口句柄
  113. )
  114. // 下列函数等价于Windows API函数,如果你不需要自已去计算滚动条,可以不用这些函数.
  115. BOOL WINAPI SkinSB_GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi);
  116. int WINAPI SkinSB_SetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO psi, BOOL fRedraw);
  117. int WINAPI SkinSB_GetScrollPos(HWND hwnd, int fnBar);
  118. int WINAPI SkinSB_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw);
  119. BOOL WINAPI SkinSB_GetScrollRange(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos);
  120. BOOL WINAPI SkinSB_SetScrollRange(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw);
  121. BOOL WINAPI SkinSB_ShowScrollBar(HWND hwnd, int wBar, BOOL fShow);
  122. BOOL WINAPI SkinSB_EnableScrollBar(HWND hwnd, UINT wSBflags, UINT wArrows);
  123. 备注:
  124. 1.如果你想自已去计算滚动条,可以省略第2个步骤(设置API HOOK),否则就必须使用API HOOK
  125. 2.滚动条位图中的排例必须是和scroll.bmp是一致的,否则绘制出来的效果可能会错位