DuiLib 對鍵盤訊息的處理——ESC、空格鍵
阿新 • • 發佈:2019-01-28
今天,改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;
窗體顯示,按空格鍵,追到:
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;