2010-12-16 30 views
1

我正在通过VS 2008管理C++。我正在创建一个Windows窗体应用程序。该应用程序包含4个标签。用户希望能够简单地按功能键(在这种情况下,F5,F7,F9或F10)。 。 。将标签页放在前面。TabPages ::将标签带到KeyDown的前端

我知道我必须捕获KeyDown事件。这工作正常。我知道这是因为我在我的KeyDown事件处理程序中丢弃了一些MessageBox :: Show,并且当按下功能键时我收到了我的消息。

然而,问题/难题是我似乎无法获得与功能键按下相对应的TabPage实际上变为选定的标签页。我努力了 。 。 。 “BringToFront”,“Focus”,“Enter”和“Click”。这些似乎都没有把TabPage带到前面。

这是我的C++代码。 。 。

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}") ; 
} 

任何想法?

顺便说一下,变量“CurrentTab”被定义为。 。 。

TabPage  ^CurrentTab ; 

在此先感谢您的帮助!

哦,并且窗体上的所有控件都被定义为捕获KeyDown事件,因此无论控件是否关注窗体,KeyDown事件都会被触发。 。 。

像这样。 。 。

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); 

回答

1

您必须设置TabControl的SelectedTab属性。像这样:

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

将“SomeTabControl”替换为选项卡控件的名称,我无法从您的代码中知道。

通过重写窗体的ProcessCmdKey()来避免丑陋的KeyDown覆盖。像这样:

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

您能否详细说明ProcessCmdKey?我对此并不熟悉。 。 。 – 2010-12-16 15:10:11

+0

发布更新了示例代码。 – 2010-12-16 15:22:00