您的位置:程序门 -> vc/mfc -> 界面



派生于cwnd的中添加的按钮为什么不响应事件?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


派生于cwnd的中添加的按钮为什么不响应事件?[已结贴,结贴人:akunshenjk]
发表于:2008-02-21 14:56:48 楼主
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);     但是为什么该按钮不响应任何事件?
发表于:2008-02-21 15:03:191楼 得分:4
wm_user+1102的响应函数有么?弄这么大干什么1102
发表于:2008-02-21 15:04:302楼 得分:8
wm_user+1102     这个是按钮的id

你把响应写到哪里了?message   是发给父窗口的,就是你的       cwnd派生一个新的类
发表于:2008-02-21 15:11:573楼 得分:0
问题与wm_user+1102大小无关。

on_bn_clicked(wm_user+1102,   onbuttontest)

afx_msg   void   onbuttontest();

void   cmycwnd::onbuttontest()  
{
afxmessagebox("a");
}
发表于:2008-02-21 16:38:164楼 得分:0
基本原因已经找到,void   cmycwnd::cmycwnd(){
    setcapture();//就是这个东东造成的。


虽然去掉它,可以解决控件响应的问题;但是出现了其它问题,比如:在new   cmycwnd();(窗体)之外的鼠标事件,它就捕获不到的。因为要求鼠标点击该窗体之外的地方,就要将其销毁。新问题
发表于:2008-02-21 16:50:355楼 得分:8
我说呢,看着代码没什么问题,勿敢妄加评论。
但还是不对呀,
void       cmycwnd::cmycwnd(){  
        setcapture();//就是这个东东造成的。  
}//在构造函数里调用setcapture();,此时窗口还没创建,不会报错??
如果在oncreate       中调用setcapture();,也不会影响控件响应啊!!
发表于:2008-02-21 17:00:416楼 得分:0
贴出来的代码省掉了很多,其实我的构造函数里是调用了下面这个自定义函数
c/c++ code
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); [color=#ff0000]setcapture(); //在这里[/color] return true; }


另外我在cmycwnd   的mousemove里
加了如下代码,
c/c++ code
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(); }


基本符合我的要求了,不过发现有内存泄漏,问题不大了,再仔细检测应该可以搞定了。
多谢几位参与讨论。
发表于:2008-02-22 09:32:277楼 得分:0
内存泄漏问题也解决,不是由于上面的问题引起的。
c/c++ code
void ccolorpanel::onncdestroy() { cwnd::onncdestroy(); // todo: add your message handler code here delete this; }


快速检索

最新资讯
热门点击