小弟刚学VC 用MFC做了个基于对话框的程序,主对话框里有一个菜单和两个子对话框,我把菜单的响应函数放在主对话框的类里能响应,放在子对框里的类里就是响应不了,不知是怎么回事,望各位大侠指教

解决方案 »

  1.   

    TrackPopupMenu 的时候 hWnd 指向子窗口了没?
      

  2.   

    嗯,要不就是没有指向子窗口 @zgl7903
    要不子窗口 响应函数 写的有问题
    可以贴代码看看?
      

  3.   

    主对话框初始化这样:
    // TODO: Add extra initialization here
    //
    if(!m_wndMenu.LoadMenu(IDR_MENU1))
    {
    AfxMessageBox("Failed to create menu bar\n");
    return -1;      // fail to create
    }
    SetMenu(&m_wndMenu); CRect rc;
    GetClientRect(&rc);
    m_pDlg1=new CChildDlg1;
    m_pDlg1->Create(IDD_DIALOG1,this);
    m_pDlg1->ShowWindow(SW_SHOW);
    //
    CRect rc1;
    rc1.left=0;
    rc1.right=rc.Width()/2;
    rc1.top=0;
    rc1.bottom=rc.bottom;
    m_pDlg1->MoveWindow(&rc1);
    //
    m_pDlg2=new CChildDlg2;
    m_pDlg2->Create(IDD_DIALOG2,this);
    m_pDlg2->ShowWindow(SW_SHOW);
    rc1.left=rc.Width()/2;
    rc1.right=rc.right;
    rc1.top=0;
    rc1.bottom=rc.bottom;
    m_pDlg2->MoveWindow(&rc1);

    return TRUE;  // return TRUE  unless you set the focus to a control
    }
    子对话框是非模态的应该可以。
      

  4.   

    主对话框接收到菜单响应事件WM_COMMAND后转发到子对话框中
      

  5.   

    主对话框初始化
    BOOL CyanDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 ShowWindow(SW_MAXIMIZE); // TODO: 在此添加额外的初始化代码
    CMenu m_wndMenu;
    if(!m_wndMenu.LoadMenu(IDR_MENU1))
    {
    AfxMessageBox(_T("Failed to create menu bar\n"));
    return -1; // fail to create
    }
    SetMenu(&m_wndMenu);
    dialog1 *chil;
    int num=0;
    while(num<3)//三个子对话框
    {
    chil=new dialog1();
    chil->Create(dialog1::IDD,this);
    chil->MoveWindow(num*200,0,200,200);
    chil->ShowWindow(true);
    num++;
    }
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    //父对话框能响应
    void CyanDlg::OnAaaa()
    {
    // TODO: 在此添加命令处理程序代码
    AfxMessageBox(_T("父窗口"));
    }
    //子对话框不响应
    void dialog1::OnBbb()
    {
    // TODO: 在此添加命令处理程序代码
    AfxMessageBox(_T("子窗口"));
    }
      

  6.   


    7楼说的很正确,刚刚遇到一个和你相似的问题,楼主你这样写应该可以!C/C++ code
    //两个对话框类
    ///////////////////
    //CDlg.h中
    #include "SubDlg.h"
    class CDlg : public CDialog
    {
    public:
        CSubDlg *m_pSubDlg;  //创建子对话框指针
    }//CDlg.cpp中
    void CDlg::OnButton1() 
    {//按钮中以非模态形式启动子对话框
        m_pSUbDlg = new CSUbDlg;
        m_pSUbDlg->Create(IDD_SUB_DIALOG, this);
        m_pSUbDlg->ShowWindow(SW_SHOW);
    }void CDlg::OnButton2() 
    {//第二个按钮中发送新类的自定义消息就可以了!
        ::PostMessage(m_pSUbDlg->m_hWnd,MSG_MENU,NULL,NULL);
    }///////////////////在第二个对话框中自定义一个消息就行了//第一步添加自定义消息
    //CSubDlg.h中#define MSG_MSG_MENU WM_USER+101 //自定义消息    
    afx_msg LRESULT OnMsgMenu(WPARAM, LPARAM);//////////////////////CSubDlg.cpp中BEGIN_MESSAGE_MAP(CSubDlg, CDialog)
        //{{AFX_MSG_MAP(CSubDlg)
        ON_MESSAGE(MSG_MENU, OnMsgMENU) //此处添加这句
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    //第二步响应消息
    LRESULT CSubDlg::OnMsgMenu(WPARAM w,LPARAM l)
    {
        OnSubMenu1(); //在此处楼主可以调用你的子对话框菜单响应消息了!
        return TRUE;
    }
      

  7.   

    2个解决方法:
    1. 主对话框和子对话框响应相同的信息。在主对话框中把消息传给子对话框
    m_pChild->SendMessage(WM_COMMAND,ID_XXXX,0);
    这种方法消息多时麻烦。
    2.在主对话框的PreTranslateMessage中:
    if(pMsg->message == WM_COMMAND)
        m_pChild->SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
      

  8.   

    记录每个子窗口的hwnd,就能向每个子窗口发送了。