MFC实现双RichEdit编辑框同步滚动

首先,在页面上添加两个RichEdit2控件,添加变量为CRichEditCtrl类型的m_edit1和m_edit2.
在CXXXDlg::CXXXDlg里添加:

	AfxInitRichEdit2();
	LoadLibrary(_T("RICHED20.DLL"));

VS2019中,CRichEdit使用不像CEdit一样,可以直接通过添加事件处理程序来对事件进行相应。默认的event mask是ENM_NONE,意味着没有讯息会发送给parent window。需要给event mask设置ENM_SCROLL才能有事件响应。
BOOL CXXXDlg::OnInitDialog()里添加:

	m_edit1.SetEventMask(ENM_SCROLL | EM_GETEVENTMASK);
	m_edit2.SetEventMask(ENM_SCROLL | EM_GETEVENTMASK);

然后对这两个编辑框添加EN_VSCROLL事件处理程序:

void CBinFileCompareDlg::OnEnVscrollRicheditFile1()
{
	// TODO: 在此添加控件通知处理程序代码
	UINT n1 = m_edit1.GetScrollPos(SB_VERT);
	UINT n2 = m_edit2.GetScrollPos(SB_VERT);
	if (n1 % 25)//25不是固定值,根据字体大小可调整
	{
		m_edit1.LineScroll(1);
		n1 = m_edit1.GetScrollPos(SB_VERT);
	}
	if (n2 % 25)
	{
		m_edit2.LineScroll(1);
		n2 = m_edit2.GetScrollPos(SB_VERT);
	}
	if (n1 == n2)
	{
		return;
	}
	CString ln1, ln2;
	ln1.Format(_T("%d"), (int)ceil(n1 / 25));
	ln2.Format(_T("%d"), (int)ceil(n2 / 25));
	m_edit2.LineScroll(n1 / 25 - n2 / 25);
}


void CBinFileCompareDlg::OnEnVscrollRicheditFile2()
{
	// TODO: 在此添加控件通知处理程序代码
	UINT n1 = m_edit1.GetScrollPos(SB_VERT);
	UINT n2 = m_edit2.GetScrollPos(SB_VERT);
	if (n1 % 25)
	{
		m_edit1.LineScroll(1);
		n1 = m_edit1.GetScrollPos(SB_VERT);
	}
	if (n2 % 25)
	{
		m_edit2.LineScroll(1);
		n2 = m_edit2.GetScrollPos(SB_VERT);
	}
	if (n1 == n2)
	{
		return;
	}
	CString ln1, ln2;
	ln1.Format(_T("%d"), (int)ceil(n1 / 25));
	ln2.Format(_T("%d"), (int)ceil(n2 / 25));
	m_edit1.LineScroll(n2 / 25 - n1 / 25);
}

需要注意的是这里只对鼠标单击滚动条进行响应,如果点击然后拖动再放开滚动条是不会响应的,但是滚动鼠标滚轮是可以的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值