RichEditCtrl funktioniert nicht richtig



  • Hi
    Ich möchte in einem Editor von mir von einem "edit" auf ein "RichEditCtrl" wechseln:

    Vorher:

    hwndEdit = CreateWindow("edit", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL | ES_WANTRETURN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU) IDC_MAIN_TEXT, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
    

    Nachher:

    hwndEdit = CreateWindow("RichEditCtrl", NULL, WS_CHILD | ES_MULTILINE | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOVSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU) IDC_MAIN_TEXT, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
    

    Allerdings kann ich so nichts eingeben... Das Textfeld ist nicht "Aktiv"...
    Was muss ich noch ändern??



  • Ok, jetzt funktionierts (wusste nicht, das man dafür ne *.dll braucht)
    ABER irgendwie funktioniert das mit dem Subclassing nicht:

    static LONG PrevWndProcEdit;
    LRESULT CALLBACK EditWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    //... 
    
    hwndEdit = CreateWindow("RichEdit", NULL, WS_CHILD | ES_MULTILINE | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOVSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU) IDC_MAIN_TEXT, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
    
    PrevWndProcEdit = SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG) EditWndProc);
    
    //...
    
    LRESULT CALLBACK EditWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message)
       {
          case WM_CHAR:
             MessageBox (NULL, "Taste!", "Tasteneingabe im Editfeld", NULL);
    // stünde hier ein "return 0;" würde keine Taste im Editfeld erscheinen!
             break;  
       }
    
    return CallWindowProc ((WNDPROC) PrevWndProcEdit, hwnd, message, wParam, lParam);
    }
    
    //...
    


  • Inwiefern funktioniert es denn nicht? Wenn du in WM_CHAR return 0 machst, ist doch einleuchtend, dass dann kein Text mehr erscheint, da der Tastendruck dann ja von der eigentlichen RichEdit-WndProc nicht mehr verarbeitet wird.



  • So, jetzt kenne ich das Problem genau:

    SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
    

    Nach dieser Stelle stürtzt das Programm ab.

    hFont  = CreateFont(schrift_grosse, 0, 0, 0, 0, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH, TEXT(schrift_art));
    SendMessage(hwndEdit, WM_SETFONT, (WPARAM)hFont, 0);
    

    Wenn ich die Obere Stelle weg lasse, stürtzt es hier ab...

    Und das zeiht sich durchs ganze Program... Immer wenn ich irgendwas mit dem RichEdit-Ding mache, stürtzt das Programm ab 😞



  • MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
    //...
    SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
    

    Hier stürtzt es auch ab 😞



  • Liefert denn GetDlgItem(hwnd, IDC_MAIN_TEXT) ein gültiges Handle zurück?!



  • [-]Weiß nicht, wie kann man das Prüfen??[/-]
    GetLastError(); bring 0

    if(SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT)) == NULL) MessageBox(NULL,"","",MB_ICONSTOP|MB_OK);
    

    Die MessageBox wird zwar nicht aufgerufen, aber es Stürtzt trotzdem ab 😞



  • Gerade hab ich gedacht, den Fehler gefunden zui haben:

    MoveWindow(GetDlgItem(hwndEdit, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
    //...
    SetFocus(GetDlgItem(hwndEdit, IDC_MAIN_TEXT));
    

    Das Handle zum RichEdit-feld heißt "hwndEdit"; "hwnd" ist mein Fenster...
    Jetzt stürten diese Beiden Funktioonen schonmal nicht ba, aber das mit der Schrift geht immer noch nicht, und in das Feld schreiben, auch nicht 😞



  • RedEagle schrieb:

    [-]Weiß nicht, wie kann man das Prüfen??[/-]

    IsWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT))

    RedEagle schrieb:

    GetDlgItem(hwndEdit, IDC_MAIN_TEXT)
    

    Bei GetDlgItem musst du als ersten Parameter das Parent-Fenster angeben - wenn du aber hwndEdit schon direkt hast (und es noch gültig ist - also global oder static), dann kannst du dir GetDlgItem ganz sparen und immer gleich hwndEdit angeben 😉
    Aber auch hier dann mal den Test mit IsWindow(hwndEdit)



  • if(!IsWindow(hwndEdit))MessageBox(NULL,"","",MB_OK|MB_ICONSTOP)
    

    MsgBox wird nicht angezeigt...

    evtl hilft nen Tutorial über RichEdits...
    mit den Normalen Textfeld ging das alles ganz gut


Anmelden zum Antworten