当前位置: 首页 > news >正文

用SkinSB美化滚动条控件

尝试了很多方法来美化滚动条,但是都不是很理想。网上学习了用SkinSB来美化,简单好用,效果理想。


从哪里获取到SkinSB?
    你可以从作者的博客里面获取到相关信息:http://blog.csdn.net/mynamelj/archive/2009/02/16/3895585.aspx

从哪里获取Detours?
    它依赖着微软的一个很暴力的库Detours,可以从微软的网站上获取到:http://research.microsoft.com/en-us/projects/detours/


官方网站上Detours最新版本是2.1,而SkinSB原生用的是1.5的版本的,这两个版本的API差异还是很大的,所以头文件对此做了一个桥接,以下为头文件的代码:


#ifndef __SkinsbHelper_H__
#define __SkinsbHelper_H__


//  包含头文件
#include "detours.h"
#include "skinsb.h"


#if defined(_DEBUG)
    #pragma comment(lib, "skinsb.lib")
    #pragma comment(lib, "detours.lib")
#else
    #pragma comment(lib, "skinsb.lib")
    #pragma comment(lib, "detours.lib")
#endif


//
//  申明钩子
//
#if (DETOURS_VERSION >= 20100)
     int (WINAPI* SetScrollInfoT) (HWND,  int, LPCSCROLLINFO, BOOL) = SetScrollInfo;
    BOOL (WINAPI* GetScrollInfoT) (HWND,  int, LPSCROLLINFO) = GetScrollInfo;
     int (WINAPI* SetScrollPosT) (HWND,  intint, BOOL) = SetScrollPos;
     int (WINAPI* GetScrollPosT) (HWND,  int) = GetScrollPos;
    BOOL (WINAPI* GetScrollRangeT) (HWND,  int, LPINT, LPINT) = GetScrollRange;
    BOOL (WINAPI* SetScrollRangeT) (HWND,  intintint, BOOL) = SetScrollRange;
    BOOL (WINAPI* ShowScrollBarT) (HWND,  int, BOOL) = ShowScrollBar;
    BOOL (WINAPI* EnableScrollBarT) (HWND, UINT, UINT) = EnableScrollBar;
#else
    DETOUR_TRAMPOLINE( int   WINAPI SetScrollInfoT(HWND,  int, LPCSCROLLINFO, BOOL), SetScrollInfo)
    DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollInfoT(HWND,  int, LPSCROLLINFO), GetScrollInfo)
    DETOUR_TRAMPOLINE( int   WINAPI SetScrollPosT(HWND,  intint, BOOL), SetScrollPos)
    DETOUR_TRAMPOLINE( int   WINAPI GetScrollPosT(HWND,  int), GetScrollPos)
    DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollRangeT(HWND,  int, LPINT, LPINT), GetScrollRange)
    DETOUR_TRAMPOLINE(BOOL  WINAPI SetScrollRangeT(HWND,  intintint, BOOL), SetScrollRange)
    DETOUR_TRAMPOLINE(BOOL  WINAPI ShowScrollBarT(HWND,  int, BOOL), ShowScrollBar)
    DETOUR_TRAMPOLINE(BOOL  WINAPI EnableScrollBarT(HWND, UINT, UINT), EnableScrollBar)
#endif


int WINAPI SetScrollInfoD(HWND hwnd,  int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);
    else
        return SetScrollInfoT(hwnd, fnBar, lpsi, bRedraw);
}


BOOL WINAPI GetScrollInfoD(HWND hwnd,  int fnBar, LPSCROLLINFO lpsi)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_GetScrollInfo(hwnd, fnBar, lpsi);
    else
        return GetScrollInfoT(hwnd, fnBar, lpsi);
}


int WINAPI SetScrollPosD(HWND hwnd,  int nBar,  int nPos, BOOL bRedraw)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_SetScrollPos(hwnd, nBar, nPos, bRedraw);
    else
        return SetScrollPosT(hwnd, nBar, nPos, bRedraw);
}


int WINAPI GetScrollPosD(HWND hwnd,  int nBar)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_GetScrollPos(hwnd, nBar);
    else
        return GetScrollPosT(hwnd, nBar);
}


BOOL WINAPI SetScrollRangeD(HWND hwnd,  int nBar,  int nMinPos,  int nMaxPos, BOOL bRedraw)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
    else
        return SetScrollRangeT(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
}


BOOL WINAPI GetScrollRangeD(HWND hwnd,  int nBar, LPINT lpMinPos, LPINT lpMaxPos)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
    else
        return GetScrollRangeT(hwnd, nBar, lpMinPos, lpMaxPos);
}


BOOL WINAPI ShowScrollBarD(HWND hwnd,  int nBar, BOOL bShow)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_ShowScrollBar(hwnd, nBar, bShow);
    else
        return ShowScrollBarT(hwnd, nBar, bShow);
}


BOOL WINAPI EnableScrollBarD(HWND hwnd, UINT wSBflags, UINT wArrows)
{
    if( SkinSB_IsValid(hwnd) )
        return SkinSB_EnableScrollBar(hwnd, wSBflags, wArrows);
    else
        return EnableScrollBarT(hwnd, wSBflags, wArrows);
}



//
/// 注册钩子
//

LONG RegisterSkinSB(VOID)
{
#if (DETOURS_VERSION >= 20100)
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    // 加载钩子
    ::DetourAttach(&(PVOID&)SetScrollInfoT, SetScrollInfoD);
    ::DetourAttach(&(PVOID&)GetScrollInfoT, GetScrollInfoD);
    ::DetourAttach(&(PVOID&)SetScrollPosT, SetScrollPosD);
    ::DetourAttach(&(PVOID&)GetScrollPosT, GetScrollPosD);
    ::DetourAttach(&(PVOID&)SetScrollRangeT, SetScrollRangeD);
    ::DetourAttach(&(PVOID&)GetScrollRangeT, GetScrollRangeD);
    ::DetourAttach(&(PVOID&)ShowScrollBarT, ShowScrollBarD);
    ::DetourAttach(&(PVOID&)EnableScrollBarT, EnableScrollBarD);
    return DetourTransactionCommit();
#else
    ::DetourFunctionWithTrampoline((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
    ::DetourFunctionWithTrampoline((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
    ::DetourFunctionWithTrampoline((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
    ::DetourFunctionWithTrampoline((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
    ::DetourFunctionWithTrampoline((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
    ::DetourFunctionWithTrampoline((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
    ::DetourFunctionWithTrampoline((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
    ::DetourFunctionWithTrampoline((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
    return 1;
#endif
}



//
/// 注销钩子
//

LONG UnRegisterSkinSB(VOID)
{
#if (DETOURS_VERSION >= 20100)    
    // 卸载钩子
    ::DetourDetach(&(PVOID&)SetScrollInfoT, SetScrollInfoD);
    ::DetourDetach(&(PVOID&)GetScrollInfoT, GetScrollInfoD);
    ::DetourDetach(&(PVOID&)SetScrollPosT, SetScrollPosD);
    ::DetourDetach(&(PVOID&)GetScrollPosT, GetScrollPosD);
    ::DetourDetach(&(PVOID&)SetScrollRangeT, SetScrollRangeD);
    ::DetourDetach(&(PVOID&)GetScrollRangeT, GetScrollRangeD);
    ::DetourDetach(&(PVOID&)ShowScrollBarT, ShowScrollBarD);
    ::DetourDetach(&(PVOID&)EnableScrollBarT, EnableScrollBarD);
#else
    ::DetourRemove((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
    ::DetourRemove((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
    ::DetourRemove((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
    ::DetourRemove((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
    ::DetourRemove((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
    ::DetourRemove((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
    ::DetourRemove((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
    ::DetourRemove((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
#endif
    return 1;
}



#endif

在InitInstance()里面使用:RegisterSkinSB(),
在RegisterSkinSB中使用;UnRegisterSkinSB().

相关文章:

  • Windows下Linux开发环境设置(一)--TFTP服务器设置和NFS服务器设置
  • Linux下ffmpeg添加 x265
  • 磁引导机器人系统申请了专利,聊以慰籍
  • 关于TCP的可靠性
  • 如何成长为技术合伙人?
  • 发现一个超酷的FireFox2.0插件,纪念一下
  • UPYUN 用到的技术
  • 祝贺三八节日 “IT女杰风云榜”专题
  • 如何快速成长
  • 我的新浪博客地址升级了
  • 服务器开发
  • 清朝最后一次科举试题 看看你能考中状元吗
  • 说说Linux线程的栈空间
  • linux中使用pthread_kill函数测试线程是否存活的例子
  • 在SharePoint中对文档库(列表)进行的一些操作
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • JDK 6和JDK 7中的substring()方法
  • MySQL QA
  • python3 使用 asyncio 代替线程
  • Spring-boot 启动时碰到的错误
  • Sublime text 3 3103 注册码
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue.js-Day01
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从setTimeout-setInterval看JS线程
  • 两列自适应布局方案整理
  • 算法-图和图算法
  • 最近的计划
  • gunicorn工作原理
  • ​ubuntu下安装kvm虚拟机
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C++17) std算法之执行策略 execution
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (四)Android布局类型(线性布局LinearLayout)
  • (五)网络优化与超参数选择--九五小庞
  • (一)appium-desktop定位元素原理
  • (译) 函数式 JS #1:简介
  • (转)重识new
  • *上位机的定义
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net各种迷惑命名解释
  • @EnableWebMvc介绍和使用详细demo
  • [20171106]配置客户端连接注意.txt
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [20190401]关于semtimedop函数调用.txt
  • [BeginCTF]真龙之力
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [codeforces]Checkpoints