2024年5月20日发(作者:)
怎么样用C语言程序来设计奥运五环图案
1. 创建一个基于单文档的工程 ex19
(01)打开菜单“File→New”,在弹出的新建(New)对话框左边的工程(Project)选项卡
中选择“MFCAppWizard(exe)”,在右边的工程名(Project Name)处输入“ex19”,单
击确认(OK)按钮。
(02)在弹出的 MFC 应用程序向导(MFC AppWizard)对话框中选择单文档(Single
Document)类型。单击结束(Finish)按钮。
(03)在弹出对话框中显示所有配置信息。单击确定(OK)按钮创建新的工
程。
2. 设计 ex19 工程的菜单及快捷键
首先添加新的菜单选项。
(04)将 Workspace 窗口切换至资源查看(ResourceView)选项卡,展开菜单(Menu)选项,
然后双击 ID 为 IDR_MAINFRAME 的项目,右边窗格中将显示该菜单资源。
(05)在窗格中右击菜单中的虚线框,然后在弹出菜单中选择属性(Properties)选项,如图
5.4 所示。
(06)在弹出的菜单属性(Menu Item Properties)对话框的一般(General)选项卡右边的说
明文字(Caption)栏,输入说明文字“绘图(&P)”,然后关闭属性对话框完成修改。
操作说明
在文字说明栏中在一个字母前加&符号,表示给该字母加下划线。这里的“绘图(&P)”
最后在菜单中的显示结果为“绘图(P)”。在程序运行时,可以
先按住键盘的 Alt 键不放,再
按下相应的字母键选中该菜单选项。
(07)在刚添加的“绘图”弹出菜单下面会出现一个新的虚线框,双击该虚线框弹出菜单属
性对话框,在对话框一般(General)选项卡的左边 ID 栏设定菜单选项的 ID 为
ID_MENUITEM_PAINT,在右边的说明文字(Caption)栏输入 “绘制奥运五环(&P)”。
输入完毕后关闭属性对话框。
操作说明
弹出菜单属性对话框有两种方法:一种是在虚线框上单击鼠标右键,然后在弹出菜单中
选择属性选项,如步骤(05);另一种方式是直接双击虚线框,如步骤(07)。
(08)按照步骤(07)在“绘图”弹出菜单中再
添 加 一 个 新 的 菜 单 选 项 , ID 为
ID_MENUITEM_CLEAR,说明文字为“清
除图案(&C)”。修改完后的“绘图”弹出
为了加速操作过程,对一些常用的功能需要定义快捷键,通过相应的快捷键可以快速调
用菜单的相关功能。下面开始定义快捷键:
(09)在资源查看(ResourceView)选项卡里展开快捷键(Accelerator)选项,然后双击
IDR_MAINFRAME 项目,在右边的窗格中显示该菜单的快捷键,如图 5.6 所示。
(10)双击最后一行的虚线框,在弹出的快捷键属性对话框中的 ID 栏,选择需要添加快捷
键的菜单的 ID,如选择 ID_MENUITEM_PAINT,在键值(Key)栏选择键值为 P,在
右边的修饰键(Modifiers)栏确认选中 Alt 和 Ctrl 复选框,然后在类型(Type)栏选
择快捷键属性为 Virtkey。关闭该对话框。本步相当于设定“绘制奥运
五环”菜单选项的快捷键为 Ctrl+Atl+P。
(11)按照步骤(10)设置 ID_MENUITEM_CLEAR 对应的菜单选项快捷键的键值为 C,修
饰键为 Alt 和 Ctrl,类型为 VirtKey。在程序运行时,可以通过添加的快捷键直接访问
这两个菜单选项。
3. 向文档类 CEx19Doc 添加成员函数与成员变量
先通过类向导(ClassWizard)对话框,添加消息相应函数。与对话框控件一样,文档视
图的菜单的作用原理也是消息响应机制。消息相应机制的原理参见第 4 章的“热身训练”。
(12)打开菜单“View→ClassWizard”,弹出类向导(ClassWizard)对话框。向 CEx19Doc
类添加两个菜单选项的消息响应函数。具体操作参见第 4 章的“热身
训练”,最后关闭类向导(ClassWizard)对话框。
请注意
在添加菜单选项的消息响应函数时,请确认添加到视图类 CEx19Doc 中。在类向导对话
框右上角的类名(Class Name)栏中需要选中视图类 CEx19Doc。
(13)按照第 4 章实例 13 中介绍的方法给文档类 CEx19Doc 添加 BOOL 型成员变量
m_OperateType,以确定操作类型。
(14)将 Workspace 窗口切换至类查看(ClassView)选项卡,展开文档类 CEx19Doc 的成员
列表。在列表中双击显示构造函数 CEx19Doc,在其中添加成员变量初始化语句。代
码如下:
CEx19Doc::CEx19Doc()
{
// TODO: add one-time construction code here
m_OperateType=FALSE;
}
请注意
粗体字部分是需要读者输入的代码或者需要修改的代码,而非粗体字部分是 VC++ 6.0
自动生成的代码,以便于读者准确定位。
(15)在类查看(ClassView)选项卡中,双击“绘制奥运五环”菜单选项的消息响应函数
Object IDs Messages 消息(Messages)的描述 函数名
ID_MENUITEM_PAINT COMMAND 选择该菜单 OnMenuitemPaint
ID_MENUITEM_CLEAR COMMAND 选择该菜单 OnMenuitemClear
nMenuItemPaint,在右边的窗格中修改该函数,实现绘图功能。代码如下:
void CEx19Doc::OnMenuitemPaint()
{
// TODO: Add your command handler code here
//通知视图绘制图案
m_OperateType=TRUE;
UpdateAllViews(NULL);
}
代码解析
文档类 CDocument 的成员函数 UpdateAllViews 通知视图更新显示。一般情况下把数据处
理都放入文档类中,而把结果显示放入视图类中。文档类通过 UpdateAllViews 通知视图更新
显示。视图类通过 GetDocument 函数获取当前运行的文档类对象指针,然后通过该指针访问
文档类的数据处理结果,并根据这些结果进行显示。本例中文档类的数据操作就是修改
m_OperateType 的值。
(16)修改“清除图案”菜单选项的消息相应函数 OnMenuitemClear,通知视图清除图案。
代码如下:
void CEx19Doc::OnMenuitemClear()
{
// TODO: Add your command handler code here
//通知视图清楚图案
m_OperateType=FALSE;
UpdateAllViews(NULL);
}
4. 在视图类 CEx19View 的 OnDraw 函数中实现绘图操作
在需要刷新视图时,应用程序都会调用视图类的 OnDraw 函数,一般情况下应该把所有
的绘图操作放在这个函数中。
OnDraw 函数由应用程序向导自动生成,在修改前代码如下:
void CEx19View::OnDraw(CDC* pDC)
{
CEx19Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
通过 GetDocument 函数可以获取当前文档类对象的指针,而下面的 ASSERT_VALID 宏
则是测试获取指针的有效性。前面已经反复强调过应尽量把数据操作放在文档类中,而把显
示操作放在视图类中,两类之间通过 UpdateAllViews 函数和 GetDocumet 函数传递信息。
(17)在类查看(ClassView)选项卡中展开视图类 CEx19View 的成员列表。在列表中双击
显示绘图函数 OnDraw。
(18)先在 OnDraw 函数中定义画笔,并获取当前窗口的有效范围。代码如下:
// TODO: add draw code for native data here
CRect rect;
CBrush WhiteBrush;
CBrush RedBrush;
CBrush G
reenBrush;
CBrush BlueBrush;
CBrush BlackBrush;
CBrush YellowBrush;
WhiteBrush.CreateSolidBrush(RGB(255,255,255));
RedBreSolidBrush(RGB(255,0,0));
GreenBrush.CreateSolidBrush(RGB(0,255,0));
BlueBeSolidBrush(RGB(0,0,255));
BlackBrush.CreateSolidBrush(RGB(0,0,0));
YellowBruseSolidBrush(RGB(255,255,0));
GetClientRect(&rect);
(19)然后实现根据 CEx19Doc 对 m_OperateType 的操作结果进行显示的功能。代码如下:
if(pDoc->m_OperateType)
{
pDC->SelectObject(BlueBrush);//绘制蓝色环
pDC->Ellipse(50,50,100,100);
pDC->SelectObject(WhiteBrush);
pDC->Ellipse(54,54,96,96);
pDC->SelectObject(YellowBrush);//绘制黄色环
pDC->Ellipse(76,75,126,125);
pDC->SelectObject(WhiteBrush);
pDC->Ellipse(80,79,122,121);
pDC->SelectObject(BlackBrush);//绘制黑色环
pDC->Ellipse(104,50,154,100);
pDC->SelectObject(WhiteBrush);
pDC->Ellipse(108,54,150,96);
pDC->SelectObject(GreenBrush);//绘制绿色环
pDC->Ellipse(130,75,180,125);
pDC->SelectObject(WhiteBrush);
pDC->Ellipse(134,79,176,121);
pDC->SelectObject(RedBrush);//绘制红色环
pDC->Ellipse(158,50,208,100);
pDC->SelectObject(WhiteBrush);
pDC->Ellipse(162,54,204,96);
pDC->TextOut(130,190,"支持奥运事业!");//在指定坐标输出文字
}
else
{
pDC->SelectObject(WhiteBrush);//将整个视图涂成白色,清除图案
pDC->FillRect(&rect,&WhiteBrush);
}
代码解析
CDC 的成员函数无法直接实现环形绘制。在本例中先绘制一个大的圆形,然后将圆形内
部涂成背景色白色,以实现环的效果。
(20)在 OnDraw 函数的最后,销毁画刷,以释放系统资源。
WhiteBrush.DeleteObject();
RedBreObject();
GreenBrush.DeleteObject();
BlueBeObject();
BlackBrush.DeleteObject();
YellowBruseObject();
5. 编译运行程序
(21)编译运行程序,用鼠标选择相应的菜单选项实现绘图操作。
(22)用 Alt 键选择,Alt+P 弹出“绘制”菜单,然后用 Alt+P/C 分别选择“绘制奥运五环”
和“清除图案”选项。
(23)用快捷键选择,Ctrl+Alt+P/C 分别选择“绘制奥运五环”和“清除图案”选项。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1716185502a2726546.html
评论列表(0条)