2010-12-16 2 views
1

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

Я знаю, что мне нужно захватить событие 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}") ; 
} 

Любые идеи?

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

Вы должны установить свойство 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; 
    } 
+0

Не могли бы вы рассказать о ProcessCmdKey? Я не знаком с этим. , , – 2010-12-16 15:10:11

 Смежные вопросы

  • Нет связанных вопросов^_^