2010-12-16 6 views
1

Ich arbeite in Managed C++ über VS 2008. Ich erstelle eine Windows-Formular-App. Die Anwendung enthält 4 Registerkarten. Der Benutzer möchte einfach eine Funktionstaste drücken können (in diesem Fall F5, F7, F9 oder F10). . . um eine Registerkarte nach vorne zu bringen.TabPages :: Bring Tab nach vorne auf KeyDown

Ich weiß, ich muss das KeyDown-Ereignis erfassen. Das funktioniert gut. Ich weiß das, weil ich einige MessageBox :: Show in meinem KeyDown-Event-Handler ausgegeben habe und sicher genug, dass ich meine Nachrichten zurückbekomme, wenn die Funktionstasten gedrückt werden.

Das Problem/Dilemma ist jedoch, dass ich nicht scheinen kann, die TabPage, die der Funktion gedrückt Taste entspricht tatsächlich die ausgewählte Registerkarte werden. Ich habe versucht . . . "BringToFront", "Focus", "Enter" und "Click". Keiner von diesen scheint den Trick zu machen, die TabPage an die Front zu bringen.

Hier ist mein C++ Code. . .

System::Void frmBadgeScan_GeneralKeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) 
{ 
    switch (e->KeyCode) 
    { 
    case System::Windows::Forms::Keys::F3: 
     e->Handled = true ; 
     if (CurrentTab->Name->Equals("tabEmployeeScanOut")) 
      btnClearOutList_Click (sender, nullptr) ; 
     else if (CurrentTab->Name->Equals("tabEmployeeScanIn")) 
      btnClearInList_Click (sender, nullptr) ; 
     break ; 

    case System::Windows::Forms::Keys::F5: 
     e->Handled = true ; 
     MessageBox::Show("F5") ; 
     //this->tabEmployeeScanOut->BringToFront() ; 
     //this->tabEmployeeScanOut->Focus() ; 
     //tabEmployeeScanOut_Enter (sender, nullptr) ; 
     break ; 

    case System::Windows::Forms::Keys::F9: 
     e->Handled = true ; 
     MessageBox::Show("F9") ; 
     //this->tabEmployeeScanIn->BringToFront() ; 
     //this->tabEmployeeScanIn->Focus() ; 
     //tabEmployeeScanIn_Enter (sender, nullptr) ; 
     break ; 
    } 
} 

System::Void tabEmployeeScanIn_Enter(System::Object^ sender, System::EventArgs^ e) 
{ 
    CurrentTab = this->tabEmployeeScanIn ; 
    SendKeys::Send("{Tab}") ; 
} 

System::Void tabEmployeeScanOut_Enter(System::Object^ sender, System::EventArgs^ e) 
{ 
    CurrentTab = this->tabEmployeeScanOut ; 
    SendKeys::Send("{Tab}") ; 
} 

Irgendwelche Ideen?

BTW, die Variable "CurrentTab" ist definiert als. . .

TabPage  ^CurrentTab ; 

Vielen Dank im Voraus für die Hilfe!

Oh, und alle Steuerelemente im Formular sind so definiert, dass das Ereignis KeyDown erfasst wird. Unabhängig davon, welches Steuerelement den Fokus auf das Formular hat, wird das Ereignis KeyDown ausgelöst. . .

Wie so. . .

this->stsBadgeScan->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &frmBadgeScan::frmBadgeScan_GeneralKeyDown); 

this->tabMainMenu->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &frmBadgeScan::frmBadgeScan_GeneralKeyDown); 

this->btnClearOutList->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &frmBadgeScan::frmBadgeScan_GeneralKeyDown); 

this->lstScanOut->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &frmBadgeScan::frmBadgeScan_GeneralKeyDown); 

this->txtEmplNumScanOut->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &frmBadgeScan::frmBadgeScan_GeneralKeyDown); 

this->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &frmBadgeScan::frmBadgeScan_GeneralKeyDown); 

Antwort

1

Sie müssen die SelectedTab-Eigenschaft des TabControl festlegen. Wie folgt aus:

this->SomeTabControl->SelectedTab = this->tabEmployeeScanOut; 

Ersetzen „SomeTabControl“ mit dem Namen der Registerkarte, kann ich nicht aus dem Code sagen.

Vermeiden Sie die hässlichen KeyDown-Überschreibungen durch Überschreiben der ProcessCmdKey(). Gefällt mir:

protected: 
    virtual bool ProcessCmdKey(Message% msg, Keys keyData) override { 
     switch (keyData) { 
      case Keys::F1: 
       tabControl1->SelectedTab = tabPage1; 
       return true; 
      case Keys::F2: 
       tabControl1->SelectedTab = tabPage2; 
       return true; 
      // etc... 
     } 
     return false; 
    } 
+0

Können Sie bitte ProcessCmdKey näher erläutern? Ich bin damit nicht vertraut. . . –

+0

Beitrag mit Beispielcode aktualisiert. –