MFC:CScrollBar与CSliderCtrl

文章讨论了在VC++编程中,如何在处理滚动事件时,将CScrollBar类型的指针转换为CSliderCtrl类型。尽管两者没有继承关系,但由于它们都是CWnd的派生类,且在特定情况下指针实际指向的是CSliderCtrl对象,因此可以进行强制转换。这种转换基于对指针实际代表对象的理解,尽管编译可以通过,但需确保运行时的正确性。
摘要由CSDN通过智能技术生成

问题:

《VC技术内幕》中,下面这样的类似代码出现很多次:

void CEx06bDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar(

{

CSliderCtrl* pSlide = (CSliderCtrl*)pScrollBar;

//.......

}

我不理解的是,(CSliderCtrl*)是做什么用的,代表什么含义?

我粗浅的看法是,pScrollBar是一个CScrollBar类指针,pSlide 是定义的CSliderCtrl类指针,现在把pScrollBar强制类型转换后,初始化给pSlide 。这样做是什么道理?CScrollBar和CSliderCtrl都是CWnd的派生类,他们之间又没有继承关系,可以这样强制转换吗?

简答:

这是微软做好的对所有的滚动类控件滚动的同一消息接口。Slider控件也是滚动类控件中的一种,因此,它的滚动事件,也是由OnHScroll和OnVScroll处理。虽然参数是CScrollBar指针,但也不要紧啊,指针只是一个地址而已。当是由Slider发出的滚动事件时,这个指针实际指向的对象就是CSliderCtrl对象,那么我们直接CSliderCtrl* pSlide = (CSliderCtrl*)pScrollBar;就可以获得Slider指针了。就像发送消息一样,我们知道传过来的是什么就可以;

比如我写这样的程序:

int *pInt = new int[2];

CString *pStr = (CString*)pInt;

编译也是能通过的。

就是说,传递的只是一个指针,指针只是一个32位的地址而已。只要是32位的变量,都可以去接收,至于接收后正确与否,就看你是不是很清楚传递过来的指针代表着什么。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值