派生于CWnd的中添加的按钮为什么不响应事件? CWnd派生一个新的类,在该类定义了一个 CButton m_btnTest 在OnCreate 中:m_btnTest.Create("test",WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,CRect(10,60,50,80),this,WM_USER+1102); 但是为什么该按钮不响应任何事件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WM_USER+1102的响应函数有么?弄这么大干什么1102 WM_USER+1102 这个是按钮的ID你把响应写到哪里了?Message 是发给父窗口的,就是你的 CWnd派生一个新的类 问题与WM_USER+1102大小无关。ON_BN_CLICKED(WM_USER+1102, OnButtonTest)afx_msg void OnButtonTest();void CMyCWnd::OnButtonTest() { AfxMessageBox("a");} 基本原因已经找到,void CMyCWnd::CMyCWnd(){ SetCapture();//就是这个东东造成的。}虽然去掉它,可以解决控件响应的问题;但是出现了其它问题,比如:在new CMyCWnd();(窗体)之外的鼠标事件,它就捕获不到的。因为要求鼠标点击该窗体之外的地方,就要将其销毁。新问题 我说呢,看着代码没什么问题,勿敢妄加评论。但还是不对呀,void CMyCWnd::CMyCWnd(){ SetCapture();//就是这个东东造成的。 }//在构造函数里调用SetCapture();,此时窗口还没创建,不会报错??如果在OnCreate 中调用SetCapture();,也不会影响控件响应啊!! 贴出来的代码省掉了很多,其实我的构造函数里是调用了下面这个自定义函数BOOL CMyCWnd::Create(CPoint p, CWnd *pParentWnd, COLORREF crColour){ ASSERT(pParentWnd && ::IsWindow(pParentWnd->GetSafeHwnd())); m_pParent=pParentWnd; CString szClassName=AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW, 0, (HBRUSH)(COLOR_BTNFACE+1), 0 ); if(!CWnd::CreateEx(0,szClassName,_T(""),WS_VISIBLE|WS_POPUP, p.x,p.y,115,120, pParentWnd->GetSafeHwnd(),0,NULL )) return FALSE; m_btnTest.Create("test",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(10,60,50,80),this,123); SetCapture(); //在这里 return TRUE;}另外我在CMyCWnd 的MouseMove里加了如下代码, DWORD pos = GetMessagePos(); point = CPoint(LOWORD(pos), HIWORD(pos)); CRect m_btnRect; m_btnTest.GetWindowRect(m_btnRect); if(m_btnRect.PtInRect(point)){ ReleaseCapture(); m_btnTest.SetCapture(); }else{ SetCapture(); }基本符合我的要求了,不过发现有内存泄漏,问题不大了,再仔细检测应该可以搞定了。多谢几位参与讨论。 内存泄漏问题也解决,不是由于上面的问题引起的。void CColorPanel::OnNcDestroy() { CWnd::OnNcDestroy(); // TODO: Add your message handler code here delete this; } CStatic 显示的jpg图片 分辨率太低 不清晰 简单问题请教 Combobox控件只能关联int和CString变量吗? VC图像处理中。如何标出一幅图与一幅预先设置的标准图的不同之处? Hook 内核API 如何用代码自动修改我的电脑的属性,能实现吗?急,在线等!!!!!!!!!!!!!!!!!! SetWindowLong(hwnd, GWL_USERDATA, lParam)有什么作用 vc哪里下载 关于VC++对话框的问题? 如何双击文件,打开一个新的程序 100分求教:用installshield12打包的mfc程序,在没装vc6的机子上不能使用 DLL局部变量共享问题
{
AfxMessageBox("a");
}
SetCapture();//就是这个东东造成的。
}虽然去掉它,可以解决控件响应的问题;但是出现了其它问题,比如:在new CMyCWnd();(窗体)之外的鼠标事件,它就捕获不到的。因为要求鼠标点击该窗体之外的地方,就要将其销毁。新问题
但还是不对呀,
void CMyCWnd::CMyCWnd(){
SetCapture();//就是这个东东造成的。
}//在构造函数里调用SetCapture();,此时窗口还没创建,不会报错??
如果在OnCreate 中调用SetCapture();,也不会影响控件响应啊!!
{
ASSERT(pParentWnd && ::IsWindow(pParentWnd->GetSafeHwnd())); m_pParent=pParentWnd;
CString szClassName=AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,
0,
(HBRUSH)(COLOR_BTNFACE+1),
0
);
if(!CWnd::CreateEx(0,szClassName,_T(""),WS_VISIBLE|WS_POPUP,
p.x,p.y,115,120,
pParentWnd->GetSafeHwnd(),0,NULL
))
return FALSE;
m_btnTest.Create("test",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(10,60,50,80),this,123);
SetCapture(); //在这里
return TRUE;
}
另外我在CMyCWnd 的MouseMove里
加了如下代码, DWORD pos = GetMessagePos();
point = CPoint(LOWORD(pos), HIWORD(pos));
CRect m_btnRect;
m_btnTest.GetWindowRect(m_btnRect);
if(m_btnRect.PtInRect(point)){
ReleaseCapture();
m_btnTest.SetCapture();
}else{
SetCapture();
}
基本符合我的要求了,不过发现有内存泄漏,问题不大了,再仔细检测应该可以搞定了。
多谢几位参与讨论。
{
CWnd::OnNcDestroy();
// TODO: Add your message handler code here
delete this;
}