问题:
我在看《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位的变量,都可以去接收,至于接收后正确与否,就看你是不是很清楚传递过来的指针代表着什么。