关于WM_COMMAND消息的返回值的有关问题,求高人指点~
关于WM_COMMAND消息的返回值的问题,求高人指点~~~~~~
我发现调用::SendMessage发送WM_COMMAND的消息,该消息的返回值和MSDN上说的有点不同。
MSDN的说法
Return Value
If an application processes this message, it should return zero.
大致的意思就是如果应用程序处理了消息,将返回0
测试的结果
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, IDC_BTN_TOGETSTAT, (LPARAM)btn_test.m_hWnd);
该条发送出去后,nState的值为1,而这个WM_COMMAND的消息是有被响应的。
求高人指点
------解决方案--------------------
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
http://baike.baidu.com/view/1080187.htm
------解决方案--------------------
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, IDC_BTN_TOGETSTAT, (LPARAM)btn_test.m_hWnd);
-->
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_BTN_TOGETSTAT, BN_CLICKED), (LPARAM)btn_test.m_hWnd);
------解决方案--------------------
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, IDC_BTN_TOGETSTAT, (LPARAM)btn_test.m_hWnd);
-->
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_BTN_TOGETSTAT, BN_CLICKED), (LPARAM)btn_test.m_hWnd);
------解决方案--------------------
我发现调用::SendMessage发送WM_COMMAND的消息,该消息的返回值和MSDN上说的有点不同。
MSDN的说法
Return Value
If an application processes this message, it should return zero.
大致的意思就是如果应用程序处理了消息,将返回0
测试的结果
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, IDC_BTN_TOGETSTAT, (LPARAM)btn_test.m_hWnd);
该条发送出去后,nState的值为1,而这个WM_COMMAND的消息是有被响应的。
求高人指点
------解决方案--------------------
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
http://baike.baidu.com/view/1080187.htm
------解决方案--------------------
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, IDC_BTN_TOGETSTAT, (LPARAM)btn_test.m_hWnd);
-->
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_BTN_TOGETSTAT, BN_CLICKED), (LPARAM)btn_test.m_hWnd);
------解决方案--------------------
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, IDC_BTN_TOGETSTAT, (LPARAM)btn_test.m_hWnd);
-->
nState = ::SendMessage(this->m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_BTN_TOGETSTAT, BN_CLICKED), (LPARAM)btn_test.m_hWnd);
------解决方案--------------------
- C/C++ code
AFX_STATIC BOOL AFXAPI _AfxDispatchCmdMsg(CCmdTarget* pTarget, UINT nID, int nCode, AFX_PMSG pfn, void* pExtra, UINT nSig, AFX_CMDHANDLERINFO* pHandlerInfo) // return TRUE to stop routing { ASSERT_VALID(pTarget); UNUSED(nCode); // unused in release builds union MessageMapFunctions mmf; mmf.pfn = pfn; BOOL bResult = TRUE; // default is ok if (pHandlerInfo != NULL) { // just fill in the information, don't do it pHandlerInfo->pTarget = pTarget; pHandlerInfo->pmf = mmf.pfn; return TRUE; } switch (nSig) { case AfxSig_vv: // normal command or control notification ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED ASSERT(pExtra == NULL); (pTarget->*mmf.pfn_COMMAND)(); // 这里BN_CLICKED消息响应 break; case AfxSig_bv: // normal command or control notification ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED ASSERT(pExtra == NULL); bResult = (pTarget->*mmf.pfn_bCOMMAND)(); break; case AfxSig_vw: // normal command or control notification in a range ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED ASSERT(pExtra == NULL); (pTarget->*mmf.pfn_COMMAND_RANGE)(nID); break; case AfxSig_bw: // extended command (passed ID, returns bContinue) ASSERT(pExtra == NULL); bResult = (pTarget->*mmf.pfn_COMMAND_EX)(nID); break; case AfxSig_vNMHDRpl: { AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra; ASSERT(pNotify != NULL); ASSERT(pNotify->pResult != NULL); ASSERT(pNotify->pNMHDR != NULL); (pTarget->*mmf.pfn_NOTIFY)(pNotify->pNMHDR, pNotify->pResult); } break; case AfxSig_bNMHDRpl: { AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra; ASSERT(pNotify != NULL); ASSERT(pNotify->pResult != NULL); ASSERT(pNotify->pNMHDR != NULL); bResult = (pTarget->*mmf.pfn_bNOTIFY)(pNotify->pNMHDR, pNotify->pResult); } break; case AfxSig_vwNMHDRpl: { AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra; ASSERT(pNotify != NULL); ASSERT(pNotify->pResult != NULL); ASSERT(pNotify->pNMHDR != NULL); (pTarget->*mmf.pfn_NOTIFY_RANGE)(nID, pNotify->pNMHDR, pNotify->pResult); } break; case AfxSig_bwNMHDRpl: { AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra; ASSERT(pNotify != NULL); ASSERT(pNotify->pResult != NULL); ASSERT(pNotify->pNMHDR != NULL); bResult = (pTarget->*mmf.pfn_NOTIFY_EX)(nID, pNotify->pNMHDR, pNotify->pResult); } break; case AfxSig_cmdui: { // ON_UPDATE_COMMAND_UI or ON_UPDATE_COMMAND_UI_REFLECT case ASSERT(CN_UPDATE_COMMAND_UI == (UINT)-1); ASSERT(nCode == CN_UPDATE_COMMAND_UI || nCode == 0xFFFF); ASSERT(pExtra != NULL); CCmdUI* pCmdUI = (CCmdUI*)pExtra; ASSERT(!pCmdUI->m_bContinueRouting); // idle - not set (pTarget->*mmf.pfn_UPDATE_COMMAND_UI)(pCmdUI); bResult = !pCmdUI->m_bContinueRouting; pCmdUI->m_bContinueRouting = FALSE; // go back to idle } break; case AfxSig_cmduiw: { // ON_UPDATE_COMMAND_UI case ASSERT(nCode == CN_UPDATE_COMMAND_UI); ASSERT(pExtra != NULL); CCmdUI* pCmdUI = (CCmdUI*)pExtra; ASSERT(pCmdUI->m_nID == nID); // sanity assert ASSERT(!pCmdUI->m_bContinueRouting); // idle - not set (pTarget->*mmf.pfn_UPDATE_COMMAND_UI_RANGE)(pCmdUI, nID); bResult = !pCmdUI->m_bContinueRouting; pCmdUI->m_bContinueRouting = FALSE; // go back to idle } break; // general extensibility hooks case AfxSig_vpv: (pTarget->*mmf.pfn_OTHER)(pExtra); break; case AfxSig_bpv: bResult = (pTarget->*mmf.pfn_OTHER_EX)(pExtra); break; default: // illegal ASSERT(FALSE); return 0; } return bResult; }