2010-09-22 8 views
6

Necesito desactivar temporalmente algunos elementos de una tabla de acelerador cuando el foco de entrada está en un campo CEdit.Deshabilitar elementos de tabla de acelerador en MFC

Mi aplicación tiene algunos comandos asociados con las teclas del teclado (A, S, D, etc.) y debo desactivarlos mientras el usuario ingresa texto en el campo.

Respuesta

6

Puede probar CopyAcceleratorTable para obtener las estructuras ARRAY de ACCEL y luego editar las que no desea, llame al DEstroyAcceleratorTable en la tabla actual. Luego use CreateAcceleratorTable para crear la nueva tabla con la tabla del acelerador editado.

Editar: This El enlace puede ser útil.

+1

Utilicé este método y funcionó bien. Solo una breve nota sobre cómo obtener el HACCEL correcto en una clase CFFCmemcast (Derivada) MFC: this-> m_hAccelTable ; Para obtener un uso arbitrario de HACCEL: LoadAccelerators (AfxGetInstanceHandle(), MAKEINTRESOURCE (YOUR_RESOURCE_ID)); –

1

La respuesta de Goz funciona muy bien. Para guardar el resto de las personas, aquí está el código de muestra que sigue a su sugerencia:

// 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

Si no puede obtener el ID del recurso, puede obtener el manejador usando HACCEL hAccelOld = ((CFrameWnd *) (AfxGetApp() -> m_pMainWnd)) -> m_hAccelTable; – cbuchart

Cuestiones relacionadas