Button Notification richtig in WndProc verarbeiten



  • Hallo

    Ich komm schon wieder mit meiner nächsten Frage.

    Habe in VS2005 ein WinApi Projek, in dem ich ein Fenster und einen Button erzeugt habe. Wenn ich nun den Button anklicke, soll natürlich auch was passieren.

    http://msdn.microsoft.com/en-us/library/bb775941(VS.85).aspx sagt ja dazu eigentlich alles aus...

    Unter http://msdn.microsoft.com/en-us/library/bb761825(VS.85).aspx gibts auch nochmal Informationen über die gesendete Nachricht.

    Dort steht auch :

    wParam: The low-order word contains the button's control identifier. The high-order word specifies the notification message.

    Also, im HIWORD steht die Nachricht. in diesem Falle ja BN_CLICKED .

    Nun hab ich aber in den Defines von Winuser.h

    #define BN_CLICKED 0

    stehen. D.h. ich würde das so nicht zum laufen kriegen.(krieg ich auch nicht)

    Was ist denn nun richtig? Soll in WM_COMMAND das HIWORD oder das LOWORD für BN_CLICKED auswerten? BN_CLICKED ist ja als 0 definiert. Kann das da nicht schiefgehen? Oder muß ich beide WORDs verarbeiten?

    Danke für eure Hilfe.



  • Immer beide WORDs verarbeiten, oder wirst du Problemme mit XP visual styles haben.

    case WM_COMMAND:
    	switch (wParam)
    	{
    		case MAKEWPARAM(IDC_BUTTON1, BN_CLICKED):
    			break;
    		case MAKEWPARAM(IDC_BUTTON1, BN_KILLFOCUS):
    			break;
    	}
    

    Wenn Du brauchst nur BN_CLICKED:

    case WM_COMMAND:
    	switch (wParam)
    	{
    		case IDC_BUTTON1:
    			break;
    		case IDC_BUTTON2:
    			break;
    	}
    


  • oder wirst du Problemme mit XP visual styles haben

    Was für Probleme sind das? Nur mal so au Neugier.



  • Also ich will auch mal zeigen, wie ich das bisher implementiert habe:

    case WM_COMMAND:
    	wmId    = LOWORD(wParam);
    	wmEvent = HIWORD(wParam);
    	// Menüauswahl bearbeiten:
    	switch (wmId)
    	{
    	case BN_CLICKED:
    		if (wmEvent == 6) {
    			//Lade Joystick
    			if (initJoystick()) SetWindowText((HWND)lParam,L"Joystick verbunden");
    		}
    		break;
    ...
    

    Problematisch sind dabei 2 Dinge. Zum einen ist wmID, also das LOWORD 0 was ich als kritisch empfinde. BN_CLICKED ist zwar auch als 0 definiert aber ich denke mir das 0 öfters vorkommt. Zum anderen kann ich wmEvent kein richtiges Define zuordnen, weil ich nicht weiß wo ich die finde.

    Soweit hab ich ja jetzt zwar erst mal beiden Informationen ausgewertet, aber halt nur halbherzig und ich glaube da schaufele ich mir schon wieder ne Falle.


  • Mod

    1. Spielt doch gar keine Rolle, das BN_CLICKED ist und evtl. auch mehrfach vorkommt. Du weißt doch welches Control Dir etwas sendet.
    2. Hast Du auch Unfug gemacht und Id und Event vertauscht.

    Gehe immer in der folgenden Reihe vor:

    switch (LOWORD(wParam))
    {
      case ID_OF_BUTTON:
        switch (HIWORD(wParam)) 
        {
        case BN_CLICKED:
    

    Wie wäre es, wenn Du Dir einfach mal ein bsichen Sampel Code ansiehst. z.B. der Code den der Wizard fr eine WinAPI Funktin erzeugt 😉



  • Ich hab den Button halt auch komplett über code erzeugt und nicht über den dialog editor. Glaube dabei hab ich auch keine vernünftige id übergeben, was sich jetzt wieder rächt.

    Na gut. Ich probiere weiter.


  • Mod

    daimonion schrieb:

    Ich hab den Button halt auch komplett über code erzeugt und nicht über den dialog editor. Glaube dabei hab ich auch keine vernünftige id übergeben, was sich jetzt wieder rächt.

    Na gut. Ich probiere weiter.

    Was spielt das für eine Rolle?
    1. Nimm einfach eine ID ab 100 und inkrementiere die für jeden dynamischenn Button den´Du erzeugst.
    2. Ändert es ncihts daran, dass Du die Parameter im wParam falsch ausgewertet hast.
    3. Es steht Dir doch auch frei selbst eine ID anzuilegen und zu verwenden. Ob der Button nun im Dialogeditor engelgt wurde oder nicht.



  • Ich hab ja noch keinen Plan wie ich die ID angebe. Werde mir aber erst mal ein Buch über die WinApi zulegen. Irgendwie nervt mich dieses Probieren so langsam.

    2. Ändert es ncihts daran, dass Du die Parameter im wParam falsch ausgewertet hast.

    Schon klar, aber so direkt seh ich nicht den unterschied in der Vorgehensweise im Vergleich zu dem Codeschnipsel von dir. Zuerst das LOWORD auswerten und wenn das Buttoncontrol im LOWORD ist, dann das Event im HIWORD auswerten. Gut, ich hab keine zweite switch gemacht, sondern nur auf (int)6 verglichen, und die defines sicherlich falsch gesetzt, aber das kommt zum einen vom Testen und zum anderen davon, dass ich von den einzelenen Werten verwirrt bin.


Anmelden zum Antworten