MFC单文档程序打开对话框根据用户对话框中的选择结果在视图区绘制图形或显示文本,可以实现禁用控件

1 篇文章 0 订阅

问题描述:

编写一个标准控件综合应用程序,执行程序的“标准控件应用”菜单命令后打开一个对话框,对话框中有3个标题分别为“对象”“图形”和“参数”的组框。在“对象”组框中有“图”和“文本”两个单选按钮;在“图形”组框中有“直线”“圆”和“矩形”3个复选框;在“参数”组框中有5个编辑框,分别用于输人绘图的坐标值和要显示的文本串。对话框上还有“确定”和“取消"按钮,当单击“确定”按钮,将根据用户对话框中的选择结果在视图区绘制图形或显示文本。要求在某些条件下,有些控件应该处于禁用状态,而且可以同时绘制3种图形。

实现过程:

建立单文档应用程序。
在ResourceView中找到Menu文件夹,打开IDR_MAINFRAME,开始编辑菜单项。在菜单项编辑“控件”,下拉控件添加“标准控件应用”,打开“属性”按图示编辑:

右击Dialog中“插入Dialog”,按如图加入控件:在这里插入图片描述各个控件ID如下:
控件类型 控件ID 设置的非默认属性 成员变量
组框

IDC_OBJECT	Caption为“对象”	
IDC_IMAGE	Caption为“图形”	
IDC_VARIABLE	Caption为“参数”	

单选框

IDC_PICTURE	Caption为“图”	int  m_npicture
IDC_TEXT	Caption为“文本”	

复选框

IDC_LINE	Caption为“直线”	BOOL  m_nline
IDC_CIRCLE	Caption为“圆”	BOOL  m_ncircle
IDC_RECTANG	Caption为“矩形”	BOOL  m_nrectang

静态文本

IDC_STATIC	Caption为“点坐标”	
IDC_STATIC	Caption为“圆的半径”	
IDC_STATIC	Caption为“矩形长”	
IDC_STATIC	Caption为“矩形宽”	
IDC_STATIC	Caption为“文本”	

编辑框

IDC_POINT	对应“点坐标”	int  m_npoint
IDC_REDIO	对应“圆的半径”	int  m_nredio
IDC_LENGTH	对应“矩形长”	int  m_nlength
IDC_WEIDTH	对应“矩形宽”	int  m_nweidth
IDC_TEXTT	对应“文本”	CString  m_ntext

点击对话框,打开ClassWizard新建一个自定义类“CDialogClass”,将上述编辑框的ID值建立成员变量,做为自定义类的成员变量。
在自定义类“CDialogClass”中添加成员函数(函数OnPicture(),函数OnText(),函数OnLine(),函数OnPicture()和函数OnRectang())和成员变量:
在这里插入图片描述

在C__View类中添加菜单中“标准控件应用”的函数,与其ID值相对应,本程序定义的对应函数为OnMenucom(),并添加变量UINT_length,UINT_weidth,UINT_redio,UINT_point,CS_text。
在函数中编写如下代码:
在菜单命令函数中添加如下代码:
void CMy7_38exView::OnMenucom()
{

// TODO: Add your command handler code here
CDialogClass dlg;          //自定义类CDialogClass生成对象dlg
UINT_length=0;             //初始化参数(默认,可做可不做)
UINT_weidth=0;
UINT_redio=0;
UINT_point=0;
if(dlg.DoModal()==IDOK)
{
	UINT_length=dlg.m_nlength;     //将自定义类“CDialogClass”中的参数与 
	UINT_weidth=dlg.m_nweidth;     //C__View中对应起来 
	UINT_redio=dlg.m_nredio;
	UINT_point=dlg.m_npoint;
	CS_text=dlg.m_ntext;
	Invalidate();                  //刷新视图
}

}
在自定义类“CDialogClass”的成员函数添加以下代码(主要实现禁用):
①在OnPicture()中添加如下:
void CDialogClass::OnPicture()
{

// TODO: Add your control notification handler code here
CWnd *pWndButn;
pWndButn=GetDlgItem(IDC_LINE);
pWndButn->EnableWindow();          //可以使用复选框,下同
pWndButn=GetDlgItem(IDC_CIRCLE);
pWndButn->EnableWindow();
pWndButn=GetDlgItem(IDC_RECTANG);
pWndButn->EnableWindow();
if(m_nline)                     //如果m_nline为真,可以使用点坐标编辑框否则,禁止使用编辑框,以下函数相同
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow(FALSE);
}	
if(m_ncircle)                  //如果m_ncircle为真,可以使用圆半径编辑框否则,禁止使用编辑框
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow(FALSE);
}	
if(m_nrectang)                //如果m_nrectang为真,可以使用矩形长宽编辑框否则,禁止使用编辑框
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow();
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow(FALSE);
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow(FALSE);
}
pWndButn=GetDlgItem(IDC_TEXTT);        //禁用文本框
pWndButn->EnableWindow(FALSE);

}
②在OnText()函数中加入如下代码:
void CDialogClass::OnText() //点击“文本”单选按钮实现禁用
{

// TODO: Add your control notification handler code here
CWnd *pWndButn;
pWndButn=GetDlgItem(IDC_LINE);        
pWndButn->EnableWindow(FALSE);        //禁用多选框或编辑框
pWndButn=GetDlgItem(IDC_CIRCLE);
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_RECTANG);
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_POINT);
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_LENGTH);
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_REDIO);
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_WEIDTH);
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_TEXTT);
pWndButn->EnableWindow();               //可以使用文本编辑框

}
③在Online()函数中添加如下代码(选中画线的复选框,实现之后的某些编辑框禁用):
void CDialogClass::OnLine()
{

// TODO: Add your control notification handler code here
if(m_nline)
	m_nline=FALSE;
else
	m_nline=TRUE;
if(m_nline)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow(FALSE);
}		
if(m_ncircle)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow(FALSE);
}	
if(m_nrectang)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow();
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow(FALSE);
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow(FALSE);
}

}
④在OnCircle()函数中添加如下代码(点选中“圆”的复选框时,开放“圆的半径”复选框,其余禁用):
void CDialogClass::OnCircle()
{

// TODO: Add your control notification handler code here
if(m_ncircle)
	m_ncircle=FALSE;
else
	m_ncircle=TRUE;
if(m_nline)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow(FALSE);
}	
if(m_ncircle)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow(FALSE);
}	
if(m_nrectang)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow();
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow(FALSE);
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow(FALSE);
}

}
⑤在OnRectang()中添加如下代码(点选中“矩形”的复选框时,开放“矩形的长”和“矩形的宽”复选框,其余禁用):
void CDialogClass::OnRectang()
{

// TODO: Add your control notification handler code here
if(m_nrectang)
	m_nrectang=FALSE;
else
	m_nrectang=TRUE;
if(m_nline)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_POINT);
	pWndButn->EnableWindow(FALSE);
}	
if(m_ncircle)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_REDIO);
	pWndButn->EnableWindow(FALSE);
}	
if(m_nrectang)
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow();
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow();
}else
{
	CWnd *pWndButn;
	pWndButn=GetDlgItem(IDC_LENGTH);
	pWndButn->EnableWindow(FALSE);
	pWndButn=GetDlgItem(IDC_WEIDTH);
	pWndButn->EnableWindow(FALSE);
}

}
在OnDraw()函数中添加如下代码:
void CMy7_38exView::OnDraw(CDC* pDC)
{
CMy7_38exDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

// TODO: add draw code for native data here
pDC->LineTo(UINT_point,UINT_point);                 //显示直线
pDC->Rectangle(UINT_length,UINT_weidth,UINT_length*2,UINT_weidth*2); //显示矩形
pDC->Ellipse(0,0,UINT_redio*2,UINT_redio*2);        //显示内切圆
pDC->TextOut(300,300,CS_text);                      //显示文本

}

好的,这是一个比较常见的需求,下面是一个简实现: 首先,在MFC创建一个对话框应用程序,然后在对话框添加一个列表框控件(ID为IDC_LIST1),以及两个按钮(ID分别为IDC_BUTTON_ADD和IDC_BUTTON_READ)。 接下来,在资源视图添加一个文本文件(假设文件名为data.txt),将其属性设置为只读。 然后,打开对话框类的头文件(比如MyDlg.h),添加以下成员变量和成员函数: ```cpp // 成员变量 CString m_strFilePath; // 文件路径 // 成员函数 afx_msg void OnBnClickedButtonAdd(); // 添加按钮的响应函数 afx_msg void OnBnClickedButtonRead(); // 读取按钮的响应函数 ``` 在对话框类的源文件(比如MyDlg.cpp)实现这两个函数: ```cpp void CMyDlg::OnBnClickedButtonAdd() { // 打开文件对话框,获取文件路径 CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_READONLY, _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||"), this); if (dlg.DoModal() == IDOK) { m_strFilePath = dlg.GetPathName(); // 保存文件路径 // 打开文件,读取数据并添加到列表框 CStdioFile file; if (file.Open(m_strFilePath, CFile::modeRead)) { CString strLine; while (file.ReadString(strLine)) { m_listBox.AddString(strLine); } file.Close(); } } } void CMyDlg::OnBnClickedButtonRead() { // 清空列表框 m_listBox.ResetContent(); // 打开文件,读取数据并添加到列表框 CStdioFile file; if (file.Open(m_strFilePath, CFile::modeRead)) { CString strLine; while (file.ReadString(strLine)) { m_listBox.AddString(strLine); } file.Close(); } } ``` 在这里,我们使用CFileDialog类打开文件对话框,让用户选择要添加或读取的数据文件。然后,我们使用CStdioFile类打开文件,并逐行读取数据,将其添加到列表框。注意,我们在添加之前要先清空列表框,以免重复添加数据。 最后,在对话框类的OnInitDialog()函数,添加以下代码: ```cpp // 初始化文件路径为空 m_strFilePath.Empty(); // 将两个按钮的响应函数与相应的控件关联 GetDlgItem(IDC_BUTTON_ADD)->SetWindowText(_T("Add")); GetDlgItem(IDC_BUTTON_ADD)->SetWindowText(_T("Read")); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_READ)->EnableWindow(TRUE); ``` 这里,我们将文件路径初始化为空,并将两个按钮的响应函数与相应的控件关联。注意,这里我们默认情况下将“读取”按钮禁用,只有在用户点击“添加”按钮并成功添加了数据文件后,才启用“读取”按钮。 这样,我们就完成了一个简的基于对话框的添加和读取文本文件数据的程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值