TRichEdit не превърта ред по ред

Първо имах TMemo и когато хванах палеца на лентата за превъртане, съдържанието на Memo се превърташе ред по ред, което означава, че не е гладко пиксел по пиксел.

След това преминах към използване на контрола TRichEdit вместо това. Но сега се превърта гладко, пиксел по пиксел.

Има ли начин да конфигурирате контролата TRichEdit да се държи по-скоро като контролата TMemo, превъртайки цял ред наведнъж?

Разбирам, че TRichEdit може да има различна височина на реда в зависимост от избрания стил. Но това не би трябвало да е проблем, ако горният ред винаги е бил подравнен (не се показва наполовина).

Ако няма лесен начин, мога просто да коригирам позицията в съобщението WM_VSCROLL...


person Max Kielland    schedule 13.01.2014    source източник


Отговори (2)


Добре, разбрах го.

Моето решение беше да прочета позицията на лентата за превъртане и да изчисля номера на реда от нея. След това изчислете делта броя на редовете за превъртане от текущата позиция на реда.

Улових 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).

Надявам се, че това е полезно, ако някой друг има същия проблем.

person Max Kielland    schedule 14.01.2014
comment
Имам същия проблем... Жалко, че има само базука решения за такъв малък проблем. Искам да кажа, че никога не бих поставил това в моя код, по-добре да запазя проблема. Това е толкова пресилено... Не ви критикувам, а c++ builder. - person ; 21.02.2014

По-лесно е да заснемете съобщението WM_VSCROLL и след това в това съобщение да определите височината на реда (чрез EM_POSFROMCHAR и EM_LINEINDEX) и след това да актуализирате позицията на палеца, така че да е кратна на височината на реда: pos = floor(pos / lineHeight) * lineHeight

person Jeroen    schedule 02.11.2015