EditBox füllt sich mit einem Tastendruck
-
Also, ich beginne gerade mit der Programmierung in C++ OHNE MFC, weil sich das so schlecht mit dem Disambler bearbeiten kann.
habe mir auch schon ein Fenster gebastelt und da Text reingeschrieben und Buttons sind auch im Bereich des Möglichen.
Nun wollte ich eine EditBox creiren, was mir auch gelang.
Doch, wenn nun im laufenden Programm in diese Editbox geschrieben werden soll, füllt sich das Editfeld automatisch bis zum Ende, wenn auch nur eine Taste in diesem Feld gedrückt wird.CreateWindow ("edit","Feld", WS_CHILD | WS_VISIBLE | BS_TEXT, 55, 45, 180, 20, hwnd, NULL, hInstance, NULL);Diesen befehl habe ich direkt hinter das CreateWindowEx vom Hauptwindow geschrieben, weil, wenn ich es in die
[/cpp]LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)[/code]-Funktion unter WM_CREATE bzw. WM_PAINT schreibe fehlt mir der hInstace als Parameter.
Hat jemand eine Idee, warum das so ist?
Danke

-
Zeig uns mehr von Deiner WindowProc.
Ich vermute mal, das ein WM_COMMAND ausgelöst wird und dieser von Dir falsch behandelt wird.
-
Meine Function sieht wie folgt aus:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT paintStruct; /* Device Context*/ HDC hDC; /* Text for display*/ char hallo[] = "Hallo"; static HBRUSH hBrush; /* Switch message, condition that is met will execute*/ switch(message) { /* Window is being created*/ case WM_CREATE: hBrush = (HBRUSH) CreateSolidBrush (RGB (150,150,150)); return 0; break; /* Window is closing*/ case WM_CLOSE: DeleteObject (hBrush); // kein GDI-Leck bitte PostQuitMessage(0); return 0; break; case WM_DESTROY: DeleteObject (hBrush); // kein GDI-Leck bitte PostQuitMessage (0); return(0); case WM_CTLCOLOREDIT: //Damit der Schrifthintergrund nicht stört, machen wir das Editfeld transparent SetBkMode ((HDC) wParam, TRANSPARENT); return (LONG) hBrush; // Hintergrund färben /* Window needs update*/ case WM_PAINT: hDC = BeginPaint(hwnd,&paintStruct); SetTextColor(hDC, COLORREF(0x0000AAFF)); SetBkColor(hDC,COLORREF(0x00000000)); TextOut(hDC,90,5,hallo,sizeof(hallo)-1); EndPaint(hwnd, &paintStruct); return 0; break; default: break; } return (DefWindowProc(hwnd,message,wParam,lParam)); }Wie zu sehen ist, habe ich das Ding aus allen mögliches Beispielen und Tutorials zusammengebastelt, aber es funktioniert, bis auf das EditBox-Problem.

-
Hmm? Erstell die Edit Box mal in der WM_CREATE ...
ach noch etwas: www.win-api.de ...

-
Geht auch nicht, habe hInstance aber auf NULL gesetzt,
da dies ja nicht mit übergeben wird in die WndProc.
Das müsste aber so gehen.
Das muss doch irgendworan liegen.
Könntest du vielleicht deine Version eines Fensters mit EdirBox posten, damit ich mit meiner vergleichen kann?

-
hInstance zu bekommen ist kein Problem, wenn du es als globale Variable schreibst.
Weil man aber gerne auf so etwas verzichtet, kann man einfach GetModuleHandle (NULL) nehmen, das liefert dir den benötigten Handle der Instanz.
Wenn du es dann unter WM_CREATE einfügst, müsste es klappen, ich kann mir nämlich vorstellen, dass es in deinem Fall nicht richtig auf Messages reagieren und zwischen dem Drücken und dem Loslassen einer Taste unterscheiden kann. Ist zwar nur eine Theorie eines Laien wie mir, ändert aber nichts daran, dass es mit WM_CREATE und der richtigen Instanz normalerweise klappen muss ;).Bis dann,
Philipp
-
Ach so, eine dritte Möglichkeit habe ich auch noch gefunden:
((LPCREATESTRUCT) lParam)->hInstance
Die Instanz wird nämlich doch übergeben, nur eben ein bisschen versteckt im lParam.
Such dir eine Möglichkeit aus

-
Nunja, es funktioniert jetzt, warum weiß ich auch nicht.... XD
Ich habe einfach das Grundgerüst von hier [http://www.win-api.de/tutorials.php?tutid=18] genommen, ein bisschen verändert und meine MessageRoutine reingelklatscht.
Aber vielen Dank für die schnelle Hilfe
