首先,在页面上添加两个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);
}
需要注意的是这里只对鼠标单击滚动条进行响应,如果点击然后拖动再放开滚动条是不会响应的,但是滚动鼠标滚轮是可以的。