2010-09-22 12 views
6

Ich muss einige Elemente aus einer Accelerator-Tabelle vorübergehend deaktivieren, wenn der Eingabefokus auf einem CEdit-Feld ist.Beschleuniger Tabelle Elemente in MFC deaktivieren

Meine Anwendung verfügt über einige Befehle für die Tastaturtasten (A, S, D usw.), und ich muss diese deaktivieren, während der Benutzer Text in das Feld eingibt.

Antwort

6

Sie könnten versuchen, CopyAcceleratorTable, um die ARRAY von ACCEL-Strukturen zu bekommen, dann bearbeiten Sie diejenigen, die Sie nicht wollen, rufen Sie DEstroyAcceleratorTable auf der aktuellen Tabelle. Verwenden Sie dann CreateAcceleratorTable, um die neue Tabelle mit der bearbeiteten Beschleunigungstabelle zu erstellen.

Edit: This Link kann nützlich sein.

+1

Ich habe diese Methode verwendet und es hat gut funktioniert. Nur eine kurze Anmerkung, wie man das korrekte HACCEL in einer CFrameWnd (abgeleiteten) MFC-Klasse erhält: this-> m_hAccelTable ; Um einen beliebigen HACCEL zu erhalten, verwenden Sie: LoadAccelerators (AfxGetInstanceHandle(), MAKEINTRESOURCE (YOUR_RESOURCE_ID)); –

1

Die Antwort von Goz funktioniert sehr gut. Um alle anderen Menschen einige Zeit zu speichern, ist hier Beispielcode, der seinem Vorschlag folgt:

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

Wenn Sie die Ressourcen-ID nicht erhalten können, können Sie das Handle mit HACCEL hAccelOld = ((CFrameWnd *) (AfxGetApp() -> m_pMainWnd)) -> m_hAccelTable; – cbuchart

Verwandte Themen