2010-12-16 19 views
1

私はVS 2008経由でManaged C++で作業しています。私は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}") ; 
} 

ところで、変数 "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について詳しく説明できますか?私はそれに精通していません。 。 。 –

+0

サンプルコードが更新されました。 –

関連する問題