我的自绘按钮为什么不响应单击时间,我已经加了映射了,ON_BN_CLICKED(200, OnNeosytle)

解决方案 »

  1.   

    [email protected]
    方便的话发给我看看
      

  2.   

    [email protected]
    发这个信箱,msn太小了
      

  3.   

    你的自类化的按钮中使用了onlbuttondown和对话框中ON_BN_CLICKED(200, OnNeosytle)重定义了.
    执行了onlbuttondown.
      

  4.   

    也给我发一个吧
    我帮你看看
    [email protected]
      

  5.   

    从fanqing(火影忍者+26%)那里得到代码,看了一下,我认为问题在于,你的那个Cbt类的OnLButtonDown()函数中,屏蔽了调用其父类的该处理函数:CButton::OnLButtonDown(nFlags, point);,这样的效果就只能实现你自绘的效果,不能触发“单击”消息,也就当然不会起作用了但是当我去掉那个屏蔽时,程序出错,我还没有找到原因,而恰好中午要出去办点事,估计得到傍晚时分或者晚上了,希望能帮你解决。
      

  6.   

    1.代码是楼主给的.
    2. fengqinggao(风清高) 你的想 法和我开始的一样,看上面我的贴.还有他屏蔽的ON_BN_CLICKED消息.
    但是我想想OnLButtonDown和ON_BN_CLICKED应该是两个不同的消息怎么会相互干扰呢?
      

  7.   

    但是我想想OnLButtonDown和ON_BN_CLICKED映射的消息应该是两个不同的消息怎么会相互干扰呢?
      

  8.   

    他们俩的确是不同的消息,但是也是有些关联的,LButtonDown是Click的基础,如果没有LButtonDown,系统则不认为有Click的消息,具体我再看看
      

  9.   

    不会相互干扰的.我实验过了.但是函数中提供的CEdit::xxx 不要删除这个会影响消息映射的一些默认操作而且这些操作与Click有关,删除了反而会影响的.
    关键还是他自绘函数问题.他使用ModifyStyle(0, BS_OWNERDRAW);而对应自会函数却没有,使用了自己.所以产生了错误.
      

  10.   

    to:楼主和fanqing(火影忍者+26%),我们进行如下测试:1、将自绘按钮改成非自绘按钮。
    方法:将ModifyStyle(0, BS_OWNERDRAW);语句屏蔽,然后删除Cbt类的OnPaint()函数;
    现象:按钮外貌是普通按钮,能够随鼠标改变状态,但是不能响应Click()消息;
    原因:屏蔽了CButton::OnLButtonDown()和CButton::OnLButtonUp()函数。2、续上
    操作:使CButton::OnLButtonDown()和CButton::OnLButtonUp()语句有效;
    现象:按钮外貌是普通按钮,能够随鼠标改变状态,不能响应单击消息,但是当双击时,大部分时间会触发OnClick()函数,即双击时有可能触发单击消息,弹出那个MessageBox对话框;
    原因:OnLButtonDown()和CButton::OnLButtonUp()函数中,那些改变按钮状态的语句耗时间太多,系统接收了第一下的ButtonDown和第二下的ButtonUp,组成了Click,也就触发了OnClick()消息;3、续上
    操作:将OnLButtonDown()和CButton::OnLButtonUp()函数中其他语句删除,只分别留下CButton::OnLButtonDown()和CButton::OnLButtonUp()语句;
    现象:能够很顺利的响应Click,即每单击一下都响应了OnClick消息,弹出那个对话框;
    原因:不自绘时,代码正确由上的测试,可以看出
    1、ButtonDown和ButtonUp和Click是有关系的,见测试(1);
    2、当OnLButtonDown()和CButton::OnLButtonUp()中语句过多,特别是对窗口更新耗时过多时,会影响窗口的单击消息的发送,见测试(2);
    3、Dlg类中的消息响应函数没有问题,见测试(3)。我的机器是CY1.7G、256DDR的,系统是2000,VC6,算常见配置,测试应该有效。当进行按钮自绘时,如果使OnLButtonDown()函数中的CButton::OnLButtonDown()有效的话,单击按钮时会直接崩溃,根据崩溃的现象看来,应该是使用了无效指针,因没有做过自绘的程序,一下子找不到原因在哪儿,继续努力
      

  11.   

    另:重载了OnPaint()函数,就是进行自绘了,所以 BS_OWNERDRAW 的对应自绘函数是有的
      

  12.   

    还进行了一个测试就是OnPaint()函数也没有错误,将该函数内的所有代码删除,自是没有按钮的外形,单击时得到和上面一样的结果
      

  13.   

    楼上的方法和我测试一样啊.结果也一样啊!哈哈!
    当进行按钮自绘时,如果使OnLButtonDown()函数中的CButton::OnLButtonDown()有效的话,单击按钮时会直接崩溃,根据崩溃的现象看来,应该是使用了无效指针,因没有做过自绘的程序,一下子找不到原因在哪儿,继续努力
      

  14.   

    真热闹!!各位给我发一份好吗?我也凑凑热闹[email protected]
      

  15.   

    查MSDN,自绘真正触发的是DrawItem函数,虽然OnPaint()也能达到自绘效果,但是不知道为啥会出现无效指针的情况,于是将OnPaint()函数删除,改为DrawItem函数,并且将OnPaint()函数内的语句进行修改,如下:
    BITMAP bitMap;
    CRect rc;
    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    int  iSaveDC=pDC->SaveDC();
    rc.CopyRect(&lpDrawItemStruct->rcItem);

    Bt_back.GetBitmap(&bitMap); CDC memDC;
    CBitmap* pOld=NULL;
    memDC.CreateCompatibleDC(pDC);
    BITMAP bmpInfo;
    int Width;
    int Height; ASSERT(Bt_back.m_hObject!=NULL);
    Bt_back.GetBitmap(&bmpInfo);

    pOld=memDC.SelectObject((CBitmap*) &Bt_back);
    if (pOld==NULL) return; //Destructors will clean up

    Width=(bmpInfo.bmWidth-rc.Width())/2;
    Height=(bmpInfo.bmHeight-rc.Height())/2;

    pDC->BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);

    memDC.SelectObject(pOld);
    pDC->RestoreDC(iSaveDC); CPaintDC dc(this);
    DrawText(&dc);
    如此修改后还有两个问题,就是LButtonDown和LButtonUp函数中不能有其他代码,而且不能显示文字,去掉LButtonDown和LButtonUp函数中的代码后,能很顺利响应单击消息了。还需要修改,没时间了,只能放一下了,希望后来人努力!建议楼主下一个自绘按钮的例程,直接用或者仿做一个也行,很多的,这样从头到尾调试,太费脑筋,呵呵
      

  16.   

    注:以上修改后的语句是放在DrawItem()函数中
      

  17.   

    我说的吧他触发的自绘函数有问题哈哈!应该在构造函数中接受赋值,初始化一些对象和变量,然后在drawitem中调用自己的画图函数.
      

  18.   

    to:plazuopeng,我已经代楼主将源码发送给你了,请查收,:)to:fanqing,pfpf,希望能善始善终,彻底帮楼主解决问题
      

  19.   

    我就是搞不明白
    当进行按钮自绘时,如果使OnLButtonDown()函数中的CButton::OnLButtonDown()有效的话,单击按钮时会直接崩溃,根据崩溃的现象看来,应该是使用了无效指针,因没有做过自绘的程序,一下子找不到原因在哪儿.
      

  20.   

    我试过了,在Cbt::OnLButtonDown(UINT nFlags, CPoint point)中去掉Invalidate()函数就可以响应ON_BN_CLICKED了。不过那样的话,BUTTON就不能达到楼主所期望的效果了。楼主重载Cbi::DrawItem函数,把所有的绘制和鼠标操作的代码都放进去。这样的话,就可以达到你所期望的效果了。也可以到网上去找找类似于CButtonST等自画BUTTON是怎么自画的。
      

  21.   

    小弟真的谢谢各位大哥了,问题解决了,我在Cbt::OnLButtonUp(UINT nFlags, CPoint point) 中加了GetParent()->SendMessage( WM_COMMAND, GetDlgCtrlID(), (LPARAM)m_hWnd );
    就可以了,有这么多大哥回答,这分怎么给呢?
      

  22.   

    [email protected]
    发给我看看