Problem mit Accelerator Table
-
Guten Morgen zusammen,
ich habe in meiner Dialoganwendung gerade ein Accelerator Table hinzugefügt.
IDR_ACCELERATOR1 ACCELERATORS BEGIN VK_RETURN, IDC_ManF1, VIRTKEY, NOINVERT VK_RETURN, IDC_ManF2, VIRTKEY, NOINVERT ENDIDC_ManF1 und IDC_ManF2 sind Edit Steuerelemente.
Bei ManF1 sage ich ihm, dass er den Focus auf ManF2 setzen soll, wenn Return gedrückt wird
this->GetDlgItem(IDC_ManF1)->SetFocus();so, das funktioniert auch. und wenn ich jetzt bei ManF2 return drücke, soll er ein paar berechnung machen.
Das macht er aber nicht, weil er gar nicht erst in den zugewiesenen ereignishandler reingeht.
Ich hab mal versucht, dass nicht mit VK_RETURN sondern z.B. mit VK_NUMPAD2 zu realisieren und das funktioniert dann auf einmal. Wenn ich aber beiden VK_RETURN zuweise dann nicht.
ON_COMMAND(IDC_ManF1, OnManf1) ON_COMMAND(IDC_ManF2, OnManf2)die ereignishandler habe ich alle von der IDE selber erstellen lassen mit rechte maustaste --> hinzufügen usw
weiß jemand warum das so ist?
hier meine preTranslate für den Accelerator
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Fügen Sie hier Ihren spezialisierten Code ein, und/oder rufen Sie die Basisklasse auf. if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) { return ::TranslateAccelerator(m_hWnd, (HACCEL__ *)m_hAccel, pMsg); } return CDialog::PreTranslateMessage(pMsg); }
-
mal geraten ...
dem ding is es egal wer den focus hat .. wenn du beiden return zuweist nimmt er die erste funktion und führt diese aus. danach gibs return und das wars. zum zweiten kommt er garnicht weil er beim ersten schon greift.
du kannst abfragen welches Steuerelement den focus hat und wenn dann auch noch return gedrückt wurde um dann entsprechend die aktion auszuführen.