小弟刚学VC 用MFC做了个基于对话框的程序,主对话框里有一个菜单和两个子对话框,我把菜单的响应函数放在主对话框的类里能响应,放在子对框里的类里就是响应不了,不知是怎么回事,望各位大侠指教
解决方案 »
- vc进度条问题
- error C2039: 'Append' : is not a member of 'CString'
- 求救!!!!!!!!!!!!!!!!!!!
- 关于窗口启动隐藏
- 视频监控的几个问题!
- 在单线程中怎样返还系统控制权,在线等
- 为什么GetMenuInfo()和MENUINFO无法使用?
- 关于Dll导入出错的问题…………各路英雄请留步!!!!!!!!!!!!!!(二百分)
- 怎么让我的VC IDE具有Unicode选项??
- 为什么一删除记录就出错?(用CRecordset对象)
- 请大家帮帮忙,这段程序出错时要如何解决
- 我要在VC界面内增加一段程序实现新建一个文件夹叫T3,请问怎么实现?最好用mkdir函数。
要不子窗口 响应函数 写的有问题
可以贴代码看看?
// 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
}
子对话框是非模态的应该可以。
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("子窗口"));
}
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;
}
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);