Wie baut man ein Richedit-Feld?

Thomasio

Erfahrenes Mitglied
Ich habe ein mehrzeiliges Textfeld

Code:
MyDisplay                 = CreateWindow(
                                            L"edit",L"",
                                            WS_CHILD|WS_VSCROLL|ES_MULTILINE|ES_READONLY,
                                            0,0,400,200,
                                            hWnd,0,hinstance,0
                                          );

was einfach Text anzeigt.
Nun möchte ich dem User ermöglichen Schriftart, Farbe und Grösse des angezeigten Text zu ändern, aber absolut keinen Plan, wie.
Ich weiss, dass ich mit CreateFont() eigene fonts erstellen kann und mit WM_SETFONT dem edit Feld diesen font dann zuweisen kann, aber ich brauche ja wohl einen Dialog, wo ich den User aus seinen installierten fonts etwas aussuchen lasse und muss dann den Rückgabewert des Dialogs irgendwie für die WM_SETFONT message verwenden, aber da habe ich das erste Problem gleich zu Anfang, ich habe 100 mal versucht irgendwelche Hilfen zu Dialogen zu lesen, aber ich bringe es nicht auf die Reihe weil ich offensichtlich zu blöd bin das zu verstehen, oder in kurz, ich habe keinen Plan wie ein Dialog funktioniert.

Hat jemand ein Stück Code, oder einen Link zu einem Tutorial wo "für blöde" erklärt wird, wie man einen Dialog zur font Auswahl öffnet und den Rückgabewert dann verwendet, oder geht das mit "edit evtl gar nicht und es muss richedit sein?
 
Hi, wenn ich das tichtig verstehe möchtest du einen Art Text editor bauen, wo du Farbe und Schriftart etc verstellen möchtest.
Nun, deie Antwort hast du dir eingetlich auch schon selbst in der Frage gegeben;)
Du kannst a direkt in der selben Form/Dialog/Fester einen Button/DropDown-Menu erstellen, in dem du die genannten Parameter veränderst, oder, wenn du ein neues Dialogfenster haben möchtest ist das ganze etwas schwirieger, aber nur etwas;)

leg in deiem Haupdialog die gewünschten veränderungsparameter public an, somit hast du von überall Zugriff, also auch aus dem neuen Dialog. Eine eher unsaubere Lösung, aber sie geht.

Wenn das deine Frage war, kann ich auch bei Unklarheit mal ein Beispiel posten.

MfG
 
Erstmal danke für die Antwort.
In der Zwischenzeit habe ich noch ein wenig im Web gesucht und habe noch eine Seite gefunden, wo das Ganze erklärt wird, diesmal so, dass sogar ich es halbwegs verstanden habe.

Der nutzt ein CHOOSEFONT struct plus die Funktion ChooseFont() um den User wählen zu lassen und sendet anschliessend via SendMessage() den gewählten font an das edit.

Ich habe es so weit hin bekommen, dass ich font und Grösse ändern kann, aber dann steht dort, dass Farbe getrennt davon gesetzt werden muss, logisch, denn Farbe wird ja im case WM_CTLCOLORSTATIC gesetzt, nur wie mache ich das, ohne dass ich die Farbe als global definiere?

Dazu habe ich noch 2 weitere Probleme:

1) Wie fülle ich das CHOOSEFONT struct mit den aktuellen Werten des fonts der im Moment vom edit verwendet wird, so dass ein User der z.B. nur den Text fettgedruckt haben möchte, mit einem einzigen Klick auf "fett" im Dialog das Ganze umstellen kann, während alle anderen Werte im struct dem aktuell verwendeten font entsprechen.
Im Beispiel von diesem Tutorial verwenden die GetStockObject(DEFAULT_GUI_FONT)

2) Bei MSDN habe ich gelesen, dass ich die Auswahl die der User hat beschränken kann, also z.B. nur truetype Schriftarten, was ich aber brauche ist eine Beschränkung auf "nur UNICODE", weil der Text mehrsprachig ist und neben deutschen Umlauten auch osteuropäische Sonderzeichen enthalten kann.
Ich möchte, dass völlig unabhängig von den lokalen Einstellungen beim User alle Sonderzeichen sämtlicher Sprachen immer korrekt angezeigt werden, das geht prima mit "Courier new", aber wenn ich den User jetzt die Schriftart wählen lasse, wie beschränke ich seine Auswahl auf Schriftarten, die sämtliche UNICODE Sonderzeichen enthalten?

Hier mal der Code aus dem Tutorial, mit ein paar Anmerkungen, was da noch fehlt:

Code:
// globals

#define UNICODE
#define _UNICODE
#include <windows.h>
#include <string>

HWND MyDisplay;


// mainwindow

case WM_CREATE:

MyDisplay                 = CreateWindow(
                                            L"edit",L"",
                                            WS_CHILD|WS_VSCROLL|ES_MULTILINE|ES_READONLY,
                                            0,0,400,200,
                                            hWnd,0,hinstance,0
                                          );

break;

case WM_CTLCOLORSTATIC:

static HBRUSH BlueBrush = CreateSolidBrush(RGB(162,151,152));

SetBkColor((HDC)wParam,RGB(162,151,152));
SetTextColor((HDC)wParam,RGB(0,0,0));
return (LONG)BlueBrush;

break;


// Jetzt erstelle ich einen button und mache:

case WM_LBUTTONDOWN:

CHOOSEFONT cf = {sizeof(CHOOSEFONT)};
LOGFONT lf;

// hier sollte statt default der font aus dem edit geladen werden
HFONT g_hfFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

// hier sollte die farbe aus dem edit geladen werden
COLORREF g_rgbText = RGB(0, 0, 0);

GetObject(g_hfFont, sizeof(LOGFONT), &lf);

// hier müssten die Filter angepasst werden um die auswahl auf UNICODE zu beschränken
cf.Flags = CF_EFFECTS | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;

// MyDisplay ist global definiert, hätte ich auch lieber anders
cf.hwndOwner = MyDisplay;

cf.lpLogFont = &lf;
cf.rgbColors = g_rgbText;
if(ChooseFont(&cf))
  {
      HFONT hf = CreateFontIndirect(&lf);
      if(hf)
        {
            g_hfFont = hf;
        }
      else
        {
            MessageBox(hwnd, L"Font creation failed!", L"Error", MB_OK | MB_ICONEXCLAMATION);
        }

      // hier müssten die Werte im CTLCOLORSTATIC vom mainwindow geändert werden
      g_rgbText = cf.rgbColors;

      SendMessage(MyDisplay,WM_SETFONT,(WPARAM)g_hfFont,1);
  }

return 0;

break;
 
Zurück