1

我第一次有一个 TMemo,当我抓住滚动条拇指时,备忘录内容逐行滚动,这意味着逐像素不平滑。

然后我转而使用 TRichEdit 控件。但现在它可以逐像素平滑滚动。

有没有办法将 TRichEdit 控件配置为更像 TMemo 控件,一次滚动一整行?

我确实意识到 TRichEdit 可以根据所选样式具有不同的行高。但是,如果顶线始终对齐(不显示一半),这应该不是问题。

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

4

2 回答 2

0

好的,所以我想通了。

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

我捕获了WM_MOUSEWHEELandWM_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)。

如果其他人有同样的问题,我希望这会有所帮助。

于 2014-01-14T12:57:29.970 回答
0

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

于 2015-11-02T14:14:40.733 回答