Nachrichtenverabeitung eines Child Windows
-
Hallo, ich hab mal ne Frage zu obigem Thema:
Ich hab mir ein Fenster erstellt in das ich einen Button reingemacht hab.
Nun stellt sich mir die Frage wie ich die Nachrichten abfange die an den Button gerichtet sind.
Muss ich für den Button (also das Child) auch eine Fensterprocedur erzeugen?
Ich hoffe mich kann jemand aufklären#include "stdafx.h" //#include <stdio.h> // Konstanten // ---------- // Funktionsprototyping! // --------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: // Beim Eintreffen von WM_DESTROY, Anwendung beenden PostQuitMessage(0); return 0L; case WM_CLOSE: { // Abfrage, ob Anwendung beendet werden soll int nRetVal = MessageBox(hWnd, "Soll die Anwendung beendet werden?", "WM_CLOSE", MB_YESNO); // Falls ja, Fenster zerstoeren if ( nRetVal == IDYES) DestroyWindow(hWnd); return 0L; } } // Alles durch WINDOWS bearbeiten lassen return DefWindowProc(hWnd, uMsg, wParam, lParam); } LPCTSTR lpszWCLASSNAME = "ERSTES FENSTER"; LPCTSTR lpszTITLE = "Mein erstes Fenster"; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ZU ERLEDIGEN: Fügen Sie hier den Code ein. // Fensterklasse registrieren // -------------------------- // WNDCLASS-Strukur WNDCLASSEX WndClass; // Struktur mit '0' vorbelegen memset(&WndClass,0,sizeof(WndClass)); WndClass.cbSize = sizeof(WndClass); // Fensterprozedur einhaengen WndClass.lpfnWndProc = WndProc; // Instanzen-Handle WndClass.hInstance = hInstance; // Icon fuer Fensterklasse laden WndClass.hIcon = LoadIcon(0,IDI_WINLOGO); // Cursor fuer Fensterklasse laden WndClass.hCursor = LoadCursor(0,IDC_UPARROW); // Fensterhintergrund setzen WndClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // Fensterklassen-Name WndClass.lpszClassName = lpszWCLASSNAME; // Fensterklasse registrieren RegisterClassEx(&WndClass); // Fenster erzeugen HWND hWindow; // Fenster-Handle hWindow = CreateWindowEx(0, // kein erweiterter Stil lpszWCLASSNAME, // Fensterklassen-Name lpszTITLE, // Fenstertitel WS_OVERLAPPEDWINDOW, // Fensterstil CW_USEDEFAULT, 0, // Position CW_USEDEFAULT, 0, // Groesse (HWND)0, // kein Parent-Fenster (HMENU)0, // kein Menu hInstance, // Instanzen-Handle NULL); // keine zusaetzl. Daten // Fehler abfangen if (hWindow == NULL) { MessageBox(0,"Fehler beim CreateWindowEx(...)!", "FEHLER",MB_OK); return 0; } // Fenster darstellen // ------------------ ShowWindow(hWindow, nCmdShow); HWND hbutton = ::CreateWindow("ERSTES FENSTER","button",WS_BORDER | WS_CHILD | BS_ICON |BS_PUSHLIKE ,0,0,50,50,hWindow,NULL,0,0); ShowWindow(hbutton,true); MSG strMessage; // Nachrichten-Struktur definieren // Auf Nachricht warten while (GetMessage(&strMessage,NULL,0,0)) { // Tastencode uebersetzen TranslateMessage(&strMessage); // Nachricht an Fensterprozedur verteilen DispatchMessage(&strMessage); } return 0; }Danke
-
Geht es nur darum einen Click auf den Button abzufangen? Oder willst du alle Nachrichten kriegen? Wenn ja dann lautet das Stichwort Subclassing.
-
Naja,
bisher würde mir ja ein click darauf schon reichen.
Das Problem ist einfach dass ich nicht weiss wie ich in der Callback - Funktion zwischen dem Fenster und dem Button unterscheide.
-
da dein button ein child von deinem fenster ist fängst du nachrichten in der
wndproc ab.CreateWindow("ERSTES FENSTER","button",WS_BORDER | WS_CHILD | BS_ICON |BS_PUSHLIKE ,0,0,50,50,hWindow,1001,0,0);case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case 1001: MessageBox(hWnd, "btn click", "btn click", MB_OK);[edit]tags vergessen
[edit 3] letzter versuch
-
Hallo, danke für die Antworten,
aber leider funzt es immer noch nicht.
Ich bekomme auch schon einen Übersetzungsfehler wenn ich deine CreateWindow - Methode verwende
(Konvertierung des Parameters 10 von 'const int' in 'struct HMENU__ *' nicht moeglich).
Vielleicht hat noch jemand Rat?
-
casten.
CreateWindow("ERSTES FENSTER","button",WS_BORDER | WS_CHILD | BS_ICON |BS_PUSHLIKE ,0,0,50,50,hWindow,(HMENU)1001,0,0);
-
Ich bekomm zwar keinen Fehler mehr, aber die MessageBox taucht trotzdem nicht auf

Das kann doch nicht so schwierig sein die richtigen Empfänger für Fenster (Button)
zu ermitteln.
-
noch einen fehler gefunden, der class name war falsch
CreateWindow("BUTTON","label",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,0,0,50,50,hWindow,(HMENU)1001,0,0);http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindow.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttons.asp
-
Danke, etz klappts

-
So, etz hätt ich noch eine kleine Frage und zwar:
Ich hab mir das ganze mit dem Spy - Tool angesehen. Nun ist es so dass beim anklicken des Buttons gar keine WM_COMMAND - Nachricht bei dem Button ankommt.
Wie kann das dann überhaupt funktionieren?
Ich bin verwirrt....
-
Die WM_COMMAND kommt beim PARENT des CHILDS (dem Button) an...
-
Ahhhhh.... verstehe
danke