关于网友提出的“ 关于按钮处理自身BN_CLICK消息的问题”问题疑问,本网通过在网上对“ 关于按钮处理自身BN_CLICK消息的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 关于按钮处理自身BN_CLICK消息的问题描述:
按钮BN_CLICK
我想在自己的按钮类中处理BN_CLICK消息是否返回, 该怎么做. 我是想实现, 在BN_CLICK通知消息未返回时, 按钮始终显示按下状态. 但又不想自己处理WM_LBUTTONDOWN消息, 因为这个消息处理了很多东西, 比如焦点, 鼠标捕获等等, 因为还不完全确定按钮原生的WM_LBUTTONDOWN响应中处理些什么东西.最好是能知道BN_CLICK消息的处理. (从按钮内部)
实在没办法, 也可以说说WM_LBUTTONDOWND时, 按钮的默认处理都做了些什么?
谢谢大家了.
解决方案1:
ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
OnClicked 根据你的需要设置状态,然后自己控制返回值,如果return TRUE那么窗体点击事件无效。
相反,则有效。
我自己自绘checkbox/radiobox就这样处理。
按钮的WindowProc处理WM_LBUTTONUP是最后才SendMessage给父窗口的,你先让它自己处理就行了
void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
CButton::OnLButtonUp(nFlags, point);
//这里BN_CLICKED就已经响应完成了
}
解决方案3:
楼主说的BN_CLICK应该是BN_CLICKED吧
父窗口接收到BN_CLICKED的时候已经是lbuttonup的了
按ComboBox那种应该是lbuttondown就弹菜单
试试 BS_AUTOCHECKBOX | BS_PUSHLIKE
然后可以自己发消息控制它的状态
如果你一定要处理,我觉得不如处理onlbuttonup,但是你父窗口始终得给他一个事件结束弹起的通知,这又何必呢
解决方案6:你这本身就不和逻辑吧,本身就该是父窗口处理其click事件,然后setstate不弹起,等待popup菜单处理结束再setstate回来
解决方案7: ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
afx_msg BOOL OnClicked();
注意这个 BOOL OnClicked(); 是有 返回值的 ,FALSE 表示父窗口 还可以响应(处理)。
那就在 WM_LBUTTONUP 中 SendMessage
GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID(), m_hWnd);
return 0;
反射消息
ON_CONTROL_REFLECT_EX( BN_CLICKED