◆◆◆动态创建控件无法捕获BN_CLICKED事件的问题
有一个继承类
class CUCPay : public CStatic
{
CButton m_chkName;
}
在PreSubclassWindow的时候调用动态创建CheckBox的代码
m_chkName.Create(pPayType->strTypeName
, WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP
, CRect(0, 0, 100, 32)
, this
, 1000);
然后想响应m_chkName的状态改变事件BN_CLICKED,那么有如下代码:
// 截获消息
BOOL CUCPay::PreTranslateMessage(MSG* pMsg)
{
TRACE("%d,%d,%d,%d"
, pMsg->hwnd
, pMsg->message
, pMsg->wParam
, pMsg->lParam
);// message总是不等于WM_COMMAND
return CStatic::PreTranslateMessage(pMsg);
}
但是总是截获不了WM_COMMAND的消息,所以就无法获得通知码BN_CLICKED了.
现在我的解决办法如下:
BOOL CUCPay::PreTranslateMessage(MSG* pMsg)
{
// 如果选中了此控件
if(pMsg->message == WM_LBUTTONUP || pMsg->message == WM_KEYDOWN)
{
// 根据句柄判断是否按下某个控件
if(pMsg->hwnd == m_chkName.GetSafeHwnd())
{
CString strTemp;
strTemp.Format("当前状态:%d" , m_chkName.GetCheck());
AfxMessageBox(strTemp);
}
}
return CStatic::PreTranslateMessage(pMsg);
}
这样状态是获取了.但是获得的状态总是鼠标按下以前的状态,鼠标按下以后的状态就只能在下次鼠标按下的时候才能获取了.
100分请教高手解决此问题.谢谢了!
问题点数:100、回复次数:10Top
1 楼krh2001(边城浪子)回复于 2005-07-02 10:27:28 得分 20
要想控件产生花BN_CLICK消息,应该在创建的时候指定风格标志:SS_NOTIFY
Top
2 楼mybios(俊俊哥哥)回复于 2005-07-02 11:03:25 得分 0
谢谢 krh2001 ,但是我刚刚试过了.
我把Create代码改成
m_chkName.Create(pPayType->strTypeName
, WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP | SS_NOTIFY
, CRect(0, 0, 100, 32)
, this
, 1000);
然后PreTranslateMessage里面根本截获不到WM_COMMAND的消息哦.
Top
3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-07-02 13:34:48 得分 20
#define ID_BUTTON_TEST 6000
CButton btn;
afx_msg void OnTest();//.h
btn.Create("button",WS_CHILD|WS_VISIBLE,CRect(),this,ID_BUTTON_TEST );
ON_COMMAND(ID_BUTTON_TEST ,OnTest);
void CTest::OnTest()
{
MessageBox("");
}
Top
4 楼mybios(俊俊哥哥)回复于 2005-07-02 13:48:34 得分 0
to: oyljerry
你这个是在对话框中的写法。情况跟我的不同。Top
5 楼mybios(俊俊哥哥)回复于 2005-07-02 14:12:21 得分 0
已经想到办法了。创建的时候不需要指定风格标志:SS_NOTIFY
只需要重载OnCommand,不可以在PreTransferMessage里面写。Top
6 楼allenhiman(9Ft)回复于 2005-07-02 15:11:30 得分 0
...
Top
7 楼wangjia184(我就是传说中的。。。。。。SB)回复于 2005-07-12 13:07:54 得分 0
在 PreTransferMessage 里面处理鼠标点击
判断 ptTop
8 楼casinosun(去日苦多)回复于 2005-07-12 13:50:10 得分 20
就是ON_COMMAND(ID_BUTTON_TEST ,OnTest);
void CTest::OnTest()
{
MessageBox("");
}
在对话框和窗口中都行Top
9 楼greenabc(green)回复于 2005-07-12 20:34:42 得分 20
在PreSubclassWindow的时候调用动态创建CheckBox的代码
m_chkName.Create(pPayType->strTypeName
, WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP
, CRect(0, 0, 100, 32)
, this
, 1000);
改到
int CUCPay::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatic::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_chkName.Create(pPayType->strTypeName
, WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP
, CRect(0, 0, 100, 32)
, this
, 1000);
return 0;
}
Top
10 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-07-12 23:36:18 得分 20
PreTranslateMessage是否仅仅对顶级窗口有效Top




