编辑框滚动条的处理 基于SkinSB皮肤滚动条美化源码的改进版本,完美支持x64

本文介绍了将SkinSB皮肤滚动条美化库改造成支持x64平台的过程,主要解决了detours库在x64下的不适用问题,采用mhook库作为替代。通过定义和加载钩子函数,实现了对滚动条操作的拦截和自定义处理,确保在64位环境下正常工作。提供了解决方案的源码下载链接。
摘要由CSDN通过智能技术生成

基于SkinSB皮肤滚动条美化源码的改进版本,完美支持x64

2012年08月10日 23:36:18
阅读数:4082

前言

大家知道,win32窗口的内置滚动自绘是个非常棘手的问题,在写这篇文章之前首先感谢下CSDN的mynamelj,他写的那个SkinSB开源的时候我就开始使用来美化一般win32窗口的滚动条,很好用,但是最近有想把自己的应用迁移到x64平台的想法,所以必须把全部源码编译成64位的版本,以便能在win 64位下获得最佳性能,好了废话不多说,继续往下看。

改进SkinSB:

当时遇到两大难题,第一个是API钩子库detours在X64下用不了,第二个是skinsb自有源码小部分不适应64位。

对于第一个难题,当时到微软网站看了下其实detours 3.0版本有支持64位的,但是不是免费的,收费$9999一套,相当于7万RMB左右,这费用我等实在付不起,只好另找其他方法,经同事介绍mhook库,稍微看了下也是开源的,使用方法也很方便,就两个函数,一个Mhook_SetHook加载API钩子,一个Mhook_Unhook

首先申明自己自定义的钩子函数:

[cpp]  view plain  copy
  1. //包含头文件  
  2. #include "../mhook/mhook.h"  
  3. #include "../skinsb/skinsb.h"  
  4.   
  5. #ifdef _DEBUG  
  6. #define new DEBUG_NEW  
  7. #endif  
  8.   
  9. static int (WINAPI * TrueSetScrollInfo)(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw) = SetScrollInfo;  
  10. static BOOL (WINAPI * TrueGetScrollInfo)(HWND hwnd, int fnBar, LPSCROLLINFO lpsi) = GetScrollInfo;  
  11. static int (WINAPI * TrueSetScrollPos)(HWND hwnd, int nBar, int nPos, BOOL bRedraw) = SetScrollPos;  
  12. static int (WINAPI * TrueGetScrollPos)(HWND hwnd, int nBar) = GetScrollPos;  
  13. static BOOL (WINAPI * TrueSetScrollRange)(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw) = SetScrollRange;  
  14. static BOOL (WINAPI * TrueGetScrollRange)(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos) = GetScrollRange;  
  15. static BOOL (WINAPI * TrueShowScrollBar)(HWND hwnd, int nBar, BOOL bShow) = ShowScrollBar;  
  16. static BOOL (WINAPI * TrueEnableScrollBar)(HWND hwnd, UINT wSBflags, UINT wArrows) = EnableScrollBar;  
  17.   
  18. int WINAPI SetScrollInfoD(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)  
  19. {  
  20.     if( SkinSB_IsValid(hwnd) )  
  21.         return SkinSB_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);  
  22.     else  
  23.         return TrueSetScrollInfo(hwnd, fnBar, lpsi, bRedraw);  
  24. }  
  25.   
  26. BOOL WINAPI GetScrollInfoD(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)  
  27. {  
  28.     if( SkinSB_IsValid(hwnd) )  
  29.         return SkinSB_GetScrollInfo(hwnd, fnBar, lpsi);  
  30.     else  
  31.         return TrueGetScrollInfo(hwnd, fnBar, lpsi);  
  32. }  
  33.   
  34. int WINAPI SetScrollPosD(HWND hwnd, int nBar, int nPos, BOOL bRedraw)  
  35. {  
  36.     if( SkinSB_IsValid(hwnd) )  
  37.         return SkinSB_SetScrollPos(hwnd, nBar, nPos, bRedraw);  
  38.     else  
  39.         return TrueSetScrollPos(hwnd, nBar, nPos, bRedraw);  
  40. }  
  41.   
  42. int WINAPI GetScrollPosD(HWND hwnd, int nBar)  
  43. {  
  44.     if( SkinSB_IsValid(hwnd) )  
  45.         return SkinSB_GetScrollPos(hwnd, nBar);  
  46.     else  
  47.         return TrueGetScrollPos(hwnd, nBar);  
  48. }  
  49.   
  50. BOOL WINAPI SetScrollRangeD(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw)  
  51. {  
  52.     if( SkinSB_IsValid(hwnd) )  
  53.         return SkinSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);  
  54.     else  
  55.         return TrueSetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);  
  56. }  
  57.   
  58. BOOL WINAPI GetScrollRangeD(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)  
  59. {  
  60.     if( SkinSB_IsValid(hwnd) )  
  61.         return SkinSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);  
  62.     else  
  63.         return TrueGetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);  
  64. }  
  65.   
  66. BOOL WINAPI ShowScrollBarD(HWND hwnd, int nBar, BOOL bShow)  
  67. {  
  68.     if( SkinSB_IsValid(hwnd) )  
  69.         return SkinSB_ShowScrollBar(hwnd, nBar, bShow);  
  70.     else  
  71.         return TrueShowScrollBar(hwnd, nBar, bShow);  
  72. }  
  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 TrueEnableScrollBar(hwnd, wSBflags, wArrows);  
  80. }  

加载钩子:

[cpp]  view plain  copy
  1. BOOL CSkinSBDemoApp::InitInstance()  
  2. {  
  3.   
  4.     // 加载钩子  
  5.     Mhook_SetHook(&(PVOID&)TrueSetScrollInfo, SetScrollInfoD);  
  6.     Mhook_SetHook(&(PVOID&)TrueGetScrollInfo, GetScrollInfoD);  
  7.     Mhook_SetHook(&(PVOID&)TrueSetScrollPos, SetScrollPosD);  
  8.     Mhook_SetHook(&(PVOID&)TrueGetScrollPos, GetScrollPosD);  
  9.     Mhook_SetHook(&(PVOID&)TrueSetScrollRange,SetScrollRangeD);  
  10.     Mhook_SetHook(&(PVOID&)TrueGetScrollRange,GetScrollRangeD);  
  11.     Mhook_SetHook(&(PVOID&)TrueShowScrollBar, ShowScrollBarD);  
  12.     Mhook_SetHook(&(PVOID&)TrueEnableScrollBar,EnableScrollBarD);  
  13.   
  14.     CSkinSBDemoDlg dlg;  
  15.     m_pMainWnd = &dlg;  
  16.     INT_PTR nResponse = dlg.DoModal();  
  17.     if (nResponse == IDOK)  
  18.     {  
  19.         // TODO: Place code here to handle when the dialog is  
  20.         //  dismissed with OK  
  21.     }  
  22.     else if (nResponse == IDCANCEL)  
  23.     {  
  24.         // TODO: Place code here to handle when the dialog is  
  25.         //  dismissed with Cancel  
  26.     }  
  27.   
  28.     // Since the dialog has been closed, return FALSE so that we exit the  
  29.     //  application, rather than start the application's message pump.  
  30.     return FALSE;  
  31. }  
 

程序退出时卸载钩子:

[cpp]  view plain  copy
  1. <span style="font-size:14px;">int CSkinSBDemoApp::ExitInstance()  
  2. {  
  3.     // 卸载钩子  
  4.     Mhook_Unhook(&(PVOID&)TrueSetScrollInfo);  
  5.     Mhook_Unhook(&(PVOID&)TrueGetScrollInfo);  
  6.     Mhook_Unhook(&(PVOID&)TrueSetScrollPos);  
  7.     Mhook_Unhook(&(PVOID&)TrueGetScrollPos);  
  8.     Mhook_Unhook(&(PVOID&)TrueSetScrollRange);  
  9.     Mhook_Unhook(&(PVOID&)TrueGetScrollRange);  
  10.     Mhook_Unhook(&(PVOID&)TrueShowScrollBar);  
  11.     Mhook_Unhook(&(PVOID&)TrueEnableScrollBar);  
  12.   
  13.     return CWinApp::ExitInstance();  
  14. }</span><span style="font-size:18px;">  
  15. </span>  

好了,具体请看源码,源码里真相大白,附mynamelj博客:

SkinSB皮肤滚动条库的使用_mynamelj的博客-CSDN博客

支持X64的SKINSB源码下载:

http://download.csdn.net/detail/hurryboylqs/4491550

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白(litebai.com)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值