Childwindows empfangen kein WM_SETFOCUS WM_KILLFOCUS



  • WM_ACTIVATE kann zur Inaktivierung bzw. zur aktievierung benutzt werden. Oder du aktivierst einfach das Parent oder ein anderes Child, wenns mit der Inaktivierung nicht klappt (müsste es aber).

    Hier kannst nachschauen, wie die Funktion aufgebaut ist:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputmessages/wm_activate.asp

    Ich habs mal dazu benutzt um ein Edit Feld bei start eines Fensters (Vor zu) selektieren.



  • super, WM_ACTIVATE wird auch nicht gesendet...das ganze über WM_LBUTTONDOWN zu machen wäre aber sehr ärgerlich...denn wenn ich Steuerelemente im Fenster habe, wird WM_LBUTTONDOWN ja nicht ans Parent gesendet, dann müsste ich jeden Button subclassen ETC...wäre wirklich unschön....mal der Erstellcode meiner Childs:

    m_hWnd = CreateWindow("TPinnableWindow", szWindowName,
    		WS_VISIBLE | WS_THICKFRAME | WS_CHILD, x, y, dwWidth, dwHeight, hParent, 0, 0, this);
    

    Kevin



  • Willst du jetzt wissen, wie du selbst ein anderes Fenster aktivierst, oder wie du eins aktivieren kannst? Ich habe mit der Nachricht eigentlich schon gearbeitet und es funktioniert. Mir fallen jetzt so auch keine weiteren Nachrichten mehr ein, ich würde jetzt einfach mal spontan tippen das du einen Fehler gemacht hast.



  • ich bastel mal schnell eine beispielanwendung



  • Schaus dir an 🙂

    #include "windows.h"
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
    
    char szClassName[] = "ClassName";
    char szWindowTitle[] = "WindowTitle";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    				   PSTR lpCmdLine, int nShowCmd)
    {
    
    	HWND hWnd;
    	MSG msg;
    	WNDCLASS wc;
    
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.hCursor = LoadCursor(0, IDC_ARROW);
    	wc.hInstance = hInstance;
    	wc.lpfnWndProc = WndProc;
    	wc.lpszClassName = szClassName;
    	wc.lpszMenuName = 0;
    	wc.style = CS_VREDRAW | CS_HREDRAW;
    	wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDC_ICON));
    
    	RegisterClass(&wc);
    
    	wc.lpfnWndProc = ChildWndProc;
    	wc.lpszClassName = "ChildWindow";
    
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow(szClassName, szWindowTitle,
    		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
    		600, 450, 0,0, hInstance, 0);
    
    	UpdateWindow(hWnd);
    	ShowWindow(hWnd, SW_SHOW);
    
    	HWND hChild1, hChild2;
    	hChild1 = CreateWindow("ChildWindow", "Child1", WS_VISIBLE | WS_CHILD | WS_OVERLAPPEDWINDOW,
    		0, 0, 200, 100, hWnd, 0, 0, 0);
    	hChild2 = CreateWindow("ChildWindow", "Child2", WS_VISIBLE | WS_CHILD | WS_OVERLAPPEDWINDOW,
    		300, 0, 200, 100, hWnd, 0, 0, 0);
    
    	UpdateWindow(hChild1);
    	ShowWindow(hChild1, SW_SHOW);
    	UpdateWindow(hChild2);
    	ShowWindow(hChild2, SW_SHOW);
    
    	while( GetMessage(&msg, 0, 0, 0) )
    	{
    
    		// TastenSchlüssel gegebenenfalls übersetzen
    		TranslateMessage( &msg );
    		// An MsgProc() weiterleiten
    		DispatchMessage( &msg );
    
    	}
    
    	UnregisterClass( szClassName, wc.hInstance );
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    
    	case WM_CREATE:
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_SETFOCUS:
    		MessageBox(0, "SetFocus", 0, 0);
    		break;
    
    	case WM_KILLFOCUS:
    		MessageBox(0, "KillFocus", 0, 0);
    		break;
    
    	case WM_ACTIVATE:
    		MessageBox(0, "Activate", 0, 0);
    		break;
    
    	case WM_CREATE:
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • Das sieht aus wie MDI.



  • ist es auch, benutze aber die WINAPI und hilft mir somit nicht wirklich weiter!



  • Surkevin schrieb:

    ist es auch, benutze aber die WINAPI und hilft mir somit nicht wirklich weiter!

    Das ist weder MDI noch irgendwas anderes außer WinAPI...



  • bitte nicht so ne diskussion, ich brauch ne lösung und keine bezeichnung



  • Genausowas habe ich mir schon gedacht (besser befürchtet). Die Nachricht WM_ACTIVATE, WM_SETFOCUS, WM_KILLFOCUS sind nur für den Keybord Focus zuständig. Ich glaube deswegen klapts nicht. Aber ich habe deinen Code mal Kompeliert, dein Problem ist das sich die einzelnen Fenster in der Anwendung nicht aktivieren lassen, oder ???



  • ich muss einfach wissen, wann welches fenster den fokus hat von den 2 Childs! WM_LBUTTONDOWN ist zu unsicher wegen den Steuerelemten, und alles subclassen ist zu unschön!



  • Benutz doch MDI.



  • Kann irgendjemmand mal disen anderen ... Typen rausschmeißen. Was soll das bitte heißen "benutz MDI". Ich sags nur ungern wir sind hier im WinApi Forum, da kannst du deinen MFC Schrott in die Tonne treten. (Vorausgestetzt du meinst das), den ich wüsste nicht das WinApi das so unterstützt! ⚠

    Also nun mal wieder ruhig weiter ...

    Bei mir hat nur das Parent den focus, sonst kein Window, das habe ich dich auch schon oben gefragt. <- Soll heißen wie willst du festellen das ein Fenster das bei mir (aus irgendeinem anderem Grund) keinen Focus haben kann den Focus hast, kannst du mir das mal erklären? Vielleicht kann ich dir dann helfen ... 🙂



  • flammenvogel: Volltrottel. MDI hat nichts mit MFC zu tun.



  • Doch hat es es gibt da so einen Modus für die Mfc der heißt MDI, aber ich will nun mit dir wirklich nicht über die MFC streiten, die ich sowieso nicht so gut kenne.

    Was meinst du den jetzt mit MDI?





  • Sorry, hab mich geirrt.



  • Mal zum besseren Verständnis,
    Das was Surkevin hier gecodet hat ist eine Art Control wie ein Button, für sowas wird das auch verwendet um eigene Controls zu Basteln, z.B. ein Image was auch auf Mausklick reagiert, oder andere schöne Dinge.
    Besser ist es dann natürlich die Caption weg zu lassen, BUTTON, EDIT, LISTBOX etc. sind solche diversen Standard Controls. Für seine Zwecke muß er MDI benutzen und MDI hat nichts mit MFC zu tun, sondern MFC beinhaltet Klassen die die Arbeit mit MDI erleichtern.



  • jo mit MDI funzts, danke



  • flammenvogel schrieb:

    Sorry, hab mich geirrt.

    Erst Informieren und dann Posten, oder wenn jemand was Posted dessen Angaben überprüfen und nicht aus der Nase ziehen. Result ist: MDI und alle MFC Hinweise waren überflüssig, daher erst sich selbst Schlau machen bevor man Versucht andere Schlau zu machen!

    Erster gedanke bei jedem Post sollte mit "Hmmm da guck ich mal nach.." beginnen und dann entsprechend Posten, so kann man dazu lernen bei Dingen wo von man keine Ahnung auf Anhieb hat.


Anmelden zum Antworten