我第一次使用TMemo,当我抓住滚动条的拇指时,Memo内容逐行滚动,意味着逐像素不平滑。
然后我切换到使用TRichEdit控件。但现在它逐像素地滚动平滑。
有没有办法将TRichEdit控件配置为更像TMemo控件,一次滚动整行?
我意识到TRichEdit可以根据所选样式具有不同的行高。但如果顶线总是对齐(不显示一半),这应该不是问题。
如果没有简单的方法,我可以调整WM_VSCROLL消息中的位置......
答案 0 :(得分:0)
好的,我明白了。
我的解决方案是读取滚动条位置并从中计算行号。然后计算从当前行位置滚动的增量行数。
我抓取了WM_MOUSEWHEEL
和WM_VSCROLL
,并将其转换为EM_LINESCROLL
条消息。
// Translate Mouswheel
case WM_MOUSEWHEEL:
Message.Msg = EM_LINESCROLL;
Message.LParam = (long)Message.WParamHi == 120 ? -3 : 3;
Message.WParam = 0;
PrevWndProc(Message);
break;
// Handle thumbscroll
case WM_VSCROLL: {
if (Message.WParamLo == SB_THUMBTRACK || Message.WParamLo == SB_THUMBPOSITION) {
SCROLLINFO scrInfo = { sizeof(SCROLLINFO), SIF_ALL };
int ratio,delta;
// Get scrollbar position
GetScrollInfo(Script_Edit->Handle,SB_VERT,&scrInfo);
// Calculate line number
ratio = (scrInfo.nMax/Script_Edit->Lines->Count);
delta = (Message.WParamHi/ratio)-GetlineNumber();
// Don't update if delta is 0
if (delta == 0)
break;
// Change to EM_LINESCROLL message
Message.Msg = EM_LINESCROLL;
Message.WParam = 0;
Message.LParam = delta;
}
PrevWndProc(Message);
} break;
PrevWndProc()
是原始的WindowProc()
函数,GetLineNumber()
返回RichEdit控件的顶行索引(EM_GETFIRSTVISIBLELINE
)。
我希望如果其他人遇到同样的问题,这会有所帮助。
答案 1 :(得分:0)
捕获WM_VSCROLL消息更容易,然后在此消息中确定行高(通过EM_POSFROMCHAR和EM_LINEINDEX),然后更新指针位置,使其为行高的倍数: pos = floor(pos / lineHeight)* lineHeight