Button Dynamisch -> BN_CLICKED

DJneu

Mitglied
Hallo zusammen,

ich habe eine dialofeldbasierende Anwendung,
in dieser befindet sich eine Registerkarte (CTabCtrl).
Hierauf wurden Dialoge platziert und dort Controls von
CStatic, CButton, CEdit usw. Dynamisch angelegt.
Wie bekomme ich nun eine BN_CLICKED Meldung mit
der entsprechenden ID um auf die Ereignisse reagieren zu können?
Über die OnSysCommand des Hauptdialoges wird das wohl nix werden?
Oder kann ich diese irgendwie an den entsprechenden Unterdialog weiterleiten
 
Hallo,

du musst auf dem jeweiligen Dialog, der z.B. einen Button trägt den OnCommand()-Member überladen. Dort kannst du dann auf Events reagieren:
Code:
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam) 
{
    if( (HWND)lParam == m_MyButton.GetSafeHwnd() ) //m_MyButton ist ein CButton-Object
    {
        if( HIWORD(wParam) == BN_CLICKED )
        {
            AfxMessageBox(_T("Buttonklick"));
        }
    }

    return CDialog::OnCommand(wParam, lParam);
}
Gruß
MCoder
 
Hi,

danke erstmal für die Antwort! Jetzt kommen aber noch ein paar Anfängerfragen :)
Ok so bekomme ich eine Meldung wenn irgendwas auf dem Dialog passiert, dialoge aktualisiert, Text in Editfelder und auch Mouseclick's (richtig?).
Ich habe meine Button's aber Dynamisch angelegt und habe für diese keine Membervariablen!? Das bedeutet ich brauche eigentlich nur die ObjektID des angeklickten Control's! Kriege ich diese über die OnCommand Routine

Gruß Dirk
 
Sorry..... :rolleyes:

kann leider nochnicht so viel mit der Antwort anfangen *schäm* ;-)

'Die ID bekommst du mit ::GetDlgCtrlID((HWND)lParam) oder LOWORD(wParam)'

Neue Memberfunktion mit ::GetDlgCtrlID anlegen
Oder irdendwie in OnCommand verwenden

Gruß
 
Einfach in OnCommand() verwenden:

Code:
if( ::GetDlgCtrlID((HWND)lParam) == ID_DES_BUTTONS ) // oder  LOWORD(wParam) == ID_DES_BUTTONS
{
    if( HIWORD(wParam) == BN_CLICKED )
    {
         //... Irgendwas tun
    }
}
 
Eine kleine Erklärung:
Der 'wParam'-Parameter der OnCommand-funktion ist aufgeteilt. das LowWord (die unteren 2 Byte) enthält die ID des Controls, das die WM_COMMAND-Nachricht abgeschickt hat (in Deinem Fall die ID des Buttons), das HiWord (also die oberen 2 Byte) enthält die Art der Nachricht (hier also BN_CLICKED).
Mit den Makros LOWORD(...) und HIWORD(...) kann man sich die jeweiligen Teile eines DWORD's (unsigned long int) als WORD (unsigned short int) holen.
 
Hallo zusammen,

OK denke ich hab das soweit verstanden!
Jedoch es noch nicht ganz!
Das gilt nicht nur für Button's sondern auch für Static- und Editfelder

Gruß
 
Hi nochmal,

noch weitere Erkenntnisse......

Also.. bei Edit's scheine ich eine Rückmeldung zu bekommen!!
Jedoch die Abfrage auf BN_CLICKED geht nicht!
Als HIWORD von wParam bekomme ich 512!
Die ID mit LOWIRD von wParam und lParam dürfte stimmen!
Das zweite Problem wenn ich ein zweites Mal auf das selbe Element
Klicke bekomme ich keine Meldung mehr!

Gruß
Dirk
 

Neue Beiträge

Zurück