• 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是一致的,否则绘制出来的效果可能会错位

  • 相关阅读:
    线性表的各种基本操作
    malloc&&free的系统运行机制及其源代码的理解
    剪枝的定义&&hdu1010
    hdu 1045
    hdu2094 stl之set的应用
    关联式容器的总结
    STL之map容器的详解
    2018-2019 ACM-ICPC 焦作赛区 部分题解
    2018-2019 ACM-ICPC 沈阳赛区 K. Let the Flames Begin
    2018-2019 ACM-ICPC 徐州区域赛 部分题解
  • 原文地址:https://www.cnblogs.com/buffer/p/1410209.html
Copyright © 2020-2023  润新知