我是在View中动态Create的Button,请问如何相应它的OnLButtonDown函数??应在哪里添加,怎么添加??怎么把按键和消息联系起来?如果我创建时候,把属性改为ownerdraw,为什么显示的Button没有文字??如下:
m_pButton->Create(_T ("Caption"), WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,CRect(400,400,500,424),this,IDC_MYBUTTON);
急,请高手指点,只要有帮助的建议都给分。

解决方案 »

  1.   

    1.手动添加消息映射
    2.ownerdraw为自画属性,必须为按钮装载状态位图,才有效果。
      

  2.   

    GetDlgItem(IDC_MYBUTTON)->SetWindowText("...");
    把这句话加上
      

  3.   

    使用控件子类化吧先声明一个全局函数
    LRESULT CALLBACK YourWindowProc(
      HWND hwnd,      // handle to window
      UINT uMsg,      // message identifier
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter

    {
       if (uMsg == WM_LBUTTONDOWN) {
          ....
       }
       return CallWindowProc(theOldWindowProc, hwnd, uMsg, wParam, lParam);}// 在按钮创建之后添加如下代码
      theOldWindowProc = (WNDPROC)SetWindowLong(GWL_WNDPROC,YourWindowProc);
      

  4.   

    错了一点:
    theOldWindowProc = (WNDPROC)SetWindowLong(pYourButton->m_hWnd, GWL_WNDPROC,YourWindowProc);// theOldWindowProc 是 WNDPROC 类型的全局变量
      

  5.   

    如果是要处理WM_LBUTTONDOWN消息,我想还是从CButton类继承一个CXXXButton
    然后在里面作处理比较方便吧
      

  6.   

    在你的CVIEW类的如下位置设置响应函数BEGIN_MESSAGE_MAP(Cyourview, CView)
    //{{AFX_MSG_MAP(Cyourview) ON_COMMAND(IDC_MYBUTTON, OnCommandButton)   //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ........................
    Cyourview::OnCommandButton()
    {
      //do
    }自绘需要用CButton::SetWindowText来设置文字
      

  7.   

    在你的CVIEW类的如下位置设置响应函数BEGIN_MESSAGE_MAP(Cyourview, CView)
    //{{AFX_MSG_MAP(Cyourview) ON_COMMAND(IDC_MYBUTTON, OnCommandButton)   //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ........................
    Cyourview::OnCommandButton()
    {
      //do
    }自绘需要用CButton::SetWindowText来设置文字
      

  8.   

    to 阿笨猫:theOldWindowProc = (WNDPROC)SetWindowLong(m_pButton->m_hWnd, GWL_WNDPROC,YourWindowProc);YourWindowProc定义的类型和参数类型不匹配,编译通不过阿。
      

  9.   

    头文件里
    afx_msg void OnButtonStart();资源里加一字符串资源
    IDC_BUTTON_START父窗口oncreate中:
    m_StartButton.Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW, 
    CRect(0,1,50,22), this, IDC_BUTTON_START);CPP文件的消息映射中:
    ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
      

  10.   

    上例中将BS_OWNERDRAW去掉,是直接从我工程中拷贝的。
      

  11.   

    在你的CVIEW类的如下位置设置响应函数BEGIN_MESSAGE_MAP(Cyourview, CView)
    //{{AFX_MSG_MAP(Cyourview) ON_COMMAND(IDC_MYBUTTON, OnCommandButton)   //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ........................
    Cyourview::OnCommandButton()
    {
      //do
    }自绘需要用CButton::SetWindowText来设置文字
    当然,还有另外一个方法:从CButton类继承一个CXXXButton类,然后把你的按钮对应这个类,这个不用我教你了吧,然后在classwizard中手动添加CXXXButton类的消息映射
    然后在里面作处理比较方便吧
      

  12.   

    to cqjiang(蒋天书)  :    按你的方法试了,编译通过,可以运行,但还是无法单击那个按钮。
    我是在单文档项目中,在view中动态生成Button,谁有这么用过啊?为什么不能单击它?
      

  13.   

    重载CButton,在里面处理消息,能后subclass的控件
    CMyButton *p_Button;
    p_Button = new CMyButton();
    p_Button.Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
      

  14.   


    ------------------------------
    将BS_OWNERDRAW换成BS_PUSHBUTTON
    ------------------------------
      

  15.   

    去掉ownerdraw属性
    子类化CButton
      

  16.   

    唉,我的目的是在建立一个单文档项目,View上有背景图,透明的ownerdraw的按钮。不过,最后还是没时间实现了。我当初出错的原因好像是应创建CButton对象,而不是指针对象。不过,就成功了一次。后来想加到代码中又出错了:(
    还是很谢谢大家,散分了。