TabPages :: Вывести вкладку на передний план при KeyDown - PullRequest
1 голос
/ 16 декабря 2010

Я работаю в Managed C ++ через VS 2008. Я создаю приложение для Windows. Приложение содержит 4 вкладки. Пользователь хочет иметь возможность просто нажать функциональную клавишу (в этом случае F5, F7, F9 или F10). , , вывести вкладку на передний план.

Я знаю, что должен захватить событие KeyDown. Это отлично работает. Я знаю это, потому что я сбросил некоторые MessageBox :: Show в свой обработчик событий KeyDown и, конечно же, я получаю свои сообщения обратно при нажатии функциональных клавиш.

Проблема / дилемма, однако, заключается в том, что я не могу получить 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 Ответ

1 голос
/ 16 декабря 2010

Вы должны установить свойство SelectedTab для TabControl.Например:

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

Замените «SomeTabControl» на имя элемента управления вкладкой, я не могу сказать из вашего кода.

Избегайте уродливых переопределений KeyDown, переопределяя ProcessCmdKey формы ().Как это:

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;
    }
...