TRichEdit不逐行滚动

时间:2014-01-13 08:56:45

标签: c++builder vcl trichedit c++builder-xe5

我第一次使用TMemo,当我抓住滚动条的拇指时,Memo内容逐行滚动,意味着逐像素不平滑。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

好的,我明白了。

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

我抓取了WM_MOUSEWHEELWM_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