1、在一个窗口初始时动态创建了几个按钮,可是如何才能让这些按钮响应鼠标事件呢?
(一般情况下都是类向导中给按钮添加事件)2、通过父窗口显示出窗口后,想通过子窗口中的一个控件触发父窗口中的一个事件?3、如何让派生一个CRichEdit类,使其响应鼠标点击事件?谢谢,各位,帮忙看看!

解决方案 »

  1.   

    1)派生button类,然后创建你派生的类,就会有很大的灵活性。
      另外你动态创建按钮时,也要指定id的,可以根据这些id做点事。
    2)可以用让子类转发消息给父类。如果可能的话,可以自己在父类手工添加响应函数。
      

  2.   

    1 可以手动的添加消息映射 
    你看mfc自己生成的那些代码上面,有BEGIN_MESSAGEMAP等字样,这个就是消息映射,你要按照格式自己进行添加,2 不明白你说的事件是什么意思,是不是就是主窗口的一个方法或者是和函数?假设你的主窗口的类名是CMyDialog
    那么你这么做
    在子窗口的cpp里面包含mydialog.h这个头文件,然后用下面的代码
    CMyDialog *p=(CMyDialog)::AfxGetApp()->GetMainWnd();
    这个指针p就是指向主窗口的,然后就可以这样使用主窗口的方法(主窗口类的成员函数和成员变量)了。
    p->XXXX();3 添加一个mfc的类,可以随便选择一个基类,也可以不选择,然后到这个类的h文件里面,找到类声明的地方,在后面加上
    :public CRichEdit
      

  3.   

    http://blog.csdn.net/smallfishff/archive/2007/11/14/1884671.aspx
      

  4.   

    谢谢,楼上的三位
    可是动态创建了一个按钮后
    (m_Btn7.Create("体育馆", WS_CHILD | WS_VISIBLE, CPoint(15 + 64 + 128, 63), cr, this,IDC_SPORT, 1, RGB(254, 247, 211), RGB(211, 247, 254), RGB(211, 247, 254), GetSysColor(COLOR_BTNFACE)); )我先是用PreTranslateMessage()方法获得鼠标点击处的控件
    BOOL COwnSpereDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if (pMsg->message==WM_LBUTTONDOWN)
    {
    CPoint point(LOWORD(pMsg->lParam),HIWORD(pMsg->lParam));
    ::ClientToScreen(pMsg->hwnd,&point);
    OnLButtonDown(0,point);

    }
    return CDialog::PreTranslateMessage(pMsg);
    }然后又用鼠标左键事件使得动态创建的按钮上的文字发后改变
    void COwnSpereDlg::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if (GetDlgCtrlID()==IDC_SPORT)
    {
    GetDlgItem(IDC_SPORT)->SetWindowText("haole");
    }
    CDialog::OnLButtonDown(nFlags, point);
    }可是这样仍然不行,不知道怎么回事??是不是需要在消息映射里手工添加自己设置的另一个函数来实现呢??
    谢谢!
      

  5.   

    //一种方法,定义Cbutton派生类,添加BN_CLICKED响应函数
    void CMyButton::OnClicked() //BN_CLICKED响应函数
    {
    SetWindowText("haole"); 
    }//另一个方法:
    //随便拖入一个button,用向导建立dlg的CLICKED响应,再删除button,然后换成你的id。手工添加都免了.不知道,你的m_Btn7是什么
      

  6.   

    呵,谢谢5楼的朋友
    好了,
    可是要是要是动态创建的CRichHand(CRichHand是由RichEdit派生出的一个新类)的呢?
    如何实现鼠标的点击事件呢?
      

  7.   

    我是指在动态创建几个RichHand后
    在主窗口内实现他们的单击事件
    怎么办呢?我试着用5楼的朋友说的方法,好像也不行
      

  8.   

    那就是你的问题了,我都有vc6.0试过了。对于RichEdit,方法类似。
      

  9.   

    谢谢,楼上的朋友们,
    第一个和第三个问题解决了,可是第二个还是不行。我的主窗口类是CTuShHuaXianDlg
    按二楼朋友的说法,在另一个子窗口中的CPP文件中加入#include "TuShHuaXianDlg.h"
    然后在需要响应父窗口事件的地方添加:
    CTuShHuaXianDlg *p=(CTuShHuaXianDlg)::AfxGetApp()-> GetMainWnd();
    可是编译时出现如下错误:error C2440: 'initializing' : cannot convert from 'class CTuShHuaXianDlg' to 'class CTuShHuaXianDlg *'这是怎么回事呢?
    麻烦各位再帮忙看看,谢谢!
      

  10.   

    应该是CTuShHuaXianDlg *p=(CTuShHuaXianDlg*)::AfxGetApp()->  GetMainWnd(); 吧
      

  11.   

    好的,谢谢各位,都搞定了
    原来是这样就行了:
    CTuShHuaXianDlg   *pDlg   =   (CTuShHuaXianDlg*)GetParent();结贴给分了,谢谢楼上的各位!