MFC对话框中 动态创建控件(比如BUTTON)并响应消息(比如左键单击、拖拽等)的源码。
谁贡献一下,让我学习学习!
谢谢了!

解决方案 »

  1.   

    网上有
    http://idcnews.net/html/edu/20071229/79440.html
    我就不帮你写了
      

  2.   

    CButton button;
    button.Create("Click Me", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0,0,100,100), this, NULL);
      

  3.   

    动态创建Button函数CButton::Create 
    virtual BOOL Create(
       LPCTSTR lpszCaption,
       DWORD dwStyle,
       const RECT& rect,
       CWnd* pParentWnd,
       UINT nID 
    );
    消息响应函数通过Ctrl+W,由向导为你自动添加
      

  4.   

    可以重载WM_COMMAND消息,没试验过
      

  5.   

    http://zxgboss.spaces.live.com/blog/cns!2487179A030E3E4E!139.entry
      

  6.   

    处理WM_LBUTTONDOWN和WM_LButtonUp以一个文本框为例 创建Edit的扩张类CMyEditEx
       (1)鼠标按下
    void CMyEditEx::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    pPoint=point;      
    SetTimer(1,5,NULL); // 引发定时器CEdit::OnLButtonDown(nFlags, point);
    }
        (2)鼠标弹起void CMyEditEx::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    KillTimer(1); // 关闭定时器
    CEdit::OnLButtonUp(nFlags, point);
    }
        (3)定时时间
    void CMyEditEx::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    if(nIDEvent==1)

       //获得鼠标当前位置,转换为父窗口内的坐标
      
       CPoint cursor_Pos;
       GetCursorPos(&cursor_Pos);//该函数检取光标的位置,以屏幕坐标表示。
       GetParent()->ScreenToClient(&cursor_Pos); //该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
      
       CPoint edit_Pos=pPoint;
       ClientToScreen(&edit_Pos);//该函数将指定点的用户坐标转换成屏幕坐标
       GetParent()->ScreenToClient(&edit_Pos);
      
       // 获得控件的大小,并且转换到父窗口的坐标,主要是为了获得左上角的坐标,方便下面的movewindow调用
       CRect edit_rect;
       GetWindowRect(edit_rect);//该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
       GetParent()->ScreenToClient(&edit_rect);
      
       CRect parentRect;
       GetParent()->GetClientRect(parentRect);
       // 利用向量相等的性质求得鼠标移动后的新左上角坐标
      
       int x=edit_rect.left+(cursor_Pos.x-edit_Pos.x);
       int y=edit_rect.top+(cursor_Pos.y-edit_Pos.y);
       if (x<0)
       {
        x=0;
       }
       if (y<0)
       {
        y=0;
       }
       if (x+edit_rect.Width()>parentRect.Width())
       {
        x = parentRect.Width() - edit_rect.Width();
       }
       if (y+edit_rect.Height()>parentRect.Height())
       {
        y = parentRect.Height() - edit_rect.Height();
       }   MoveWindow(x,y,edit_rect.Width(),edit_rect.Height());
    }CEdit::OnTimer(nIDEvent);
    }   (4)在DLG窗口中添加改扩张类的控件就OK了
      

  7.   

    受教了! 我试过了 可以拖动,但是有个问题,动态控件已经响应了单击时间,拖动之后怎么让单击不响应呢?我用 ONCOMMAND()函数 也试过  相应 单击时间还行 但是响应拖动 就不太会了,有没有ONCOMMAND 的示例代码呢? 
      

  8.   

    在类中定义一个对象,CButton的对象,然后,静态的画一个Button,然后改一下ID,再添加一个单击事件,这样,消息映射就有了,也不用自己去添加别的,然后,再把这个Button删掉,再然后,使用定义的CButton对象,调用它的Create(_T("按钮"), WS_CHILD | WS_VISIBLE, CRect(0,0,10,10), Parent, 你刚才改的那个ID);这就OK了。
      

  9.   

    如果我要创建的控件,比如button 个数是不固定的,消息响应怎么做?
    如果是菜单有ON_COMMAND_RANGE 宏,可以指定一个id范围,然后到同一个函数中去处理
    但是 ON_BN_CLICKED就没有类似的机制了
    现在用了一个笨办法,先写好了一堆消息映射,和响应函数,比如20个
    但是要创建的控件上限并不可知,超过20个以后怎么办?有没有什么好的办法
      

  10.   

    ON_CONTROL_RANGE(BN_CLICKED,ID_BUTTON1,ID_BUTTON1+ 30,OnClickedButton)...