Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komisches Verhalten: RichEdit+ SetViewPortOrgEx+Scrollen (https://www.delphipraxis.net/156348-komisches-verhalten-richedit-setviewportorgex-scrollen.html)

Memnarch 29. Nov 2010 10:35

Komisches Verhalten: RichEdit+ SetViewPortOrgEx+Scrollen
 
Tag allerseits.
Ich komme almällich meinem Ziel näher, ein Richedit über einen Backbuffer darzustellen :).
Leider gibt sich folgendes problem:

Meine Funktion zum Zeichnen des Textes auf die Bitmap, tut sich mit dem scrollen schwer.
Hier mal der Code:

Code:
procedure TExtendedRichEdit.RichEditToCanvas(RichEdit: TExtendedRichEdit; ImageCanvas: TCanvas; PixelsPerInch: Integer);
var
  fmt: TFormatRange;
  TwipsPerPixel: Integer;
  VertScroll: Integer;
  HorizontalScroll: Integer;
begin
  VertScroll := GetScrollPos(RichEdit.Handle, sb_Vert);
  HorizontalScroll := GetScrollPos(RichEdit.Handle, sb_Horz);
  SetViewPortOrgEx(ImageCanvas.Handle, 50-HorizontalScroll, -VertScroll, nil);
  TwipsPerPixel := 1440 div PixelsPerInch;  //1440 div PixelsPerInch
  with fmt do
  begin
    hdc:= ImageCanvas.Handle;
    hdcTarget:= hdc;
    // rect needs to be specified in twips (1/1440 inch) as unit
    rc := Rect(0, 0,
                ImageCanvas.ClipRect.right * TwipsPerPixel,
                ImageCanvas.ClipRect.Bottom * TwipsPerPixel
              );
    rcPage:= rc;
    chrg.cpMin := 0;
    chrg.cpMax := RichEdit.GetTextLen;
  end;
  SetBkMode(ImageCanvas.Handle, TRANSPARENT);
  RichEdit.Perform(EM_FORMATRANGE, 1, Integer(@fmt));
  // next call frees some cached data
  RichEdit.Perform(EM_FORMATRANGE, 0, 0);
end;
Ohne SetViewPortOrgEx würde das Scrollen des RichEdits nicht berücksichtigt. Also benutze ich es + GetScrollpos um das Scrollen zu berücksichtigen.
Das merkwürdige:
Das scrollen klappt nur dann korrekt, wenn ich auf die pfeile der Scrollbar clicke(oder an eine stelle), aber NICHT wenn ich den "Schlitten" der scrollbar versuche zu ziehen. Dann nämlich verändert sich zwar die position, springt aber sofort wieder zurück, was zu einem Zittern führt, ohne dass sich wirklich was tut.(der schlitten bleibt aber an der losgelassenen position)

Zweitens: Wenn ich einfach per Cursor runterscrolle, klappt es zwar ganz gut ABER es scheint als ob er bei manchen zeilen zuerst nach rechtsscrolld bevor er eine zeile nach unten geht, was zu unerwünschten nebeneffekten führt(zucken/flackern, da nur für einen Frame sichtbar).

Drittens wäre esunglaublich Praktisch, wen EM_Formatrange nicht immer versuchen würde den Text in den sichtbaren Bereich zu quetchen(Horizontal). Eigentlich ist es ja zum drucken geeignet weswegen das eigentlich sinn macht, Brauichen tu ich es trotzdem nicht, da ich WordWrap abgeschaltet habe.

Hoffe jemand kann mir helfen.
Wenn ihr noch Informationen braucht die ich vergessen habe zu erwähnen, sagt bescheid, dann füge ich diese Hinzu.

PS: TExtendedRichedit ist imo nichts weiter als ein Richedit mit ein paar eigen Erweiterungen.
PSS: Ah okay, dass der schlitten nciht geht wie er soll, scheint wohl daran zu liegen dass er nicht direkt die position sondern eher die bewegungsgeschwindigkeit zurückliefert...dan muss ich wohl getscrollinfo noch verwenden um dazwischen zu unterscheiden?
Wenn das klappt fehlt nur noch dieser komische nach rechtscrolleffect wenn ich mit dem cursor runterscrolle v.v


MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz