RichEdit inhalt auf PaintBox darstellen?



  • Hallo und eine Frage

    Es geht um die RichEdit-Komponente.
    Ich möchte gerne den rtf-StringStream auf einer PaintBox darstellen.
    Der Text soll auf der PaintBox genau so aussehen wie in der RichEdit-Komponente. Oder ist das der falsche Ansatz? (benutze bcb5)

    Grüße



  • Der falsche Ansatz wofür, was willst du letztendlich erreichen?



  • Hi, ok genauer::

    Ich möchte eine Art HTML Editor schreiben.
    Es existiert mittlerweile ein Hauptformular (HTML ""Endzustand"").
    Auf dieses Hauptformular kann der Benuzer Bilder einfügen und verschieben.
    Der Benuzer kann Texte plazieren mittels Maus und verschieben.
    Für die Texteingabe/Nachbearbeitung erscheint ein Extraformular mit der RichEdit-Komponente.
    Mit dieser RichEdit-Komponente kann der Benutzer Texte wie gewünscht formatieren (Schriftart, Farben... Ausrichtung etc.).
    Diese Formular spuckt mittlerweile nicht nur den Text in HTML aus, sonder auch die benötigte CSS Datei.
    Das eigentliche Problem ist jetzt, dass ich den formatierten Text nicht so wie er sein soll, auf dem Hauptformular darstellen kann.

    Der eingegebene Text, läßt sich auf dem Hauptformular stauchen, verschieben so wie es gewünscht ist, bloß das der Text häßlich aussieht. Die Textausgabe erfolgt mittels Canvas->TextOut(....);

    Mir würde jetzt auch schon reichen, wenn ich den Canvas der RichEdit-Komponente auf den Plan spiegeln könnte.
    Ich weiß das die RichEdit-Komponente keinen Canvas hat, aber es existiert ein Handle. Meine Frage ist ob man über diesen Handle auf den Canvas (""dc"") gelangen kann und wie.

    Oder kennt jemand eine OLE(Server)-Methode, die über MS-Word.... den Text (richtig formatiert) auf das Hauptformular schreibt. Die TextOut-Funktion von Canvas ist dafür zu schwach.
    Ja das bisschen fehlt noch für die erste Version.

    mfg und Danke ( DynamicArray forever 😉 )



  • dlonra schrieb:

    Ich weiß das die RichEdit-Komponente keinen Canvas hat, aber es existiert ein Handle. Meine Frage ist ob man über diesen Handle auf den Canvas (""dc"") gelangen kann und wie.

    Sieh dir mal die FAQ-Einträge zum Thema Screenshot an.

    TextOut u.ä. sollte aber genauso funktionieren, es ist halt nur etwas mühsam, die Canvas-Properties (Brush, Pen, Font usw.) immer richtig zu setzen.



  • Danke toller Link, echt super das ihr euch so viel Mühe macht.
    Super Infos

    mfg



  • dlonra schrieb:

    Hallo und eine Frage

    Es geht um die RichEdit-Komponente.
    Ich möchte gerne den rtf-StringStream auf einer PaintBox darstellen.
    Der Text soll auf der PaintBox genau so aussehen wie in der RichEdit-Komponente. Oder ist das der falsche Ansatz? (benutze bcb5)

    Grüße

    Jetzt funktioniert es so bei mir!!!!!!!!

    void Ttext_rtf_html_css::rtf_rect_back(TStringStream *rtf,int x1,int y1,int &x2,int &y2,TCanvas *back, TColor &bkgrd, bool &wordrap)
    {
    //x1.....y2 sellen das WunschzielRechteck auf back dar (mit der Maus markiertes Rechteck, back zeigt auf Ziel Canvas)

    RichEdit1->Align=alNone; //RichEdit1 ist das mittlerweile geschlossene Texteingabefeld
    RichEdit1->ScrollBars=ssNone;

    rtf->Position=0;
    TRichEdit *edi=RichEdit1;
    edi->WordWrap=!wordrap;

    edi->Width=x2-x1; //Ausgabebreite steht fest
    edi->Lines->LoadFromStream(rtf); //rtf Stream reinladen (rtf-text einpassen)
    COLORREF kb = TColor(bkgrd);
    edi->Perform(EM_SETBKGNDCOLOR,0, kb);

    int selstartret = edi->SelStart; AnsiString rein="\n "; //neue Zeile einfügen
    edi->SelStart = edi->GetTextLen();
    edi->SetSelTextBuf(rein.c_str()); //wird nicht angezeigt
    edi->SelStart = selstartret; //damit die unterkante der richtigen zeile rauskommt

    //
    if(!wordrap)
    {TPoint letzte; //kooregiere Wunschzielrechteck Höhe
    edi->Perform(EM_POSFROMCHAR,int(&letzte),edi->GetTextLen()); //letzte.y = Texthöhe (v. letzte Buchstaben)
    y2 = y1 + letzte.y; //Form1->Caption="x2-x1="+IntToStr(x2-x1) +" y2="+IntToStr(letzte.y)+" eh="+IntToStr(edi->Height)+" ew="+IntToStr(edi->Width);
    }

    TFormatRange fmt; //edi Canvas Übertragung auf back vorbereiten!
    fmt.hdc = back->Handle; //y2 ist ab jetzt aktualisiert
    fmt.hdcTarget = fmt.hdc;
    fmt.rc = Rect(x11440/this->PixelsPerInch, //rect needs to be specified
    y1
    1440/this->PixelsPerInch, //in twips (1/1440 inch) as unit
    x21440/this->PixelsPerInch, //erst inch in pixel (oder so)
    y2
    1440/this->PixelsPerInch);
    fmt.rcPage = fmt.rc;
    fmt.chrg.cpMin = 0; //vom anfang
    fmt.chrg.cpMax = edi->GetTextLen(); //bis ende (kompletter Text bitte)

    SetBkMode(back,TRANSPARENT); // OPAQUE);
    edi->Perform(EM_FORMATRANGE,1,int(&fmt)); //mit 1,fmt) Canvas übertragen!
    edi->Perform(EM_FORMATRANGE,0,0); //mit 0,0) Hintergrund Buffer deleten!!
    //Cmalerich(back,x1,y1);

    RichEdit1->Align=alClient;
    RichEdit1->ScrollBars=ssVertical;
    }//---------------------------------------------------------------------------


Anmelden zum Antworten