问题描述:
编写一个标准控件综合应用程序,执行程序的“标准控件应用”菜单命令后打开一个对话框,对话框中有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); //显示文本
}