Professional UI Solutions
Site Map   /  Register


Please Log In to post a new message or reply to an existing one. If you are not registered, please register.

NOTE: Some forums may be read-only if you are not currently subscribed to our technical support services.

Forums » Prof-UIS Tech Support » CExtResizableDialog inside CExtPageNavigatorWnd inside CExtResizableDialog doesn't get command keys Collapse All
Subject Author Date
Neville Franks May 27, 2009 - 3:31 AM

I have a CExtResizableDialog inside CExtPageNavigatorWnd inside a CExtResizableDialog and Keyboard accelerators aren’t being processed. 

ex.     VK_F5,          ID_TreeShowAllFolders,  VIRTKEY

BEGIN_MESSAGE_MAP(CKnowledgeTreePageDLG, CExtResizableDialog)



    ON_COMMAND_EX( ID_TreeShowAllFolders, OnDespatchCommand )




When F5 is pressed CKnowledgeTreePageDLG::OnDespatchCommand() isn’t called. Originally there was only a CExtResizableDialog and this code worked correctly, but since putting it inside CExtPageNavigatorWnd  which is inside a CExtResizableDialog it doesn’t.

I have a Toolbar button which does ID_TreeShowAllFolders and it does call CKnowledgeTreePageDLG::OnDespatchCommand(). So it appears to be just a keyboard problem. Cwnd::OnWndMsg() for the CKnowledgeTreePageDLG never gets a  WM_COMMAND message when F5 is pressed.


Neville Franks May 28, 2009 - 1:09 AM

Thanks, I added the following code to my xxx::::PreTranslateMessage() function and which resolved this issue.

    HACCEL m_hAccelTable = pMainFrame()->MenuInfoGetDefault()->AccelTableGet( false );

    if ( m_hAccelTable )

    {                  // Note pMainFrame()->m_hWnd not this->m_hWnd so it handles the commands..

        if ( ::TranslateAccelerator( pMainFrame()->m_hWnd, m_hAccelTable, pMsg ) )


            return TRUE;



Technical Support May 28, 2009 - 11:42 AM

Your code snippet is absolutely OK.

Technical Support May 27, 2009 - 12:52 PM

The CDialog class pre-translates keyboard messages differently, not like the CFrameWnd class does. You created a page navigator inside a frame window and then created a dialog inside a page navigator. The frame window pre-translates the keyboard messages using its accelerator table. Most of other windows are pre-translating keyboard messages via their parent windows and, as a result, the frame window makes accelerators working. But not the dialog windows. The CDialog class implements the VK_TAB key based focus changing via message pre-translation. Dialogs are not friendly to their parent windows. So, you should implement the PreTranslateMessage() virtual method in your dialog class and use the mail frame’s accelerator table for pre-translating keyboard messages. You can also keep a stand-alone HACCEL accelerator table in your dialog class and use it instead if this is needed.