WndProc in Klasse! Instanzen Teilen sich eine WndProc! HELP!



  • Dennoch sehr unverständlich für mich 😞 Maps und so.

    Kannst du mir ein gutes Sample machen? Aus dem Dingen in der FAQ werd ich absolut nicht schlau! Die Hauen da mit Assembler rum und nix läuft 😞



  • oder noch besser: kann mir jemand meinen Code so erweitern das es funktionieren würde und noch erklären was er da gemacht hat? ich glaub das würd ich am ehesten kapieren.



  • Auch, wenn es jetzt schon sehr in die Richtung geht, dass ich Dir die Arbeit abgenommen habe, hier ist Dein Code, wie er funktionieren sollte, ist aber ungetestet:

    #include <windows.h>
    
    class child {
    public:
    	HWND     myHandle;
    
    	child () {};
    	~child () {};
    
    	HWND init (HINSTANCE hInstance, HWND parent) {
    		MSG      msg;
    		WNDCLASS wc;
    
    		char szAppName[] = "Das Child Window000";
    
    		wc.cbClsExtra          = 0;
    		wc.cbWndExtra          = 0;
    		wc.hbrBackground       = (HBRUSH) GetStockObject(WHITE_BRUSH);
    		wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
    		wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
    		wc.hInstance           = hInstance;
    		wc.lpfnWndProc         = WndProc;
    		wc.lpszClassName       = szAppName;
    		wc.lpszMenuName        = NULL;
    		wc.style               = CS_HREDRAW | CS_VREDRAW;
    
    		RegisterClass(&wc);
    
    		myHandle = CreateWindow(szAppName,
    		                        szAppName,
    		                        WS_OVERLAPPEDWINDOW | WS_CHILD,
    		                        100,
    		                        100,
    		                        500,
    		                        200,
    		                        parent,
    		                        NULL,
    		                        hInstance,
    		                        this);  // Hier wird der Zeiger auf das erzeugte Objekt übergeben
    
    		ShowWindow(myHandle, SW_SHOW);
    		UpdateWindow(myHandle);
    
    		return myHandle;
    	}
    
    	LRESULT CALLBACK DefWindowProc(UINT Message, WPARAM wParam, LPARAM lParam) {
    		switch (Message) {
    			case WM_DESTROY: {
    				PostQuitMessage(0);
    				break;
    			}
    		}
    		// Nachrichten an Default-Windows-WndProc weiterreichen:
    		return ::DefWindowProc(myHandle, Message, wParam, lParam);
       }
    
    	static LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    
    		if(Message == WM_CREATE) { // übergebenen this merken
    			::SetWindowLong(hWnd, GWL_USERDATA, (LONG)((CREATESTRUCT*)lParam)->lpCreateParams);
    		}
    
    		child* pReceiver = (child*)GetWindowLong(hWnd, GWL_USERDATA);
    
    		if (!pReceiver) {  // Windows-eigene WndProc aufrufen, falls kein Zeiger gespeichert ist
    			return ::DefWindowProc(hWnd, Message, wParam, lParam);
    		}
    
    		return pReceiver->DefWindowProc(Message, wParam, lParam);
    	}
    };
    

    Wenn Du das jetzt immer noch nicht verstehst, dann tut es mir leid, aber wenn Du sowas vor hast, dann solltest Du schon verstehen, wie die Nachrichten-Behandlung unter Windows funktioniert und entsprechende C++-Kenntnisse haben, und ich denke, ich habe Dir jetzt schon so ziemlich alles abgenommen.

    Wenn Du nichtmal weißt was Maps sind, dann lern' erstmal die Grundlagen, bevor Du da weitermachst, sonst fragst Du bei jedem nächsten Schritt wieder hier nach.



  • (.)(.) will euch verarschen.



  • Hab' ich mir auch schon gedacht, aber irgendwie habe ich heute meinen Samariter-Tag. 😛



  • @mantiz
    ich kenn nur <map>? Du schmeißt hier mit Map rum aber was das ist sagst du net? Ich mein, frag ich nach Frames denkt auch jeder: Meint der HTML-Frames oder WindowFrames?

    Aber trotzdem danke

    @hinweis:
    Wenn Du blödes Arschloch mal nicht weiter weißt und fragst dann sag ich auch das du die gemeinschaft verarschen willst! Idiot!



  • 😃



  • Ja, ich meinte std::map, ich dachte, das wär' klar. Wenn Du's kennst, um so besser. 🙂

    bzgl. der Frames: So dürfte in einem HTML-Forum klar sein, was Du meinst. Und unter Windows bzw. GUI-Toolkits spricht man da eher von SplitterWindows, soweit ich weiß.



  • mantiz schrieb:

    Ja, ich meinte std::map, ich dachte, das wär' klar. Wenn Du's kennst, um so besser. 🙂

    Siehste um ne std::map habe ich dort bei dir nicht gefunden



  • mantiz schrieb:

    Wenn Du in Windows ein Fenster erstellst, so kannst Du jedem Fenster benutzerdefinierte Daten mitgeben. Per Default sind glaube ich immer 32 Bit dafür reserviert. Dieser Speicher ist ideal, um einen Zeiger zu übergeben, der auf 32-Bit-Systemen genau 32 Bit benötigt.

    Für Zeiger sollte man aber besser GetWindowLongPtr/SetWindowLongPtr nehmen.



  • groovemaster schrieb:

    mantiz schrieb:

    Wenn Du in Windows ein Fenster erstellst, so kannst Du jedem Fenster benutzerdefinierte Daten mitgeben. Per Default sind glaube ich immer 32 Bit dafür reserviert. Dieser Speicher ist ideal, um einen Zeiger zu übergeben, der auf 32-Bit-Systemen genau 32 Bit benötigt.

    Für Zeiger sollte man aber besser GetWindowLongPtr/SetWindowLongPtr nehmen.

    grund?



  • Jo, hast Recht, hatte ich noch gar nicht drüber nachgedacht, werd' ich dann wohl bei mir auch so einbauen. 🙂

    MSDN schrieb:

    If you are retrieving a pointer or a handle, this function supersedes the GetWindowLong function. (Pointers and handles are 32 bits on 32-bit Microsoft Windows and 64 bits on 64-bit Windows.) To write code that is compatible with both 32-bit and 64-bit versions of Windows, use GetWindowLongPtr.

    Get-/SetWindowLong arbeiten wohl immer nur mit 32 Bit.



  • Weil die Funktionen genau dafür da sind. Damit hat man zB bessere 64 Bit Portabilität.



  • groovemaster schrieb:

    Weil die Funktionen genau dafür da sind. Damit hat man zB bessere 64 Bit Portabilität.

    Wo sollen der unterscheid zwischen 32 und 64 bit sein? BIsher habe ich dort keinen gesehen. Und kommt mir jetzt bitte nicht mit diesen Amenmärchen von Speed das 64Bit CPUs besser mit 64Bit programmen arbeiten können.



  • Lies Dir nochmal durch, was ich aus dem MSDN zitiert habe. Auf 64-Bit-Windows sind Pointer und Handle 64-Bit groß, was bedeutet, dass Du mit GetWindowLong nur die unteren 32 Bit des Zeigers/Handles bekommst, und somit der Zeiger/Handle nicht stimmt. Hab' zwar noch keine Erfahrung mit 64-Bit-Systemen, aber wenn man evtl. Probleme so einfach umgehen kann, dann sollte man das auch tun.



  • aösdlfjk schrieb:

    Wo sollen der unterscheid zwischen 32 und 64 bit sein?

    ZB sind Zeiger unter Win32 32 Bit gross, unter Win64 64 Bit.



  • hi leute,

    schaut euch ma an wie der majestro das gelöst hat:

    http://blogs.msdn.com/oldnewthing/archive/2005/04/22/410773.aspx



  • Jo, kommt mir bekannt vor. 🙂


Anmelden zum Antworten