1. 程式人生 > >DuiLib 對鍵盤訊息的處理——ESC、空格鍵

DuiLib 對鍵盤訊息的處理——ESC、空格鍵

今天,改BUG
窗體顯示,按空格鍵,追到:
bool CPaintManagerUI::PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& /*lRes*/)
{
    for( int i = 0; i < m_aPreMessageFilters.GetSize(); i++ )                              // 訊息過濾
    {
        bool bHandled = false;                                                             //  遞迴呼叫
        LRESULT lResult = static_cast<IMessageFilterUI*>(m_aPreMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);
        if( bHandled ) {                                                                   // 注意: 這裡的條件不是上面的返回值
            return true;
        }
    }
    switch( uMsg ) 
{
case WM_KEYDOWN:
 ..........................
}
}


bool CPaintManagerUI::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes)
{
    // Cycle through listeners
    for( int i = 0; i < m_aMessageFilters.GetSize(); i++ ) 
    {
        bool bHandled = false;                                                             // 訊息過濾
        LRESULT lResult = static_cast<IMessageFilterUI*>(m_aMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);
        if( bHandled ) {
            lRes = lResult;
            return true;
        }
    }
    // Custom handling of events
    switch( uMsg ) {
    case WM_APP + 1:
        {
      
        }
case WM_KEYDOWN:
        {
            if( m_pFocus == NULL ) break;
            TEventUI event = { 0 };
            event.Type = UIEVENT_KEYDOWN;
            event.chKey = (TCHAR)wParam;
            event.ptMouse = m_ptLastMousePos;
            event.wKeyState = MapKeyState();
            event.dwTimestamp = ::GetTickCount();
            m_pFocus->Event(event);                                                         // 處理焦點訊息
            m_pEventKey = m_pFocus;                                
        }
        break;
......................................
}
DuiLib遮蔽鍵盤訊息:
標頭檔案:
LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/);
原始檔:
LRESULT C***::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
{
if (uMsg == WM_KEYDOWN)
{
switch (wParam)
{
case VK_RETURN:                        // 回車建 
Login();
break;
case VK_ESCAPE:                        // ESC 
bHandled = true;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// return 1;                       // 返回值,在這裡不起作用,  真正起作用的是這個引數:bHandled                  
case VK_SPACE:                         // 空格鍵
bHandled = true;
// return 1;
default:
break;
}
}


return FALSE;
}


ESC鍵,單純的:case VK_ESCAPE:                        // ESC   可能會遮蔽掉
          但:case VK_SPACE:                         // 空格鍵  不行,跟蹤發現它後面會進入點選訊息   ::notify()中( // 處理焦點訊息)。
真正的遮蔽掉訊息:   
    對其進行賦值:bHandled = true;