我第一次有一个 TMemo,当我抓住滚动条拇指时,备忘录内容逐行滚动,这意味着逐像素不平滑。
然后我转而使用 TRichEdit 控件。但现在它可以逐像素平滑滚动。
有没有办法将 TRichEdit 控件配置为更像 TMemo 控件,一次滚动一整行?
我确实意识到 TRichEdit 可以根据所选样式具有不同的行高。但是,如果顶线始终对齐(不显示一半),这应该不是问题。
如果没有简单的方法,我可以调整 WM_VSCROLL 消息中的位置...
我第一次有一个 TMemo,当我抓住滚动条拇指时,备忘录内容逐行滚动,这意味着逐像素不平滑。
然后我转而使用 TRichEdit 控件。但现在它可以逐像素平滑滚动。
有没有办法将 TRichEdit 控件配置为更像 TMemo 控件,一次滚动一整行?
我确实意识到 TRichEdit 可以根据所选样式具有不同的行高。但是,如果顶线始终对齐(不显示一半),这应该不是问题。
如果没有简单的方法,我可以调整 WM_VSCROLL 消息中的位置...
好的,所以我想通了。
我的解决方案是读取滚动条位置并从中计算行号。然后计算从当前行位置滚动的增量行数。
我捕获了WM_MOUSEWHEEL
andWM_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
)。
如果其他人有同样的问题,我希望这会有所帮助。
更容易捕获 WM_VSCROLL 消息,然后在此消息中确定行高(通过 EM_POSFROMCHAR 和 EM_LINEINDEX),然后更新拇指位置,使其成为行高的倍数:pos = floor(pos / lineHeight) * lineHeight