2010-09-22 11 views
6

입력 포커스가 CEdit 필드에있는 경우 액셀러레이터 테이블에서 일부 항목을 일시적으로 비활성화해야합니다.MFC에서 액셀러레이터 테이블 항목 사용 안 함

내 응용 프로그램에는 키보드 키 (A, S, D 등)와 관련된 일부 명령이 있으며 사용자가 필드에 텍스트를 입력하는 동안 해당 명령을 비활성화해야합니다.

답변

6

CopyAcceleratorTable을 사용하면 ACCEL 구조체의 배열을 가져 와서 원하지 않는 구조체를 편집 할 수 있습니다. 현재 테이블에서 DEstroyAcceleratorTable을 호출하십시오. 그런 다음 CreateAcceleratorTable을 사용하여 편집 된 가속기 테이블을 사용하여 새 테이블을 만듭니다.

편집 : This 링크가 유용 할 수 있습니다.

+1

이 방법을 사용했는데 제대로 작동했습니다. CFrameWnd (derrived) MFC 클래스에서 올바른 HACCEL을 얻는 방법에 대한 간단한 설명 : this-> m_hAccelTable ; 임의의 HACCEL을 사용하려면 LoadAccelerators (AfxGetInstanceHandle(), MAKEINTRESOURCE (YOUR_RESOURCE_ID)); –

1

Goz의 답변은 매우 잘 작동합니다. 다른 모든 사람들을 잠시 저장하려면 다음 코드를 따르십시오.

// Allocate the accelerator buffer 
HACCEL hAccelOld = LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACC_TECONTROL)); 
int iNumAccelerators = CopyAcceleratorTable(hAccelOld, NULL, 0); 
ACCEL *pAccels = new ACCEL[iNumAccelerators]; 

// Copy the current table to the buffer 
VERIFY(CopyAcceleratorTable(hAccelOld, pAccels, iNumAccelerators) == iNumAccelerators); 

// Modify the pAccels array as required 
... 

// Destroy the current table resource... 
VERIFY(DestroyAcceleratorTable(hAccelOld) == TRUE); 

// ... create a new one, based on our modified table 
m_hTerAcceleratorTable = CreateAcceleratorTable(pAccels, iNumAccelerators); 
ASSERT(m_hTerAcceleratorTable != NULL); 

// Cleanup 
delete[] pAccels; 
+0

리소스 ID를 가져올 수 없으면 HACCEL hAccelOld = ((CFrameWnd *) (AfxGetApp() -> m_pMainWnd)) -> m_hAccelTable;을 사용하여 핸들을 가져올 수 있습니다. – cbuchart