hur.cn - 华软网

 热门搜索

MFC中的菜单项怎么与另一个对话框(窗口)连接

  作者:未知    来源:网络    更新时间:2011/4/13
自己是新手,才学VC++ 6.0半个月,遇到一些问题,可能表达不是很清楚
要实现的功能是在一个窗口中单击一个菜单项,就会弹出一个对话框
先在此谢谢列位大大的帮助!~~
可能这是简单的问题,但希望了解的大大能不吝见教,越详细越好了!!!~~~~
---华软 网友回答---
菜单项的命令响应中
CYourDlg dlg;
dlg.DoModal()
---华软网友回复---
这样实现:在你的窗口类中增加一个成员变量:CMyDlg m_dlg;(CMyDlg为你要打开的对话框类),然后再菜单响应函数里面加上:m_dlg.DoModal();
---华软网友回复---
先创建一个Menu,然后在对话框属性中联系关系这个Menu,再用ClassWizard响应Menu控件的COMMAND消息,在消息响应函数里面调用弹出对话框的DoModal()
---华软网友回复---
有两种方式一种是模态的 一种是非模态的 分别用DoModal 和 (Create和showWindow) 你随便找本vc的书看看就Ok了 
---华软网友回复---
①做好你的对话框,然后增加类,以CDialog类为基类生成你的对话框类CXXDLG
②在菜单项上右键增加单击事件,在响应函数中写下
  CXXDLG dlg;
  dlg.doModal();
注:#include"XXDLG.h"头资料
---华软网友回复---
我试了,运行没有毛病,为什么点击菜单项没反应,没有出现响应的对话框

---华软网友回复---
引用 6 楼 piaoivy 的回复:
我试了,运行没有毛病,为什么点击菜单项没反应,没有出现响应的对话框
代码
---华软网友回复---
在点击菜单按钮响应事件那设个断点,调试一下就知道原因了。要不就上代码。咱们帮你看看
---华软网友回复---
我建议你把孙鑫的视频好好看看。
你点击没反应,看看菜单消息有没对应你的菜单函数

---华软网友回复---
先创建个dialog类

C++">
mydlg.h

#pragma once
#include "resource.h"

class CMyDlg :
    public CDialog
{
public:
    CMyDlg(CWnd* pParent = NULL);
    enum{ IDD = IDD_DIALOG1};

    DECLARE_DYNCREATE(CMyDlg)

protected:
    DECLARE_MESSAGE_MAP()
    virtual void DoDataExchange(CDataExchange* pDX);
    virtual BOOL OnInitDialog();
};

mydlg.cpp

#include "StdAfx.h"
#include "MyDlg.h"

IMPLEMENT_DYNCREATE ( CMyDlg, CDialog )

CMyDlg::CMyDlg(CWnd* pParent /* = NULL */)
:CDialog(CMyDlg::IDD)
{

}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)    

END_MESSAGE_MAP()

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BOOL CMyDlg::OnInitDialog()
{
    return CDialog::OnInitDialog();
}



然后在你的事件中增加

C++">
CMyDlg mydlg;
if (mydlg.DoModal())
{
    //Do something
}

---华软网友回复---
最简单的就是直接在菜单函数里增加:MessageBox("");
或你先创建一个Dialog,然后双击这个对话框创建新类,将头资料增加到菜单函数前,然后用新类创建一个对象dlg,调用DoModal函数
---华软网友回复---
把你的对话框的属性中的Visiable勾上  stytle 为popup  
---华软网友回复---

void CMYDLG::OnMenuitem32771() 
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
m_dlg.DoModal();
}
CMYDLG是我新建的类,而且我头资料也加了#include"MYDLG.h"
我是鉴于单文档里的,点击菜单按钮出现一个对话框。
是否是我增加的消息函数位置不对啊。
谢谢------


引用 7 楼 leotody 的回复:
引用 6 楼 piaoivy 的回复:

我试了,运行没有毛病,为什么点击菜单项没反应,没有出现响应的对话框
代码

---华软网友回复---
引用 13 楼 piaoivy 的回复:
void CMYDLG::OnMenuitem32771() 
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
m_dlg.DoModal();
}
CMYDLG是我新建的类,而且我头资料也加了#include"MYDLG.h"
我是鉴于单文档里的,点击菜单按钮出现一个对话框。
是否是我增加的消息函数位置不对啊……

吧你的BEGIN_MESSAGE_MAP 贴出来
---华软网友回复---
楼主能够看看孙鑫的视频学习  一个星期能够看完  你会明白很多。
---华软网友回复---

这是MYDLG.cpp里面的代码
// MYDLG.cpp : implementation file
//

#include "stdafx.h"
#include "1111111.h"
#include "MYDLG.h"
#include "MYDLG.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMYDLG dialog


CMYDLG::CMYDLG(CWnd* pParent /*=NULL*/)
: CDialog(CMYDLG::IDD, pParent)
{
//{{AFX_DATA_INIT(CMYDLG)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CMYDLG::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMYDLG)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMYDLG, CDialog)
//{{AFX_MSG_MAP(CMYDLG)
ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMYDLG message handlers

void CMYDLG::OnMenuitem32771() 
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
if(m_dlg.DoModal())
{
}
}


这是MYDLG.h里面的代码
#if !defined(AFX_MYDLG_H__16D634D6_E2BF_4176_AC93_EE5CB727D48F__INCLUDED_)
#define AFX_MYDLG_H__16D634D6_E2BF_4176_AC93_EE5CB727D48F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MYDLG.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CMYDLG dialog

class CMYDLG : public CDialog
{
// Construction
public:
CMYDLG(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
//{{AFX_DATA(CMYDLG)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMYDLG)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CMYDLG)
afx_msg void OnMenuitem32771();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYDLG_H__16D634D6_E2BF_4176_AC93_EE5CB727D48F__INCLUDED_)


我感觉我加的消息函数位置不对,我加在CMYDLG类中了,(CMYDLG是我后来自己创建的新类),我是鉴于单文档创建的,不是鉴于对话框创建的

引用 14 楼 tt2com 的回复:
引用 13 楼 piaoivy 的回复:
void CMYDLG::OnMenuitem32771()
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
m_dlg.DoModal();
}
CMYDLG是我新建的类,而且我头资料也加了#include"MYDLG.h"
我是鉴于单文档里的,点击菜单按钮出现一个对……

---华软网友回复---
引用 14 楼 tt2com 的回复:
引用 13 楼 piaoivy 的回复:
void CMYDLG::OnMenuitem32771()
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
m_dlg.DoModal();
}
CMYDLG是我新建的类,而且我头资料也加了#include"MYDLG.h"
我是鉴于单文档里的,点击菜单按钮出现一个对……


预计是的   在用Class Wizard增加消息的时候,在中间偏右一点的位置,注意类的选择,比如CAboutDlg,CView,CFrame等
---华软网友回复---
在CView类中能够运行出来,多亏高手提点 

引用 17 楼 kejian1986 的回复:
引用 14 楼 tt2com 的回复:
引用 13 楼 piaoivy 的回复:
void CMYDLG::OnMenuitem32771()
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
m_dlg.DoModal();
}
CMYDLG是我新建的类,而且我头资料也加了#include"MYDLG.h"
……

---华软网友回复---
在其余几个类中都能运行出来,这说明了什么



引用 17 楼 kejian1986 的回复:
引用 14 楼 tt2com 的回复:
引用 13 楼 piaoivy 的回复:
void CMYDLG::OnMenuitem32771()
{
// TODO: Add your command handler code here
CMYDLG m_dlg;
m_dlg.DoModal();
}
CMYDLG是我新建的类,而且我头资料也加了#include"MYDLG.h"
……

---华软网友回复---
www.enet.com.cn/eschool/zhuanti/vc++/  看看这个视频教学吧 我也是初学者 很有用的 看了你就明白很多了。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。