【问题标题】:Disable accelerator table items in MFC在 MFC 中禁用加速器表项
【发布时间】:2010-09-22 19:35:55
【问题描述】:

当输入焦点位于 CEdit 字段上时,我需要暂时禁用快捷键表中的一些项目。

我的应用程序有一些与键盘键(A、S、D 等)相关的命令,我需要在用户在字段中输入文本时禁用这些命令。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    您可以尝试CopyAcceleratorTable 来获取 ACCEL 结构的 ARRAY,然后编辑掉您不想要的结构,在当前表上调用 DEstroyAcceleratorTable。然后使用CreateAcceleratorTable 使用已编辑的快捷键表创建新表。

    编辑:This 链接可能有用。

    【讨论】:

    • 我用过这个方法,效果很好。关于如何在 CFrameWnd(派生)MFC 类中获取正确 HACCEL 的简短说明: this->m_hAccelTable ;要获得任意 HACCEL,请使用:LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(YOUR_RESOURCE_ID));
    【解决方案2】:

    来自 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;
    

    【讨论】:

    • 如果获取不到资源ID,可以使用HACCEL hAccelOld = ((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->m_hAccelTable;获取句柄;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多