1

私は VS 2008 経由で Managed C++ で作業しています。Windows フォーム アプリを作成しています。アプリケーションには 4 つのタブが含まれています。ユーザーは、単純にファンクション キー (この場合は F5、F7、F9、または F10) を押すことができるようにしたいと考えています。. . タブページを前面に移動します。

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

1 に答える 1

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;
    }
于 2010-12-16T15:01:55.533 に答える