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 0if(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