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);
ProcessCmdKey에 대해 자세히 설명해 주시겠습니까? 나는 그것에 익숙하지 않다. . . –
샘플 코드로 업데이트됩니다. –