zoukankan      html  css  js  c++  java
  • SkinSB皮肤滚动条库的使用

    说明
    ===================================
        您可以使用此滚动条库并且可以跟据需要修改源代码,但请不要随意发布此源代码。请尊重者作原创!
    此皮肤滚动条库可以在Windows标准控件或非标准控件上使用,如果您对此皮肤滚动条有何建议请随及联系作者.

    作者 : 李俊

    E-Mail : notoldtree@126.com  QQ : 154828

    下载地址:http://download.csdn.net/source/1013411

    使用说明
    ====================================

    1.首先将下列文件加入工程:
    detours.h
    detours.lib

    skinsb.h
    skinsb.lib

     
    2.设置API HOOK

    2.1.宣布需要HOOK到的API:

    1. DETOUR_TRAMPOLINE(int   WINAPI SetScrollInfoT(HWNDint, LPCSCROLLINFO, BOOL), SetScrollInfo)   
    2. DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollInfoT(HWNDint, LPSCROLLINFO), GetScrollInfo)   
    3. DETOUR_TRAMPOLINE(int   WINAPI SetScrollPosT(HWNDintintBOOL), SetScrollPos)   
    4. DETOUR_TRAMPOLINE(int   WINAPI GetScrollPosT(HWNDint), GetScrollPos)   
    5. DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollRangeT(HWNDintLPINTLPINT), GetScrollRange)   
    6. DETOUR_TRAMPOLINE(BOOL  WINAPI SetScrollRangeT(HWNDintintintBOOL), SetScrollRange)   
    7. DETOUR_TRAMPOLINE(BOOL  WINAPI ShowScrollBarT(HWNDintBOOL), ShowScrollBar)   
    8. DETOUR_TRAMPOLINE(BOOL  WINAPI EnableScrollBarT(HWNDUINTUINT), EnableScrollBar)  


    2.2.写下列全局函数,将HOOK到的函数的参数传递到skinsb函数中

    1. int WINAPI SetScrollInfoD(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)   
    2. {   
    3.  if( SkinSB_IsValid(hwnd) )   
    4.   return SkinSB_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);   
    5.  else  
    6.   return SetScrollInfoT(hwnd, fnBar, lpsi, bRedraw);   
    7. }   
    8.   
    9. BOOL WINAPI GetScrollInfoD(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)   
    10. {   
    11.  if( SkinSB_IsValid(hwnd) )   
    12.   return SkinSB_GetScrollInfo(hwnd, fnBar, lpsi);   
    13.  else  
    14.   return GetScrollInfoT(hwnd, fnBar, lpsi);   
    15. }   
    16.   
    17. int WINAPI SetScrollPosD(HWND hwnd, int nBar, int nPos, BOOL bRedraw)   
    18. {   
    19.  if( SkinSB_IsValid(hwnd) )   
    20.   return SkinSB_SetScrollPos(hwnd, nBar, nPos, bRedraw);   
    21.  else  
    22.   return SetScrollPosT(hwnd, nBar, nPos, bRedraw);   
    23. }   
    24.   
    25. int WINAPI GetScrollPosD(HWND hwnd, int nBar)   
    26. {   
    27.  if( SkinSB_IsValid(hwnd) )   
    28.   return SkinSB_GetScrollPos(hwnd, nBar);   
    29.  else  
    30.   return GetScrollPosT(hwnd, nBar);   
    31. }   
    32.   
    33. BOOL WINAPI SetScrollRangeD(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw)   
    34. {   
    35.  if( SkinSB_IsValid(hwnd) )   
    36.   return SkinSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);   
    37.  else  
    38.   return SetScrollRangeT(hwnd, nBar, nMinPos, nMaxPos, bRedraw);   
    39. }   
    40.   
    41. BOOL WINAPI GetScrollRangeD(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)   
    42. {   
    43.  if( SkinSB_IsValid(hwnd) )   
    44.   return SkinSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);   
    45.  else  
    46.   return GetScrollRangeT(hwnd, nBar, lpMinPos, lpMaxPos);   
    47. }   
    48.   
    49. BOOL WINAPI ShowScrollBarD(HWND hwnd, int nBar, BOOL bShow)   
    50. {   
    51.  if( SkinSB_IsValid(hwnd) )   
    52.   return SkinSB_ShowScrollBar(hwnd, nBar, bShow);   
    53.  else  
    54.   return ShowScrollBarT(hwnd, nBar, bShow);   
    55. }   
    56.   
    57. BOOL WINAPI EnableScrollBarD(HWND hwnd, UINT wSBflags, UINT wArrows)   
    58. {   
    59.  if( SkinSB_IsValid(hwnd) )   
    60.   return SkinSB_EnableScrollBar(hwnd, wSBflags, wArrows);   
    61.  else  
    62.   return EnableScrollBarT(hwnd, wSBflags, wArrows);   
    63. }  


    2.3.加载API HOOK的代码,最好写在CXXXApp::InitInstance()函数中

    1. DetourFunctionWithTrampoline((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);   
    2. DetourFunctionWithTrampoline((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);   
    3. DetourFunctionWithTrampoline((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);   
    4. DetourFunctionWithTrampoline((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);   
    5. DetourFunctionWithTrampoline((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);   
    6. DetourFunctionWithTrampoline((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);   
    7. DetourFunctionWithTrampoline((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);   
    8. DetourFunctionWithTrampoline((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);  

    2.4.卸载API HOOK,最好写在CXXXApp::ExitInstance()函数中

    1. DetourRemove((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);   
    2. DetourRemove((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);   
    3. DetourRemove((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);   
    4. DetourRemove((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);   
    5. DetourRemove((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);   
    6. DetourRemove((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);   
    7. DetourRemove((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);   
    8. DetourRemove((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);  


    3.skinsb库函数使用说明:
    ====================================

    1. // 初始化窗口滚动条并加载皮肤,这个句柄可以是任何一个带滚动条的窗口,但这个窗口不是滚动条控件本身.   
    2. BOOL WINAPI SkinSB_Init(   
    3.               HWND hwnd,     // 指定一个需要加载皮肤滚动条的窗口句柄   
    4.               HBITMAP hBmp   // 指定一个位图句柄,这是滚动条皮肤位图   
    5. )   
    6.   
    7.   
    8. // 移除窗口的滚动条皮肤,还原系统样式的滚动条   
    9. BOOL WINAPI SkinSB_Uninit(   
    10.               HWND hwnd      // 指定一个需要移除滚动条皮肤的窗口句柄   
    11. )   
    12.   
    13.   
    14. // 检查窗口是否加载了皮肤滚动条   
    15. BOOL WINAPI SkinSB_IsValid(   
    16.               HWND hwnd      // 指定一个窗口句柄   
    17. )   
    18.   
    19. // 下列函数等价于Windows API函数,如果你不需要自已去计算滚动条,可以不用这些函数.   
    20. BOOL WINAPI SkinSB_GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi);   
    21. int  WINAPI SkinSB_SetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO psi, BOOL fRedraw);   
    22. int  WINAPI SkinSB_GetScrollPos(HWND hwnd, int fnBar);   
    23. int  WINAPI SkinSB_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw);   
    24. BOOL WINAPI SkinSB_GetScrollRange(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos);   
    25. BOOL WINAPI SkinSB_SetScrollRange(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw);   
    26. BOOL WINAPI SkinSB_ShowScrollBar(HWND hwnd, int wBar, BOOL fShow);   
    27. BOOL WINAPI SkinSB_EnableScrollBar(HWND hwnd, UINT wSBflags, UINT wArrows);  


    备注:
    1.如果你想自已去计算滚动条,可以省略第2个步骤(设置API HOOK),否则就必须使用API HOOK
    2.滚动条位图中的排例必须是和scroll.bmp是一致的,否则绘制出来的效果可能会错位

  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/buffer/p/1410209.html
Copyright © 2011-2022 走看看