怎么样用C语言程序来设计奥运五环图案
1. 创建一个基于单文档的工程ex19
(01)打开菜单“File→New”,在弹出的新建(New)对话框左边的工程(Projec t)选项卡
中选择“MFCAppWiz ard(exe)”,在右边的工程名(Projec t Name)处输入“ex19”,单
击确认(OK)按钮。
(02)在弹出的MFC 应用程序向导(MFC AppWiz ard)对话框中选择单文档(Single
Docume nt)类型。单击结束(Finish)按钮。
(03)在弹出对话框中显示所有配置信息。单击确定(OK)按钮创建新的工
程。
2. 设计ex19 工程的菜单及快捷键
首先添加新的菜单选项。
(04)将 Worksp ace 窗口切换至资源查看(Resour ceVie w)选项卡,展开菜单(Menu)选项,然后双击ID 为 IDR_MA INFRA ME 的项目,右边窗格中将显示该菜单资源。
(05)在窗格中右击菜单中的虚线框,然后在弹出菜单中选择属性(Proper ties)选项,如图5.4 所示。
(06)在弹出的菜单属性(Menu Item Proper ties)对话框的一般(Genera l)选项卡右边的说
明文字(Captio n)栏,输入说明文字“绘图(&P)”,然后关闭属性对话框完成修改。
操作说明
在文字说明栏中在一个字母前加&符号,表示给该字母加下划线。这里的“绘图(&P)”
最后在菜单中的显示结果为“绘图(P)”。在程序运行时,可以
先按住键盘的Alt 键不放,再
按下相应的字母键选中该菜单选项。
(07)在刚添加的“绘图”弹出菜单下面会出现一个新的虚线框,双击该虚线框弹出菜单属
性对话框,在对话框一般(Genera l)选项卡的左边ID 栏设定菜单选项的ID 为
ID_MEN UITEM_PAIN T,在右边的说明文字(Captio n)栏输入“绘制奥运五环(&P)”。
输入完毕后关闭属性对话框。
操作说明
弹出菜单属性对话框有两种方法:一种是在虚线框上单击鼠标右键,然后在弹出菜单中
选择属性选项,如步骤(05);另一种方式是直接双击虚线框,如步骤(07)。
(08)按照步骤(07)在“绘图”弹出菜单中再
添加一个新的菜单选项,ID 为
ID_MEN UITEM_CLEA R,说明文字为“清
除图案(&C)”。修改完后的“绘图”弹出
为了加速操作过程,对一些常用的功能需要定义快捷键,通过相应的快捷键可以快速调
用菜单的相关功能。下面开始定义快捷键:
(09)在资源查看(Resour ceVie w)选项卡里展开快捷键(Accele rator)选项,然后双击
IDR_MA INFRA ME 项目,在右边的窗格中显示该菜单的快捷键,如图5.6 所示。
(10)双击最后一行的虚线框,在弹出的快捷键属性对话框中的ID 栏,选择需要添加快捷
键的菜单的ID,如选择 ID_MEN UITEM_PAIN T,在键值(Key)栏选择键值为P,在
自动弹窗代码右边的修饰键(Modifi ers)栏确认选中Alt 和Ctrl 复选框,然后在类型(Type)栏选
择快捷键属性为 Virtke y。关闭该对话框。本步相当于设定“绘制奥运
五环”菜单选项的快捷键为Ctrl+Atl+P。
(11)按照步骤(10)设置 ID_MEN UITEM_CLEA R 对应的菜单选项快捷键的键值为C,修
饰键为Alt 和Ctrl,类型为 VirtKe y。在程序运行时,可以通过添加的快捷键直接访问
这两个菜单选项。
3. 向文档类 CEx19D oc 添加成员函数与成员变量
先通过类向导(ClassW izard)对话框,添加消息相应函数。与对话框控件一样,文档视
图的菜单的作用原理也是消息响应机制。消息相应机制的原理参见第 4 章的“热身训练”。(12)打开菜单“Vie w→ClassW izard”,弹出类向导(ClassW izard)对话框。向 CEx19D oc
类添加两个菜单选项的消息响应函数。具体操作参见第4 章的“热身
训练”,最后关闭类向导(ClassW izard)对话框。
请注意
在添加菜单选项的消息响应函数时,请确认添加到视图类 CEx19D oc 中。在类向导对话
框右上角的类名(ClassName)栏中需要选中视图类 CEx19D oc。
(13)按照第4 章实例13 中介绍的方法给文档类CEx19D oc 添加BOOL 型成员变量
m_Oper ateTy pe,以确定操作类型。
(14)将 Worksp ace 窗口切换至类查看(ClassV iew)选项卡,展开文档类CEx19D oc 的成员列表。在列表中双击显示构造函数 CEx19D oc,在其中添加成员变量初始化语句。代
码如下:
CEx19D oc::CEx19D oc()
{
// TODO: add one-time constr uctio n code here
m_Oper ateTy pe=FALSE;
}
请注意
粗体字部分是需要读者输入的代码或者需要修改的代码,而非粗体字部分是VC++ 6.0
自动生成的代码,以便于读者准确定位。
(15)在类查看(ClassV iew)选项卡中,双击“绘制奥运五环”菜单选项的消息响应函数Object IDs Messag es 消息(Messag es)的描述函数名
ID_MEN UITEM_PAIN T COMMAN D 选择该菜单OnMenu itemP aint
ID_MEN UITEM_CLEA R COMMAN D 选择该菜单OnMenu itemC lear
nMenuI temPa int,在右边的窗格中修改该函数,实现绘图功能。代码如下:
void CEx19D oc::OnMenu itemP aint()
{
// TODO: Add your comman d handle r code here
//通知视图绘制图案
m_Oper ateTy pe=TRUE;
Update AllVi ews(NULL);
}
代码解析
文档类 CDocum ent 的成员函数Update AllVi ews 通知视图更新显示。一般情况下把数据处
理都放入文档类中,而把结果显示放入视图类中。文档类通过Update AllVi ews 通知视图更新显示。视图类通过GetDoc ument函数获取当前运行的文档类对象指针,然后通过该指针访问文档类的数据处理结果,并根据这些结果进行显示。本例中文档类的数据操作就是修改
m_Oper ateTy pe 的值。
(16)修改“清除图案”菜单选项的消息相应函数OnMenu itemC lear,通知视图清除图案。
代码如下:
void CEx19D oc::OnMenu itemC lear()
{
// TODO: Add your comman d handle r code here
//通知视图清楚图案
m_Oper ateTy pe=FALSE;
Update AllVi ews(NULL);
}
4. 在视图类 CEx19V iew 的 OnDraw函数中实现绘图操作
在需要刷新视图时,应用程序都会调用视图类的OnDraw函数,一般情况下应该把所有
的绘图操作放在这个函数中。
OnDraw函数由应用程序向导自动生成,在修改前代码如下:
void CEx19V iew::OnDraw(CDC* pDC)
{
CEx19D oc* pDoc = GetDoc ument();
ASSERT_VALI D(pDoc);
/
/ TODO: add draw code for native data here
}
通过 GetDoc ument函数可以获取当前文档类对象的指针,而下面的 ASSERT_VALI D 宏
则是测试获取指针的有效性。前面已经反复强调过应尽量把数据操作放在文档类中,而把显示操作放在视图类中,两类之间通过 Update AllVi ews 函数和 GetDoc umet函数传递信息。(17)在类查看(ClassV iew)选项卡中展开视图类 CEx19V iew 的成员列表。在列表中双击显示绘图函数 OnDraw。
(18)先在 OnDraw函数中定义画笔,并获取当前窗口的有效范围。代码如下:
// TODO: add draw code for native data here
CRectrect;
CBrush WhiteB rush;
CBrush RedBru sh;
CBrush G
reenBr ush;
CBrush BlueBr ush;
CBrush BlackB rush;
CBrush Yellow Brush;
WhiteB rush.Create Solid Brush(RGB(255,255,255));
RedBru sh.Create Solid Brush(RGB(255,0,0));
GreenB rush.Create Solid Brush(RGB(0,255,0));
BlueBr ush.Create Solid Brush(RGB(0,0,255));
BlackB rush.Create Solid Brush(RGB(0,0,0));
Yellow Brush.Create Solid Brush(RGB(255,255,0));
GetCli entRe ct(&rect);
(19)然后实现根据 CEx19D oc 对 m_Oper ateTy pe 的操作结果进行显示的功能。代码如下:if(pDoc->m_Oper ateTy pe)
{
pDC->Select Objec t(BlueBr ush);//绘制蓝环
pDC->Ellips e(50,50,100,100);
pDC->Select Objec t(WhiteB rush);
pDC->Ellips e(54,54,96,96);
pDC->Select Objec t(Yellow Brush);//绘制黄环
pDC->Ellips e(76,75,126,125);
pDC->Select Objec t(WhiteB rush);
pDC->Ellips e(80,79,122,121);
pDC->Select Objec t(BlackB rush);//绘制黑环
pDC->Ellips e(104,50,154,100);
pDC->Select Objec t(WhiteB rush);
pDC->Ellips e(108,54,150,96);
pDC->Select Objec t(GreenB rush);//绘制绿环
pDC->Ellips e(130,75,180,125);
pDC->Select Objec t(WhiteB rush);
pDC->Ellips e(134,79,176,121);
pDC->Select Objec t(RedBru sh);//绘制红环
pDC->Ellips e(158,50,208,100);
pDC->Select Objec t(WhiteB rush);
pDC->Ellips e(162,54,204,96);
pDC->TextOu t(130,190,"支持奥运事业!");//在指定坐标输出文字
}
else
{
pDC->Select Objec t(WhiteB rush);//将整个视图涂成白,清除图案
pDC->FillRe ct(&rect,&WhiteB rush);
}
代码解析
CDC 的成员函数无法直接实现环形绘制。在本例中先绘制一个大的圆形,然后将圆形内部涂成背景白,以实现环的效果。
(20)在 OnDraw函数的最后,销毁画刷,以释放系统资源。
WhiteB rush.Delete Objec t();
RedBru sh.Delete Objec t();
GreenB rush.Delete Objec t();
BlueBr ush.Delete Objec t();
BlackB rush.Delete Objec t();
Yellow Brush.Delete Objec t();
5. 编译运行程序
(21)编译运行程序,用鼠标选择相应的菜单选项实现绘图操作。
(22)用Alt 键选择,Alt+P 弹出“绘制”菜单,然后用Alt+P/C 分别选择“绘制奥运五环”和“清除图案”选项。
(23)用快捷键选择,Ctrl+Alt+P/C 分别选择“绘制奥运五环”和“清除图案”选项。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论