MessageMap C++

Hallo Leute,

gibt es irgendeine Möglichkleit, in der MessageMap mehrere Notity-Meldungen (Button X gedrückt) mit nur einer Funktion abzufangen. Klar kann ich alles auf eine Routine umleiten, aber woher weiß ich dann, welcher Button gedrückt wurde, da ja void OnBnClickedBtnX() keine Parameter übergeben bekommt, wie etwa long OnGrabber(wParam,lParam).

BEGIN_MESSAGE_MAP(CXDlg, CDialog)
ON_BN_CLICKED(1100, OnBnClickedBtn1)
ON_BN_CLICKED(1101, OnBnClickedBtn2)
ON_BN_CLICKED(1102, OnBnClickedBtn3)
ON_MESSAGE (1110, OnGrabber)
END_MESSAGE_MAP()

afx_msg long CXDlg::open_mouth:nGrabber(WPARAM wParam,LPARAM lParam) {return 0;}
afx_msg void CXDlg::open_mouth:nBnClickedBtn1() { BEEP;}

Ich möchte gerne dynamisch ein paar Buttons erzeugen und die Behandlung mit einer Routine mittels switch erschlagen.
Danke schon mal,
nasty

Hallo Leute,

gibt es irgendeine Möglichkleit, in der MessageMap mehrere
Notity-Meldungen (Button X gedrückt) mit nur einer Funktion
abzufangen. Klar kann ich alles auf eine Routine umleiten,
aber woher weiß ich dann, welcher Button gedrückt wurde, da ja
void OnBnClickedBtnX() keine Parameter übergeben bekommt, wie
etwa long OnGrabber(wParam,lParam).

Wo ist das Problem? Du implementierst OnBnClickedBtn1 bis 3, die tun aber nichts anderes als eine gemeinsame Worker-Funktion wie etwa OnBnClickedBtnAll aufzurufen, aber mit einem Parameter von z.B. 1 - 3.

Reinhard

Wo ist das Problem? Du implementierst OnBnClickedBtn1 bis 3,
die tun aber nichts anderes als eine gemeinsame
Worker-Funktion wie etwa OnBnClickedBtnAll aufzurufen, aber
mit einem Parameter von z.B. 1 - 3.

Reinhard

Hallo Rheinhard,
Genau das will ich ja machen, aber der Compiler mault mit

error C2440: ‚static_cast‘ : ‚void (__thiscall CXDlg::* )(int)‘ kann nicht in ‚AFX_PMSG‘ konvertiert werden

wenn ich das probiere:

BEGIN_MESSAGE_MAP(CXDlg, CDialog)
ON_BN_CLICKED(1100, OnBnClickedBtn(1))
ON_BN_CLICKED(1101, OnBnClickedBtn(2))
ON_BN_CLICKED(1102, OnBnClickedBtn(3))
END_MESSAGE_MAP()

afx_msg void OnBnClickedBtn(int id); im Header

void CXDlg::open_mouth:nBnClickedBtn1(int i) im Dialog
{
switch id {
case id:

}
}

Mach ich da irgendwas falsch ?

Gruß
Norbert

error C2440: ‚static_cast‘ : ‚void (__thiscall CXDlg::*
)(int)‘ kann nicht in ‚AFX_PMSG‘ konvertiert werden

wenn ich das probiere:

BEGIN_MESSAGE_MAP(CXDlg, CDialog)
ON_BN_CLICKED(1100, OnBnClickedBtn(1))
ON_BN_CLICKED(1101, OnBnClickedBtn(2))
ON_BN_CLICKED(1102, OnBnClickedBtn(3))
END_MESSAGE_MAP()

afx_msg void OnBnClickedBtn(int id); im Header

void CXDlg::open_mouth:nBnClickedBtn1(int i) im Dialog
{
switch id {
case id:

}
}

Mach ich da irgendwas falsch ?

Gruß
Norbert

Ich habe das eigentlich viel einfacher gemeint, etwa so (im Moment schreibe ich nichts in C und bin nicht so geübt):

BEGIN_MESSAGE_MAP(CXDlg, CDialog)
ON_BN_CLICKED(1100, OnBnClickedBtn1)
ON_BN_CLICKED(1101, OnBnClickedBtn2)
ON_BN_CLICKED(1102, OnBnClickedBtn3)
ON_MESSAGE (1110, OnGrabber)
END_MESSAGE_MAP()

afx_msg long CXDlg::open_mouth:nGrabber(WPARAM wParam,LPARAM lParam) {return 0;}
afx_msg void CXDlg::open_mouth:nBnClickedBtn1() { OnBnClickedBtnAll(1) ;}
afx_msg void CXDlg::open_mouth:nBnClickedBtn1() { OnBnClickedBtnAll(2) ;}
afx_msg void CXDlg::open_mouth:nBnClickedBtn1() { OnBnClickedBtnAll(3) ;}

afx_msg void CXDlg::open_mouth:nBnClickedBtnAll (int ButtonSel) { … ;}

Ich hoffe, das Prinzip wird klar: es gibt n Messagehandler plus 1 Worker-Funktion.

Reinhard

Hi,

versuch doch mal folgendes:

Die Events gehen alle an eine Funktion, in der Funktion schaust du einfach nach welcher Button den Focus hat und reagierts entsprchend.

Gruesse
Peter

/========================================
BEGIN_MESSAGE_MAP(CXDlg, CDialog)
ON_BN_CLICKED(1100, OnBnClickedBtn)
ON_BN_CLICKED(1101, OnBnClickedBtn)
ON_BN_CLICKED(1102, OnBnClickedBtn)
END_MESSAGE_MAP()

afx_msg void OnBnClickedBtn(); im Header

void CXDlg::open_mouth:nBnClickedBtn()
{
CWnd* pwndCtrl = GetFocus();
int ctrl_ID = pwndCtrl->GetDlgCtrlID();

switch (ctrl_ID) {
case 1100:
break;
case 1101:
break;
case 1102:
break;
default:
break;
}
}
/========================================

Danke!
Vielen Dank für eure Antworten!
Das mit dem Focus ist wohl das einfachste und funktioniert auch wunderbar.
Genau das habe ich gebraucht, bin aber nicht auf die Idee gekommen, in dieser Richtung zu überlegen! Ist ja eigentlich völlig trivial .´-)
Ich brauch das nur, weil ich lange Programme hasse, vor allem wenn x-mal fast dasselbe drinsteht. So ein paar Testbuttons und eine Listbox für die Ausgabe sind per Hand in einer Schleife viel schneller positioniert, als mit diesem blöden Resourcen-Editor.
Ciao,
Norbert