GUI mit Edit Feldern und Childs



  • Hallo,

    ich habe ein GUI mit WINAPI erstellt, läuft auch alles einwandfrei.
    Doch wenn ich nun ein Child erstelle und auf diesem ein Edit Feld erzeuge, kann ich es nicht anklicken bzw. nichts eingeben. Im normalen GUI kann ich die Edit Feld einfach anklicken und Sachen eingeben.

    GUI Creation:

    CreateWindow(szTitle,szTitle,(WS_OVERLAPPEDWINDOW & !WS_MAXIMIZEBOX) | WS_SYSMENU | WS_MINIMIZEBOX| WS_CLIPCHILDREN,CW_USEDEFAULT,CW_USEDEFAULT,825,700,NULL,NULL,hInstance,NULL);
    
    CreateWindow(szItemName,szItemName, WS_CAPTION | WS_CHILD | WS_CLIPSIBLINGS | WS_DLGFRAME,5,100,10,10,hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    

    Edit Feld (aus Methode) für GUI und für Child:

    GUIItem[curID].hWnd=CreateWindow("EDIT",GUIItem[curID].name, WS_BORDER | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHLIKE | ES_NUMBER,x,y,xLen,yLen,parent,NULL,NULL,NULL);
    

    Muss ich in der Procedure vllt irgendwas fangen? Habe ich eigentlich gemacht...
    Kurz also: ich kann im GUI das Edit Feld benutzen, im Child nicht.

    Danke und Lg,
    Cloud2F



  • Von was für Methoden redest du? Weder C, C++ noch die WinAPI kennen Methoden.
    Ich würde raten, dass die Positionen nicht stimmen und das Fenster an der falschen Stelle ist oder ein anderes Fenster darüber liegt oder parent ungültig ist.
    Zeige mal ein Minimalbeispiel.



  • Sorry für die falsche Verwendung des Wortes "Methode"...

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK ItemProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	MSG msg;
    	HWND hWnd;
    	WNDCLASS wc;
    
    	char szTitle[100]="...";
    
    	wc.cbClsExtra          = 0;
    	wc.cbWndExtra          = 0;
    	wc.hbrBackground       = (HBRUSH) GetStockObject(COLOR_WINDOW+1);
    	wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hInstance           = hInstance;
    	wc.lpfnWndProc         = WndProc;
    	wc.lpszClassName       = szTitle;
    	wc.lpszMenuName        = NULL;
    	wc.style               = CS_HREDRAW | CS_VREDRAW;
    	RegisterClass(&wc);
    
    	//Item
    	wc.lpfnWndProc         = ItemProc;
    	wc.lpszClassName       = szItemName;
    	RegisterClass(&wc);
    	hWnd=CreateWindow(szTitle,szTitle,(WS_OVERLAPPEDWINDOW & !WS_MAXIMIZEBOX) | WS_SYSMENU | WS_MINIMIZEBOX| WS_CLIPCHILDREN,CW_USEDEFAULT,CW_USEDEFAULT,825,700,NULL,NULL,hInstance,NULL);
    	ShowWindow(hWnd, iCmdShow);
    	UpdateWindow(hWnd);
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    	TranslateMessage(&msg);
    	DispatchMessage(&msg);
    	}
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HWND hChild;
    	static HWND hSkill;
    	static RECT rect;
    	//static int iColor = RGB(255, 255, 255);
    	static bool state = false;
    	switch (message)
    	{
    	case WM_CREATE:
    		CreateWindow(szItemName,szItemName, WS_CAPTION | WS_CHILD | WS_CLIPSIBLINGS | WS_DLGFRAME | WS_VISIBLE,5,100,200,200,hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    		break;
    	case WM_COMMAND:
    		break;
    	case WM_SIZE:
    		rect.right  = LOWORD(lParam);
    		rect.bottom = HIWORD(lParam);
    		break;
    	case PM_REPAINT:
    //			iColor = wParam;
    //			InvalidateRect(hWnd, NULL, FALSE);
    		break;
    	case WM_CTLCOLORSTATIC: 
    		SetBkColor((HDC)wParam, RGB(255,255,255));//einfärben des hintergrunds von Labeln
    		break;
    	case WM_PAINT:
    		PAINTSTRUCT ps;
    		HDC hDC;
    		hDC=BeginPaint(hWnd,&ps);
    		EndPaint(hWnd,&ps);
    		break;
    	case WM_DESTROY:
    		exit(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    		break;
    	}
    return 0;
    }
    
    LRESULT CALLBACK ItemProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static RECT rect;   
    	switch (message)
    	{
    	case WM_CREATE:
    		CreateWindow("EDIT","testbox", WS_BORDER | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHLIKE ,5,5,50,50,hWnd,NULL,NULL,NULL);
    		break;
    	case WM_COMMAND:
    
    		break;
    	/*case WM_LBUTTONDOWN:
    	case WM_LBUTTONUP:
    	case 0x21:
    	case 0x20: //zum test abgefangen
    	case 0x210:
    		break;*/
    	case WM_CTLCOLORSTATIC: 
    		SetBkColor((HDC)wParam, RGB(255,055,255));//einfärben des hintergrunds von Labeln
    	break;
    	case WM_SIZE:
    		rect.right=LOWORD(lParam);
    		rect.bottom=HIWORD(lParam); 
    		break;
    	case WM_PAINT:
    		HDC          hDC;
    		PAINTSTRUCT  ps;
            hDC = BeginPaint(hWnd, &ps);
    		EndPaint(hWnd, &ps);
    		break;
    	case PM_REPAINT:
    		InvalidateRect(hWnd, NULL, FALSE);//REPAINT
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    		break;
    	}
    return 0;
    }
    

    So sollte das eig. passen. Mainwindow wird erzeugt, dieses erzeugt dann die Childs. Das Child erzeugt n Edit feld, welches nicht anwählbar ist.
    Danke



  • Hi,

    ich konnte dieses Verhalten nachstellen.
    Das hat mit WS_CHILD und WS_CAPTION zu tun. Zusammen funktioniert das Edit-Feld nicht mehr. Wie hier beschrieben: http://www.c-plusplus.net/forum/16586-full kann ich das Verhalten mit WS_CHILD und WS_POPUP nachstellen, scheint ein Fehler seitens WinzigWeich zu sein, anders kann ich mir das nicht erklären.

    Gruß
    Ombre

    PS: Die Kombination aus WS_CAPTION und WS_DLGFRAME macht keinen Sinn.

    MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx

    WS_CAPTION
    0x00C00000L

    The window has a title bar (includes the WS_BORDER style).

    WS_DLGFRAME
    0x00400000L

    The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.



  • Ombre schrieb:

    kann ich das Verhalten mit WS_CHILD und WS_POPUP nachstellen, scheint ein Fehler seitens WinzigWeich zu sein, anders kann ich mir das nicht erklären.

    RTFM 👍



  • Cloud2F schrieb:

    Childs

    children
    Bitte Englisch lernen.

    Cloud2F schrieb:

    (WS_OVERLAPPEDWINDOW & !WS_MAXIMIZEBOX)
    

    (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX)
    Bitte C++ lernen.

    Cloud2F schrieb:

    CreateWindow(szItemName,szItemName, WS_CAPTION | WS_CHILD | WS_CLIPSIBLINGS | WS_DLGFRAME,5,100,10,10,hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    

    Eine Windowclass namens szItemName ? Ernsthaft?

    Cloud2F schrieb:

    GUIItem[curID].hWnd=CreateWindow("EDIT",GUIItem[curID].name, WS_BORDER | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHLIKE | ES_NUMBER,x,y,xLen,yLen,parent,NULL,NULL,NULL);
    

    Meinst du wirklich die Windowclass "EDIT" wird den Button-Style** BS ** _PUSHLIKE unterstützen?
    Bitte nachdenken.



  • hustbaer schrieb:

    Cloud2F schrieb:

    Childs

    children
    Bitte Englisch lernen.

    Cloud2F schrieb:

    (WS_OVERLAPPEDWINDOW & !WS_MAXIMIZEBOX)
    

    (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX)
    Bitte C++ lernen.

    Cloud2F schrieb:

    CreateWindow(szItemName,szItemName, WS_CAPTION | WS_CHILD | WS_CLIPSIBLINGS | WS_DLGFRAME,5,100,10,10,hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    

    Eine Windowclass namens szItemName ? Ernsthaft?

    Cloud2F schrieb:

    GUIItem[curID].hWnd=CreateWindow("EDIT",GUIItem[curID].name, WS_BORDER | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHLIKE | ES_NUMBER,x,y,xLen,yLen,parent,NULL,NULL,NULL);
    

    Meinst du wirklich die Windowclass "EDIT" wird den Button-Style** BS ** _PUSHLIKE unterstützen?
    Bitte nachdenken.

    wow gibt ja schon gestörte persönlichkeiten
    aber du mein freund sprengst ja das maß der dinge
    dein beitrag ist genauso wie mein beitrag ja 0% konstruktiv
    versuch mal lieber dich in deinem sozialem umfeld einzugliedern anstatt trolling in foren zu betreiben



  • many schrieb:

    wow gibt ja schon gestörte persönlichkeiten
    aber du mein freund sprengst ja das maß der dinge
    dein beitrag ist genauso wie mein beitrag ja 0% konstruktiv
    versuch mal lieber dich in deinem sozialem umfeld einzugliedern anstatt trolling in foren zu betreiben

    Normalerweise würde ich da zustimmen, aber hustbär hat recht. Mal abgesehen vom Englischlernen sind das alles gute und richtige Hinweise, wenn auch nicht nett formuliert.



  • nwp3 schrieb:

    many schrieb:

    wow gibt ja schon gestörte persönlichkeiten
    aber du mein freund sprengst ja das maß der dinge
    dein beitrag ist genauso wie mein beitrag ja 0% konstruktiv
    versuch mal lieber dich in deinem sozialem umfeld einzugliedern anstatt trolling in foren zu betreiben

    Normalerweise würde ich da zustimmen, aber hustbär hat recht. Mal abgesehen vom Englischlernen sind das alles gute und richtige Hinweise, wenn auch nicht nett formuliert.

    die einzigen richtigen hinweise bestehen aus der tilde und bs_pushlike
    womit er aber keine wirklichen probleme hat. das ganze hat eben nicht seine frage oben beantwortet. man hätte auch sehr nett darauf hinweisen können
    einem kind was gerade fahrradfahren lernt sagt man auch nicht ständig, es treten und lenken lernen soll



  • hustbaer schrieb:

    Cloud2F schrieb:

    Childs

    children
    Bitte Englisch lernen.

    Cloud2F schrieb:

    (WS_OVERLAPPEDWINDOW & !WS_MAXIMIZEBOX)
    

    (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX)
    Bitte C++ lernen.

    Cloud2F schrieb:

    CreateWindow(szItemName,szItemName, WS_CAPTION | WS_CHILD | WS_CLIPSIBLINGS | WS_DLGFRAME,5,100,10,10,hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance,NULL);
    

    Eine Windowclass namens szItemName ? Ernsthaft?

    Cloud2F schrieb:

    GUIItem[curID].hWnd=CreateWindow("EDIT",GUIItem[curID].name, WS_BORDER | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHLIKE | ES_NUMBER,x,y,xLen,yLen,parent,NULL,NULL,NULL);
    

    Meinst du wirklich die Windowclass "EDIT" wird den Button-Style** BS ** _PUSHLIKE unterstützen?
    Bitte nachdenken.

    joa also many hat schon so'n bisschen recht. ich bin nich hier im forum um perfekt c++ zu beherrschen, sondern fragen zu stellen und dazu zu lernen. danke dennoch für diese destruktive antwort 😉

    Ombre schrieb:

    Hi,

    ich konnte dieses Verhalten nachstellen.
    Das hat mit WS_CHILD und WS_CAPTION zu tun. Zusammen funktioniert das Edit-Feld nicht mehr. Wie hier beschrieben: http://www.c-plusplus.net/forum/16586-full kann ich das Verhalten mit WS_CHILD und WS_POPUP nachstellen, scheint ein Fehler seitens WinzigWeich zu sein, anders kann ich mir das nicht erklären.

    Gruß
    Ombre

    PS: Die Kombination aus WS_CAPTION und WS_DLGFRAME macht keinen Sinn.

    MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx

    WS_CAPTION
    0x00C00000L

    The window has a title bar (includes the WS_BORDER style).

    WS_DLGFRAME
    0x00400000L

    The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.

    Danke! Das hat mir sehr geholfen, gibt zum Glück noch nette Menschen hier. Hab es also nun hinbekommen!
    Schönes WE an alle außer "hustbaer" 🙂



  • Cloud2F schrieb:

    joa also many hat schon so'n bisschen recht. ich bin nich hier im forum um perfekt c++ zu
    beherrschen, sondern fragen zu stellen und dazu zu lernen. danke dennoch für diese destruktive antwort 😉

    Ich kann die Antwort von hustbaer nicht destruktiv finden. Fachlich hat er absolut Recht. Die Hinweise
    sind richtig und auf einen besseren Umgangston hättest Du ihn deinerseits hinweisen können.

    Wenn du wirklich dazulernen möchtest ist es vermutlich der falsche Weg hilfbereite Mitmenschen,
    die dir unentgeltlich Hilfe anbieten, so anzugehen.



  • @Cloud2F
    Unfreundlich vorgebrachte konstruktive Kritik != destruktiver Kritik.

    @many

    many schrieb:

    die einzigen richtigen hinweise bestehen aus der tilde und bs_pushlike

    Falsch.
    Alle sind "richtig", und alle sind mehr oder weniger hilfreich.

    Es heisst nunmal einfach "children", das ist Fakt, zu sagen der Hinweis sei nicht richtig ist Blödsinn. Ob er sinnvoll oder nötig gewesen ist ist eine andere Frage.

    Und es ist nunmal keine gute Idee den Titel des Fensters als Window-Class-Name zu misbrauchen. Vor allem wenn aus dem Code nicht hervorgeht was übergeben wird. Hätte ja sein können dass das der Fehler ist. Und selbst wenn nicht, ist es schlechter Stil, den man sich abgewöhnen sollte.

    womit er aber keine wirklichen probleme hat. das ganze hat eben nicht seine frage oben beantwortet.

    Kann ich ja nicht wissen. Ich erwarte mir aber dass Leute die nen Fehler suchen erstmal offensichtliche Fehler beheben (auch wenn sie sich nicht auswirken) bzw. "gefährliche" Stellen wie die szItemName Geschichte zu fixen.

    man hätte auch sehr nett darauf hinweisen können

    Ich gebe ja zu dass es unfreundlich war, und das ohne guten Grund.

    einem kind was gerade fahrradfahren lernt sagt man auch nicht ständig, es treten und lenken lernen soll

    Der Vergleich ist unpassend. Radfahren lernt man im Prinzip von alleine. Jeder ausreichend alte Mensch (also alle ausgenommen Kleinkinder) sollte es schaffen rauszubekommen wie man mit nem Rad vorankommt, ohne dass man es ihm erklärt. Und in weiterer Folge dann auch schaffen gut fahren zu lernen. Beobachtung reicht vollkommen aus.

    Programmieren lernt man so aber nicht. Zumindest nicht gut.



  • BTW:
    Das Verhalten ist hier dokumentiert:
    http://support.microsoft.com/kb/230587/en-us

    Ob nen es einen Bug nennen kann weiss ich nicht, da

    MSDN schrieb:

    There are not many good ways to work around this limitation because it is Windows itself that is intentionally causing this behavior.

    MS muss gute Gründe haben es so zu lassen, sonst hätten sie es auch längt gefixt.

    Den Vorschlag von MS einfach ein "Owned Window" statt eines Child Window zu verwenden finde aber nicht gut.

    Mein Vorschlag:
    Schieb ein zweites Child-Fenster (ohne WS_CAPTION, WS_BORDER etc.) dazwischen.


Anmelden zum Antworten