菜单命令调用对话框按钮功能实现(迷惑中)

kkmqj 2009-06-18 08:55:14
我想在菜单命令中实现对对话框内容的保存
在对话框上已经有保存按钮,功能可以实现。
但菜单命令中的就有点迷惑了
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
void CTest1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString strExt = ".txt"; // 扩展名
CString strFilePath;
CString strFilter;

strFilter.Format("Text Files (*txt)|*txt|All Files (*.*)|*.*||");
CFileDialog dlg(FALSE, NULL, "", NULL, strFilter);
if (dlg.DoModal() == IDOK)
{
strFilePath = dlg.GetPathName();
if (strFilePath.Find(strExt) == -1)//查找扩展名,如果没有输入则自动加
{
strFilePath += strExt;
}
if ( access(strFilePath, 0) == 0 )//需要#include <io.h>
{
CString strQuery;
strQuery.Format("%s 已经存在,要替换掉吗?", strFilePath);
if ( IDNO == ::MessageBox(m_hWnd, strQuery, "文件覆盖询问", MB_ICONQUESTION | MB_YESNO) )
{
return;
}
}
FILE *fp = fopen(strFilePath, "wt+");
if ( fp != NULL )
{
long lRow1 ;
long lRowCount = m_FlexGrid.GetRows();
long lCol1 ;
long lColCount = m_FlexGrid.GetCols();
for (lRow1 = 1; lRow1 < lRowCount; lRow1++)
{
m_FlexGrid.SetRow(lRow1);//设置焦点到当前列

for(lCol1 = 1; lCol1 < lColCount; lCol1++)
{
m_FlexGrid.SetCol(lCol1);//设置焦点到当前行

CString strMail = m_FlexGrid.GetText();
fputs(strMail, fp);
fputs("\r ", fp);
}
fputs("\n",fp);//逐个保存数据
}

// fputs("测试代码。。。", fp);
fclose(fp);
}
else
{
MessageBox("文件错误或者未能找到文件");
}
}
以上为对话框中程序 调试无问题
ON_COMMAND(ID_DATA_SAVE, OnDataSave)
void CMainFrame::OnDataSave()
{
// TODO: Add your command handler code here

CTest1Dlg *dlg;
dlg->OnButton1()


}

以上为菜单相应程序
编译说不能访问protect方法
将onbutton1方法改为public方法编译可通过 运行出错
请问这个应该如何解决
本人也是刚刚开始学的


...全文
110 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ghost90 2009-06-22
  • 打赏
  • 举报
回复
CTest1Dlg *dlg=&CTest1Dlg; //这个不对吧
这句当然不对,这句的意思是dlg指针调用前得赋值!!
kkmqj 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Ghost90 的回复:]
CTest1Dlg *dlg;
dlg->OnButton1()

这样当然不对 dlg的指针没有赋值
CTest1Dlg *dlg=&CTest1Dlg; //这个不对吧
dlg->OnButton1()
[/Quote]
以上用法不对吧
我上边那个现在编译运行无问题
不过好像不能保存修改后数据
只能保存初始数据。
Ghost90 2009-06-18
  • 打赏
  • 举报
回复
CTest1Dlg *dlg;
dlg->OnButton1()

这样当然不对 dlg的指针没有赋值
CTest1Dlg *dlg=&CTest1Dlg;
dlg->OnButton1()
kkmqj 2009-06-18
  • 打赏
  • 举报
回复
神奇
设置友元后,
CTest1Dlg *dlg = new CTest1Dlg;
dlg->Create(IDD_DIALOG1);//添加语句

dlg->OnButton1();
编译通过
运行通过 达到要求
本人还是疑惑 这个事为什么?
难道是因为我用了MSFlexGrid控件
所以在调用的时候需要creat一下?
kkmqj 2009-06-18
  • 打赏
  • 举报
回复
在Test1Dlg.h中
friend void CMainFrame::OnDataSave();
声明
编译可通过
运行时出错
assertion failed

Flie:winocc.cpp
line 345
kkmqj 2009-06-18
  • 打赏
  • 举报
回复
CTest1Dlg *dlg = new CTest1Dlg;

dlg->OnButton1();
这样还是编译出错
提示不可访问protect
海忠 2009-06-18
  • 打赏
  • 举报
回复
这个比较简单,再看看MFC方面的书籍。

========================================
提界面问题,UIPower有问必答!
界面论坛:http://www.uipower.com/bbs
zhouzhipen 2009-06-18
  • 打赏
  • 举报
回复
不是这样的.CTest1Dlg 定义了一个对话框类,按你的要求,是要取得在类实例化时的那个对象变量的指针.
kkmqj 2009-06-18
  • 打赏
  • 举报
回复

CTest1Dlg *dlg = (CTest1Dlg*)GetDlgItem(IDD_DIALOG1);
dlg->OnButton1();

这么用指针对吗?
编译还是出错
kkmqj 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lonelyhacker 的回复:]
C/C++ code
void CMainFrame::OnDataSave()
{
// TODO: Add your command handler code here

CTest1Dlg *dlg; //同楼上这里出错
dlg->OnButton1()


}




其实你可以不必调用这个按钮点击事件的。在你的CTest1Dlg类中定义一个public的函数比如说是Save()。把 OnButton1()的内容放到Save()中,然后在OnButton1()直接调用.

然后在菜单中这样

C/C++ code
void CMainFrame::OnDataSave()
{ …
[/Quote]


编译没有问题
运行时出错
Flie:winocc.cpp
line 345
metaboy 2009-06-18
  • 打赏
  • 举报
回复
同楼上的说法!
fengrx 2009-06-18
  • 打赏
  • 举报
回复
使用正确打开的CTest1Dlg 的指针。
lonelyhacker 2009-06-18
  • 打赏
  • 举报
回复

void CMainFrame::OnDataSave()
{
// TODO: Add your command handler code here

CTest1Dlg *dlg; //同楼上这里出错
dlg->OnButton1()


}


其实你可以不必调用这个按钮点击事件的。在你的CTest1Dlg类中定义一个public的函数比如说是Save()。把 OnButton1()的内容放到Save()中,然后在OnButton1()直接调用.

然后在菜单中这样

void CMainFrame::OnDataSave()
{
// TODO: Add your command handler code here

CTest1Dlg dlg;
dlg.Save()
}




zhouzhipen 2009-06-18
  • 打赏
  • 举报
回复
你可以先取到对话框的指针现调用.
zhouzhipen 2009-06-18
  • 打赏
  • 举报
回复
当然出错了.CTest1Dlg *dlg;定义了一个没有指向实际对象的指针.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧