Message reflection
-
Ich habe von CButton eine Klasse CButtonEx abgeleitet.
Mit "Message reflection" handle ich den OnClicked-Event in der CButtonEx selber. (das funktioniert soweit)
Jedoch möchte ich, dass zusätzlich auch noch der Message-Hanlder vom Parent-Dialog (CDialog) aufgerufen wird. (das funktioniert nicht, hatte aber noch funktioniert als ich "Message reflection" deaktiviert hatte)
Was ist die Lösung?
-
noch ein wenig Code dazu:
CButtonEx-Klasse (Message reflection aktiv):
BEGIN_MESSAGE_MAP(CButtonEx, CButton) //{{AFX_MSG_MAP(CButtonEx) ON_CONTROL_REFLECT(BN_CLICKED, OnClicked) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CButtonEx message handlers void CButtonEx::OnClicked() { MessageBox("TEXT1"); }
und noch die Message-Map vom Dialog, auf dem sich der CButtonEx befindet:
BEGIN_MESSAGE_MAP(CTemp11Dlg, CDialog) //{{AFX_MSG_MAP(CTemp11Dlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CTemp11Dlg::OnButton1() { // TODO: Add your control notification handler code here MessageBox("TEXT2"); }
Wenn ich auf den Button klicke, ist das Resultat:
TEXT1 Message-box kommt
TEXT2 Message-box kommt nichtich hätte aber gerne, dass beide kommen
-
void CButtonEx::OnClicked() { GetParent()->SendMessage(...); MessageBox("TEXT1"); }
-
Danke, hat funkioniert!!
Die Lösung ist:
GetParent()->SendMessage(WM_COMMAND,
MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED),
(LPARAM)GetParent()->m_hWnd);->beide Msg-Boxen kommen
-
Nur noch zur Ergänzung:
Wenn Deine Funktion anstatt void einen BOOL zurückgibt, kannst über TRUE oder FALSE steuern, ob die Nachricht beim Parent-Dialog ankommt. Paul DiLascia hat darüber mal was im MSJ geschrieben.http://www.microsoft.com/msj/1198/c/c1198.aspx
Gruß T.