2010-12-16 3 views
1

VS 2008을 통해 Managed C++에서 작업하고 있습니다. Windows 양식 응용 프로그램을 만들고 있습니다. 응용 프로그램에는 4 개의 탭이 있습니다. 사용자는 기능 키 (이 경우, F5, F7, F9 또는 F10)를 간단히 누를 수 있기를 원합니다. . . 탭 페이지를 앞으로 가져옵니다.TabPages :: KeyDown 앞쪽에 탭 가져 오기

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}") ; 
} 

아이디어가 있으십니까?

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

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

샘플 코드로 업데이트됩니다. –

관련 문제