首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TRichEdit不逐行滚动

TRichEdit不逐行滚动
EN

Stack Overflow用户
提问于 2014-01-13 08:56:45
回答 2查看 429关注 0票数 1

我第一次有一个TMemo,当我抓起滚动条拇指时,备忘录内容逐行滚动,意思是不平滑的逐像素滚动。

然后我切换到使用TRichEdit控件代替。但现在它滚动平滑,逐像素。

是否有一种方法可以将TRichEdit控件配置为更像TMemo控件,一次滚动整行?

我确实意识到,TRichEdit可以有不同的线条高度取决于所选的风格。但是,如果顶部总是对齐的(而不是显示一半),这就不是问题了。

如果没有简单的方法,我可以调整WM_VSCROLL消息中的位置.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-14 12:57:29

好吧,所以我想清楚了。

我的解决方案是读取滚动条位置并从中计算行号。然后计算要从当前行位置滚动的增量行数。

我捕获了WM_MOUSEWHEELWM_VSCROLL,并将它们转换为EM_LINESCROLL消息。

代码语言:javascript
复制
// 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)的顶级索引。

如果别人也有同样的问题,我希望这是有帮助的。

票数 0
EN

Stack Overflow用户

发布于 2015-11-02 14:14:40

更容易捕获WM_VSCROLL消息,然后在此消息中确定行高(通过EM_POSFROMCHAR和EM_LINEINDEX),然后更新拇指位置,使其为直线高度的倍数: pos =接地板(pos/ lineHeight) * lineHeight

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21087157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档