【问题标题】:TRichEdit not scrolling line-by-lineTRichEdit 不逐行滚动
【发布时间】:2014-01-13 08:56:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    好的,我想办法。

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

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

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

    【讨论】:

    • 我也有同样的问题...这真是太可惜了,对于这样一个小问题,只有火箭筒解决方案。我的意思是我永远不会把它放在我的代码中,最好保留这个问题。这太矫枉过正了……不是批评你,而是批评 C++ builder。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多