none
OnLButtonDown获得的point的值无法传出本函数 RRS feed

  • 问题

  • 我建了一个类CSkinBtn是基于CButton的,在这个类中,我添加了成员变量m_nCurpos,在构造函数中初始化为0, 添加了单击响应事件函数如下:

    void CSkinBtn::OnLButtonDown(UINT nFlags, CPoint point)
    {
     CRect rect;
     GetClientRect(&rect);

     if (rect.PtInRect(point))
     {
      m_nCurPos = point.x;
      m_strdlg.Format("   %d, %d ", m_nCurPos, point.y);
      AfxMessageBox(m_strdlg);              //暂时显示一下获得的位置(1)
     }
     Invalidate();
     CButton::OnLButtonDown(nFlags, point);
    }

    然后,我在CDlg的对话框中添加了几个按钮(例button1),style为owner draw,然后,在该对话框类的OnInitdialog中对各个按钮的关联变量进行初始化,是调用CSkinBtn中的函数。在button1的响应函数当中,我添加了如下代码:

    OnButton1()

     m_nCurPos = m_skinbtn.m_nCurPos;
     m_strdlg.Format(" current position : %ld ", m_nCurPos);
     AfxMessageBox(m_strdlg);                        //第二个(2)

    目的就是要获得点击的位置。

    结果是:我点击按钮1的不同位置,在(1)中显示出不同的值,这些值是正确的,但是(2)的对话框却弹不出,注释掉(1)的AfxMessageBox,弹出了(2)但是,显示的值都是初始化值0,一直不变。对(1)、(2)AfxMessageBox,都注释掉,断点查看,执行完OnLButtonDown后,执行了OnButton1.

    请问,这是什么缘故?是不是由于button自绘引起?还是我哪里错了,我该怎么去解决?  

    先谢谢了。

     

    2010年5月15日 13:19

答案

  • AfxMessageBox会阻塞当前消息的处理,启动另外一个消息循环。建议用TRACE来在调试窗口输出诊断消息。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 神秘人 2010年5月17日 1:42
    2010年5月15日 15:03
    版主
  • OnButtonUp执行完后才会执行你的OnButton1.

    不要用MessageBox看输出,它会阻塞进程,用OutputDebugString,然后在VS下面的窗口Output->Debug下查看输出.


    0xBAADF00D
    • 已标记为答案 神秘人 2010年5月17日 1:42
    2010年5月16日 15:52
    版主

全部回复

  • AfxMessageBox会阻塞当前消息的处理,启动另外一个消息循环。建议用TRACE来在调试窗口输出诊断消息。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 神秘人 2010年5月17日 1:42
    2010年5月15日 15:03
    版主
  • 获取鼠标位置的话用GetCursorPos......
    0xBAADF00D
    2010年5月15日 16:21
    版主
  • 谢谢两位版主的回复。

    to Sheng Jiang 蒋晟 :我试了,调试中,还是在OnLButtonDown中的数据对,在其他地方的数据都是初始化值0;

    to vonger :我需要获得的是在该按钮矩形内的point点的值,而不是整个客户区的。

    我的疑问是我是不是需要什么设置,或者是自绘按钮有什么注意的地方,我想应该是这些方面我没有注意到吧。

     

    2010年5月16日 0:35
  • 一般都是这样的GetCursorPos获取鼠标在屏幕的位置,再获取窗口的在屏幕的位置GetWindowRect,然后相减得到你的窗口的相对位置
    0xBAADF00D
    2010年5月16日 2:36
    版主
  • to Vonger:

    这个方法是不错,但是我的方法的问题出在哪里了,版主是否可以给我分析、说明一下?谢谢

    2010年5月16日 5:03
  • 我现在对基于CButton类的CSkinBtn类调试看了看,发现,这个类的数据和父窗口的数据通信都正常,就是和OnLButtonDown函数中的数据无法通信,即使是本类的变量也不行,请问是怎么回事?

    to Vonger:我按照你的方法GetCursorPos()来计算,是的,很好,现在也在用,但是问题是,获得的值也传不出去,其他的值也传不进来参与运算。

    急切请问怎么回事。

    2010年5月16日 10:07
  • OnButtonUp执行完后才会执行你的OnButton1.

    不要用MessageBox看输出,它会阻塞进程,用OutputDebugString,然后在VS下面的窗口Output->Debug下查看输出.


    0xBAADF00D
    • 已标记为答案 神秘人 2010年5月17日 1:42
    2010年5月16日 15:52
    版主
  • 非常感谢两位版主的回答,我的问题在两位高手的回复中慢慢得到了解决,谢谢。

    2010年5月17日 1:43