CSkinScrollBar(派生自CScrollBar) CSkinScrollBar提供了一个所有者绘制滚动条

CSkinScrollWnd* SkinWndScroll(CWnd *pWnd,HBITMAP hBmpScroll); 在我的代码的帮助下,您只需要在您的代码中添加一行代码。例如,假设您在窗口中有一个treectrl,并且您想替换它的滚动条。首先,你给它一个名字m_ctrlTree。下一步是当它被初始化时,添加如下一行: 隐藏,复制Code

SkinWndScroll(&m_ctrlTree,hBmpScroll)
如何测试我的项目? 界面中有4种控件,分别是listbox、treectrl、editctrl、richeditctrl。单击list_addstring按钮将填充listctrl,您将看到一个左边的滚动条。点击tree_addnode按钮将填充treectrl,您可能会看到两个ownerdraw滚动条替换了它的内部滚动条。在两个编辑框中输入文本,以查看它是否工作。 如何准备你的滚动条位图? 垂直和水平滚动条都需要4个图像片段。它们是向上/向左,滑动,拇指和向下/向右。每一个都包括3种状态:正常状态,悬停状态,按下状态。(很容易扩展对国家的支持。因为我不擅长图像处理,所以这个位图样本来自于一个软件的资源。)除了这些片段,位图还包括位于位图右侧的两个角度片段。 Sample image 现在我想向你们展示我遇到的问题 当我开始这段代码时,我尝试使用scrollbarctrl来覆盖窗口的内部滚动条。在我看来,只有滚动条窗口的Z阶较高,它才能正常工作。但事实上,这是行不通的。虽然我的滚动条窗口的z顺序较高,但当鼠标移动到滚动条区域时,内部的滚动条将立即呈现。我必须添加一个新窗口作为一个框架到目标窗口。一开始,我并没有打算支持leftscrollbar样式,所以我的代码运行得很好。最后,我决定支持它。但让我沮丧的是,它不再工作。在花了很多时间调试后,我发现它是错误的移动窗口的子类回调函数。因此,我定义了一个用户消息,并将该消息发布到消息队列。 如何应用它到一个列表ctrl ? 感谢康康发现了这个问题。 当将其应用到ListCtrl时,拖动拇指框将不起作用。我尽了我最大的努力去处理它。现在我向你们展示另一种方法。 我从CListCtrl派生了一个新类,并使用sbcode = SB_THUMBTRACK来处理WM_VSCROLL/WM_HSCROLL。 例如: 隐藏,收缩,复制Code

LRESULT CListCtrlEx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(messageWM_VSCROLL||messageWM_HSCROLL)
{
WORD sbCode=LOWORD(wParam);
if(sbCodeSB_THUMBTRACK
||sbCode
SB_THUMBPOSITION)
{
SCROLLINFO siv={0};
siv.cbSize=sizeof(SCROLLINFO);
siv.fMask=SIF_ALL;
SCROLLINFO sih=siv;
int nPos=HIWORD(wParam);
CRect rcClient;
GetClientRect(&rcClient);
GetScrollInfo(SB_VERT,&siv);
GetScrollInfo(SB_HORZ,&sih);
SIZE sizeAll;
if(sih.nPage0)
sizeAll.cx=rcClient.right;
else
sizeAll.cx=rcClient.right*(sih.nMax+1)/sih.nPage ;
if(siv.nPage
0)
sizeAll.cy=rcClient.bottom;
else
sizeAll.cy=rcClient.bottom*(siv.nMax+1)/siv.nPage ;

SIZE size={0,0};
if(WM_VSCROLL==message)
{
size.cx=sizeAll.cxsih.nPos/(sih.nMax+1);
size.cy=sizeAll.cy
(nPos-siv.nPos)/(siv.nMax+1);
}else
{
size.cx=sizeAll.cx*(nPos-sih.nPos)/(sih.nMax+1);
size.cy=sizeAll.cy*siv.nPos/(siv.nMax+1);
}
Scroll(size);
return 1;
}
}
return CListCtrl::WindowProc(message, wParam, lParam);

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

?QQ?:302619984

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值