TabPages ::在KeyDown上将Tab键置于前面

时间:2010-12-16 14:54:55

标签: c++ winforms tabpage

我正在通过VS 2008在Managed C ++中工作。我正在创建一个Windows表单应用程序。该应用程序包含4个选项卡用户希望能够简单地按下功能键(在这种情况下,F5,F7,F9或F10)。 。 。将标签页放在前面。

我知道我必须捕获KeyDown事件。这很好。我知道这是因为我在我的KeyDown事件处理程序中抛出了一些MessageBox :: Show,当然,在按下Function键时我收到了消息。

然而,问题/困境是我似乎无法获得与按下的功能键对应的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}") ;
}

有什么想法吗?

BTW,变量“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 个答案:

答案 0 :(得分: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;
    }