我第一次有一个TMemo,当我抓起滚动条拇指时,备忘录内容逐行滚动,意思是不平滑的逐像素滚动。
然后我切换到使用TRichEdit控件代替。但现在它滚动平滑,逐像素。
是否有一种方法可以将TRichEdit控件配置为更像TMemo控件,一次滚动整行?
我确实意识到,TRichEdit可以有不同的线条高度取决于所选的风格。但是,如果顶部总是对齐的(而不是显示一半),这就不是问题了。
如果没有简单的方法,我可以调整WM_VSCROLL消息中的位置.
发布于 2014-01-14 12:57:29
好吧,所以我想清楚了。
我的解决方案是读取滚动条位置并从中计算行号。然后计算要从当前行位置滚动的增量行数。
我捕获了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)的顶级索引。
如果别人也有同样的问题,我希望这是有帮助的。
发布于 2015-11-02 14:14:40
更容易捕获WM_VSCROLL消息,然后在此消息中确定行高(通过EM_POSFROMCHAR和EM_LINEINDEX),然后更新拇指位置,使其为直线高度的倍数: pos =接地板(pos/ lineHeight) * lineHeight
https://stackoverflow.com/questions/21087157
复制相似问题