创建CListCtrlP类
首先我们需要添加一个类让它去继承CListCtrl类,然后将我们需要实现的功能添加进这个新的类中。
class CListCtrlP :public CListCtrl
{
public:
CListCtrlP();
~CListCtrlP();
protected:
DECLARE_MESSAGE_MAP()
//响应事件
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
public:
// 绑定对象
void Binding(CListCtrlP* obj);
private:
// 定义一个对象用于指向需要同步的控件
CListCtrlP* m_obj;
// 保存上一次移动的位置
CSize m_cSize;
};
实现滚动条同步
void CListCtrlP::Binding(CListCtrlP* obj)
{
m_obj = obj;
}
void CListCtrlP::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// todo
CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
int nPosx = this->GetScrollPos(0);
int nPosy = this->GetScrollPos(1);
//计算移动量
int cx = nPosx - m_cSize.cx;
int cy = (nPosy - m_cSize.cy) * 33;
//设置移动量
CSize size(cx, cy);
m_obj->Scroll(size);
m_cSize.cx = nPosx;
m_cSize.cy = nPosy;
}
void CListCtrlP::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// todo
CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
int nPosx = this->GetScrollPos(0);
int nPosy = this->GetScrollPos(1);
int cx = nPosx - m_cSize.cx;
int cy = nPosy - m_cSize.cy;
CSize size(cx, cy);
m_obj->Scroll(size);
m_cSize.cx = nPosx;
m_cSize.cy = nPosy;
}
使用
将两个控件绑定
list1.Binding(&list2);
list2.Binding(&list1);
使用鼠标移动滚动条时,另一个控件的滚动条也会相应改变。
此处没添加滚轮事件,所以使用滚轮滑动时不会触发,需要额外添加滚轮事件去处理。