Editfeld, Text ändert sich bei Eingabe nicht



  • Hi,

    ich habe zwei ganz normale Fenster, wobei Fenster 2 ein Child von Fenster1 ist und ein Editfeld in Fenster2 liegt. Wenn ich dann in das Editfeld klicke ändert sich der Text darin leider nicht. 😞
    Wenn ich das Editfeld in Fenster1 platziere läuft alles wunderbar, oder aber, wenn ich bei Fenster2 das Style WS_CAPTION weglasse, dann funzt es auch.

    Hier der Testcode von mir (Auszug):

    ...
    hWnd  = CreateWindow(szAppName, "Titelleiste", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0, 0);
    hWnd2 = CreateWindow(szAppName2, "Fenster 02", WS_CHILD, 200, 200, 200, 200, hWnd, 0, 0, 0);
    hEdt  = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "Editfeld", WS_CHILD | WS_VISIBLE, 100, 100, 100, 25, hWnd2, 0, 0, 0);
    ...
    

    der Rest ist aus nem Standard-WinAPI-Tutorial, wo man sein erstes eigenes Fenster erstellt. 🙂

    Wie gesagt, so läuft es, aber sobald ich bei Fenster2 ein WS_CAPTION hinzunehme, ändert sich der Text nicht mehr. 😞



  • Messages gehen immer an das Parent-Fenster. Sprich du musst auf Nachrichten für das Edit in der WndProc von deinem zweiten Fenster reagieren. Wenn dies auch ein Controll ist (Groupbox, etc.) dann musst du es wohl subclassen und dessen standard WndProc auf deine umbiegen.



  • Controll

    wohl zu viel getrollt 😉



  • hm, ich glaube nicht, dass es irgendwas damit zu tun hat. Wie gesagt, wenn ich die 3 "Fenster" so aufrufe, wie ich es geschrieben habe, dann läuft alles super, aber wenn ich beim Aufruf von "Fenster 02" zu dem WS_CHILD und ein WS_CAPTION dazu-oder, dann funzt es nicht mehr. Window-Proc, etc. bleibt alles gleich, nur das eine WS_CAPTION kommt dazu.

    Oder behandelt Windows das "Fenster 02" nicht als Fenster, wenn es kein WS_CAPTION hat, sondern als Static-Control, welches die Nachrichten dann weiter an das Parent sendet, aber mit WS_CAPTION halt nicht ?

    bzw: Müssen Nachrichten, die von einem Edit-Control kommen nicht direkt an das Parent gesendet, sondern an das oberste Parent gesendet werden?

    Wie gesagt, die beiden Fenster haben die gleiche Wndproc, ich steh glaub ich voll auf dem Schlauch. 😞

    Hier nochmal der gesamte Code:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Ein eigenes Fenster";
    const char szAppName2[] = "Ein eigenes Fenster2";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    	HWND       hWnd, hWnd2, hEdt;
    	MSG        msg;
    	WNDCLASS   wc, wc2;
    
    	wc.style         =  CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc   =  WndProc;
    	wc.cbClsExtra    =  0;
    	wc.cbWndExtra    =  0;
    	wc.hInstance     =  hInstance;
    	wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    	wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.lpszClassName =  szAppName;
    	wc.lpszMenuName  =  NULL;
    
    	RegisterClass(&wc);
    
    	wc2.style         =  CS_HREDRAW | CS_VREDRAW;
    	wc2.lpfnWndProc   =  WndProc;
    	wc2.cbClsExtra    =  0;
    	wc2.cbWndExtra    =  0;
    	wc2.hInstance     =  hInstance;
    	wc2.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    	wc2.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    	wc2.hbrBackground =  (HBRUSH)GetStockObject(GRAY_BRUSH);
    	wc2.lpszClassName =  szAppName2;
    	wc2.lpszMenuName  =  NULL;
    
    	RegisterClass(&wc2);
    
    	hWnd  = CreateWindow(szAppName, "Titelleiste", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0, 0);
    	hWnd2 = CreateWindow(szAppName2, "Fenster 02", WS_CHILD, 200, 200, 200, 200, hWnd, 0, 0, 0);
    	hEdt  = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "Editfeld", WS_CHILD | WS_VISIBLE, 100, 100, 100, 25, hWnd2, 0, 0, 0);
    
    	ShowWindow(hWnd, iCmdShow);
    	UpdateWindow(hWnd);
    	ShowWindow(hWnd2, iCmdShow);
    	UpdateWindow(hWnd2);
    
    	while (GetMessage(&msg, NULL, 0, 0)) {
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    
    	switch (message) {
    		case WM_DESTROY: {
    			PostQuitMessage(0);
    			return 0;
    		}
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

Anmelden zum Antworten