计算机图形学 使用VC开发绘图程序的基本方法
Vc画图的方法
{
if(d<=0)
{
d+=a+b;
x++;y++;
}
else
{
d+=a;
x++;
}
SetPixel(hdc, x, y, 0x0000ff);
}
}
三、tc或bc画图
1、图形方式初始化
Turbo C2.0语言使用函数initgraph来完成图形初始化。其格式为:
void intitgraph(int *gdriver,int *gmode,char *path);
{
int x=100,y=100;
int a=1,b=-3;
int d=1*(x+1)-3*(y+0.5)+200;
pDC->SetPixel(x,y,RGB(0,0,0));
while(x<700)
{
if(d<=0)
{
d+=a+b;
x++;y++;
}
else
{
d+=a;
x++;
}
pDC->SetPixel(x,y,RGB(0,0,0));
//调用自编的画图程序
lineswep(hdc);
EndPaint(hWnd, &ps);
break;
///自编的画图程序
void lineswep(HDC hdc)
{
int x=100,y=100;
int a=1,b=-3;
double d=1*(x+1)-3*(y+0.5)+200;
VC++绘图编程
8
绘制线条
移动画笔位置 成员函数MoveTo() 用CDC成员函数 成员函数 pDC->MoveTo(x1,y1) ; 绘制直线 成员函数LineTo() 用CDC成员函数 成员函数 pDC->LineTo(x2,y2) ; 演示程序: 使用 使用CPen画线 画线.avi> 演示程序: <使用 画线
演示程序: 演示程序:画线函数处理.avi
11
画光栅点
pDC->SetPixel(x,y,(COLORREF)x+y);
COLORREF SetPixel( int x, int y, COLORREF crColor );
Parameters x
Specifies the logical x-coordinate of the point to be set.
演示程序:图形操作/画图形 演示程序:图形操作 画图形 Program 第三章图象编程 第三章图象编程.cpp-OnDrawGraph () -
14
写文字
pDC->TextOut(100,200,strText,lstrlen(strText);
virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); Parameters x
用笔( 对象) 用笔(CPen对象)绘制宽度为 点红色的实线 对象 绘制宽度为5点红色的实线
void CImageView::OnDraw(CDC* pDC) { … CPen penBlue(PS_SOLID,5,RGB(255,0,0)),*pOldPen; pOldPen=pDC->SelectObject(&penBlue); pDC->MoveTo(20,10); pDC->LineTo(200,100); pDC->SelectObject(pOldPen); penBlue.DeleteObject(); }
VC6.0简单绘图说明
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
VC++绘图介绍
类。
一般情况下,应用程序都要在View(视图) 类中来进行绘图,视图窗口绘制或者重绘,应 用程序框架都要调用视图类的OnDraw成员函数。
void CMyDrawView::OnDraw(CDC* pDC)
{
// TODO: add draw code for n数调用BeginPaint , 析构函数调用EndPaint。
pDC->PolyBezier(points,7);
pDC-> SelectObject(OldPen);}
2.画简单的闭合图形
(1) Rectangle BOOL Rectangle(int x1,int y1, int x2,int y2); (2) Ellipse BOOL Ellipse(int x1,int y1, int x2,int y2);
void CMyDrawView::OnDraw(CDC *pDC)
{CPen Pen; CPen *OldPen; CBrush Brush;CBrush *OldBrush; Pen.CreatePen(PS_SOLID,5,RGB(0,0,0)); Brush.CreateSolidBrush(RGB(0,255,0));
1.4 几种常用的绘图函数
1.画线函数 (1) 成员函数MoveTo:将当前的绘图位置移 到point 指定的坐标处 CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); (2) 成员函数LineTo 在当前的绘图位置上与一个新坐标点之间画一 条直线,这个新的坐标点将变成当前位置。 BOOL LineTo (int x,int y); BOOL LineTo (POINT);
VC绘图简易教程_4
[学习目标]学会实现简单动画所谓动画,其实是连续显示一系列图形而已。
结合到程序上,我们需要以下几个步骤:1. 绘制图像2. 延时3. 擦掉图像循环以上即可实现动画。
[范例]举一个例子,我们实现一条直线从上往下移动:#include <graphics.h>#include <conio.h>void main(){initgraph(640, 480);for(int y=0; y<480; y++){// 绘制绿色直线setcolor(GREEN);line(0, y, 639, y);// 延时Sleep(20);// 绘制黑色直线(即擦掉之前画的绿线)setcolor(BLACK);line(0, y, 639, y);}closegraph();}再看一个例子,实现一个圆从左往右跳动:#include <graphics.h>#include <conio.h>void main(){initgraph(640, 480);for(int x=100; x<540; x+=20){// 绘制黄线、绿色填充的圆setcolor(YELLOW);setfillstyle(GREEN);fillellipse(x, 100, 20, 20);// 延时Sleep(500);// 绘制黑线、黑色填充的圆setcolor(BLACK);setfillstyle(BLACK);fillellipse(x, 100, 20, 20);}closegraph();}也就是说,移动的间距小、延时短,动画就会越细腻。
但当画面较复杂时,会带来画面的闪烁(怎样消除闪烁是以后的话题)。
[作业]绘制一个沿45 度移动的球,碰到窗口边界后反弹。
[改进]你的程序存在闪烁问题和不平滑看了半天,图形库还有批量画图,改进如下//这样的c底层,也不……,不过不失为初学者的首选#include <graphics.h>#include <conio.h>void main(){//说实话这个库没有自动检测initgraph(640, 480);//开始批量画图BeginBatchDraw();for(int y=0; y<480; ++y){// 绘制绿色直线setcolor(GREEN);line(0, y, 639, y);//继续画图FlushBatchDraw();// 延时单位毫秒,不精准的厉害, 别希望匀速Sleep(10);// 这里用背景色盖住就行cleardevice();}//结束批量绘图EndBatchDraw();closegraph();}#include <graphics.h>#include <conio.h>void main(){initgraph(640, 480);//开始批量画图BeginBatchDraw();for(int x=100; x<540; ++x) //缩小步长{// 绘制黄线、绿色填充的圆setcolor(YELLOW);setfillstyle(GREEN);fillellipse(x, 100, 20, 20);//继续画图FlushBatchDraw();// 延时Sleep(10);// 绘制黑线、黑色填充的圆cleardevice();}//结束批量绘图EndBatchDraw();closegraph();}。
第二章VC绘图基础
OnDraw函数。
void CTestView::OnDraw(CDC* pDC) ASSERT_VALID(pDoc)函
{
数使pDoc指针有效。
CPixelDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
➢ 在CWindowsDC绘图类下,坐标系是建立在整个屏幕上 的,在像素坐标方式下,坐标原点在屏幕的左上角,而 在CPaintDC和CClientDC绘图类下,坐标系是建立在客 户区上的,在像素坐标方式下,坐标原点在客户区的左 上角。
2.1 windows图形系统
➢ CPaintDC类应用在OnPaint函数中,以响应Windows的 WM_PAINT消息。而CClientDC应用在非响应消息 WM_PAINT的情况。
息。 MFC中的数据是存储在CTestDoc类文档中 结果的显示是在CTestView类中 文档类负责管理和维护数据本身 视图类负责处理用户鼠标和键盘的操作
2.2 MFC上机步骤
运行程序,选择Build 菜单下的!Executive test.exe
2.2 CDC类的绘图成员函数
2.2.1. CDC类对象的使用方式:
2.2 CDC类的绘图成员函数
3. 在OnDraw与OnPaint以外的消息响应函数中使 用
必须使用CClientDC派生类对象,如果函数在支持滚动的视窗中 使用,还需调用CscrollView::OnPrepareDC函数。 void CMainFrame::On32771() //菜单命令响应函数 {
22mfc上机步骤单击finish按钮弹出newprojectinformation对话框22mfc上机步骤单击ok按钮mfcappwizard自动生成为程序生成所需的开始文件并自动在项目工作区打开新项目自动生成为程序生成所需的开始文件并自动在项目工作区打开新项目22mfc上机步骤从classview面板可以看出ctestapp是应用的主函数类用来处理消息
VC绘图教程
VC绘图/游戏简易教程--1:创建新项目 (1)VC绘图/游戏简易教程--2:简单绘图,学习单步执行 (1)VC绘图/游戏简易教程--3:熟悉更多的绘图语句 (2)VC绘图/游戏简易教程--4:结合流程控制语句来绘图 (3)VC绘图/游戏简易教程--5:数学知识在绘图中的运用 (5)VC绘图/游戏简易教程--6:实现简单动画 (6)VC绘图/游戏简易教程--7:捕获按键,实现动画的简单控制8 VC绘图/游戏简易教程--8:用函数简化相同图案的制作 (10)VC绘图/游戏简易教程--9:绘图中的位运算 (12)VC绘图/游戏简易教程--10:用鼠标控制绘图/游戏程序 (16)VC绘图/游戏简易教程--11:随机函数 (18)VC绘图/游戏简易教程--12:数组 (20)VC绘图/游戏简易教程--13:getimage / putimage / loadimag / saveimage / IMAGE 的用法 (25)VC绘图/游戏简易教程--14:位运算实现颜色分离处理 (27)VC绘图/游戏简易教程--16:设备上下文句柄 (29)VC绘图/游戏简易教程--1:创建新项目输入以下代码试试(无需理解代码含义):#include <graphics.h>#include <conio.h>void main(){initgraph(640, 480);line(200, 240, 440, 240);line(320, 120, 320, 360);getch();closegraph();}执行后应该可以看到屏幕正中央有一个十字。
VC绘图/游戏简易教程--2:简单绘图,学习单步执行[本期目标]学会简单绘图,并学会简单调试。
先看看上一课的代码,我加上了注释#include <graphics.h> // 绘图库头文件,绘图语句需要#include <conio.h> // 控制台输入输出头文件,getch()语句需要void main(){initgraph(640, 480); // 初始化640x480的绘图屏幕line(200, 240, 440, 240); // 画线(200,240) - (440,240)line(320, 120, 320, 360); // 画线(320,120) - (320,360)getch(); // 按任意键closegraph(); // 关闭绘图屏幕}解释一下:1. 创建的绘图屏幕640x480,表示横向有640个点,纵向有480个点。
VC6.0简单绘图说明
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
计算机图形学---第8章 绘图
8.1 概述
在选择GDI对象进行绘图时,往往遵循着下列的步骤:
(1) 定义一个GDI对象(如CPen、CBrush对象),然后用相应的 函数(如CreatePen、CreateSolidBrush)创建此GDI对象。 (2) 将构造的GDI对象选入当前设备环境中,但不要忘记将原 来的GDI对象保存起来。 (3) 绘图结束后,恢复当前设备环境中原来的GDI对象。 (4) 当程序结束后,框架会自动删除程序创建的GDI对象。
8.1 概述
具体操作与以下代码类似:
void CMyView::OnDraw( CDC* pDC ) { CPen penBlack; // 定义一个画笔变量 penBlack.CreatePen( PS_SOLID, 2, RGB(0,0,0)); // 创建画笔 // 将此画笔选入当前设备环境并保存原来的画笔 CPen* pOldPen = pDC->SelectObject( &penBlack ); // 用此画笔绘图 pDC->MoveTo(...); pDC->LineTo(...); pDC->SelectObject( pOldPen ); // 恢复设备环境中原来的画笔 }
8.1 概述
2. 库存的GDI对象
Windows 包 含 了 一 些 库 存 的 可 以 利 用 的 GDI 对 象 。 CDC 的 成 员 函 数
SelectStockObject可以把一个库存对象选入当前设备环境中,并返回原先 被选中的设备环境对象的指针,同时使原先被选中的对象从设备环境中分 离出来。如下面的代码所示: void CMyView::OnDraw( CDC* pDC ) { CPen newPen( PS_SOLID, 2, RGB(0,0,0) ) ) pDC->SelectObject( &newPen ); pDC->MoveTo(...); pDC->LineTo(...); pDC->SelectStockObject( BLACK_PEN ); // newPen被分离出来 }
利用VC编写简单的绘图程序
利用VC编写简单的绘图程序上机实验环境亦可选择Microsoft Visual C++〔以下简称VC〕。
VC是美国微软公司生产的基于其Windows系统的软件开发工具。
它具有使用灵活,并与32位Windows内核〔使用于Windows 2000/Windows XP〕高度兼容的特点,从而被Windows程序员们广泛使用。
VC 在图形图像处理方面有着广泛的应用,MFC中提供了大量的图形图像函数,下面我们将对使用VC/MFC编写简单的绘图程序。
一、使用VC编写MFC单文档应用程序很简单,只需要按照下面几个步骤进行:1.翻开MSVC集成开发环境。
双击桌面或“开始〞菜单中的Microsoft VisualC++6.0,不久将看到VC的编辑窗口,如图3-5:图1 VC启动界面2.选择菜单“File | New〞,在弹出的对话框中1)单击上方的选项卡“Project〞,2)选择“MFC AppWizard(exe)〞,3)在“Project name〞一栏中填写工程名,例如draw,4)在“Location〞一栏中填写你想把文件存放的位置〔目录〕。
然后按“OK〞。
见图2。
注意:第4〕步中指定你自己的目录,不要使用系统的缺省目录或者随便放在根目录或者其他的目录下。
这样便于你找到自己编写的程序。
图2 应用程序向导主界面3.在MFC Appwizard-Step 1中选择“Single Document〞,即单文档应用程序,点击“Finish〞,如图3所示。
注意:对于下面的操作我们可以忽略,直接点Finish即可。
图3 应用程序向导中选择单文档视图4.系统弹出一个当前工程信息的对话框,如图4所示,直接点“OK〞即可。
图4 新建工程信息5.进入程序编写的主界面,屏幕左下方为工作区,如图5所示,工作区中共有三种视图,分别是:1)文件视图〔“FileView〞〕,主要包括头文件,cpp文件以及资源文件。
我们在头文件中一般添加类的定义,类的成员变量和函数的声明,而在cpp文件中具体实现函数。
计算机图形学之VisualC绘图基础
ASSERT_VALID(pDoc); } ➢ pDC定义为CDC类的指针。 ➢ pDoc通过GetDocument()函数得到了
指向文档类CTestDoc的指针。
OnDraw(CDC* pDC)函数
void CTestView::OnDraw(CDC* pDC) {
CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); } ➢ ASSERT_VALID(pDoc)函数使pDoc指针有 效。使用pDC指针,可以对CDC类的成员函 数进行操作。 ➢ 注意:OnDraw函数是由系统框架直接调用 的,程序一运行就会自动执行。
全部展开FileView 面板后,显示如图 的界面内容
本书后续的编程过程 中一般使用的是 CTestView类的 TestView.h头文 件和 TestV(CDC* pDC)函数
void CTestView::OnDraw(CDC* pDC) {
CTestDoc* pDoc = GetDocument();
➢ 在微软基类库MFC中,CDC类是定义设 备上下文对象的基类,所有绘图函数都 在CDC基类中定义。
2.2节内容
➢ 2.2.1 CDC类结构和GDI对象 ➢ 2.2.2 映射模式 ➢ 2.2.3 CDC类的主要绘图成员函数 ➢ 2.2.4 设备上下文的调用和释放 ➢ 2.2.5 VC++绘制图形的几种方法
使用VisualC快速构建图形学程序
如果希望客户区在下次系统发送WM_PAINT消息 时被更新,则需先执行CWnd::Invalidate()函 数,否则OnPaint()方法不会反映当前在客户区 所作的更改。
WM_PAINT消息
启用Debug模式(工具栏上点击右键选中 “Build”,在编译类型中选择“Win32 Debug”),在可疑的出错点标上断点(在代码 行上按F9键),让程序执行到该处停下来,进而 执行单步跟踪(按F10键,跟踪变量的值)是查 错的基本方法。
在Debug模式下,VC环境中有一个调试工具栏窗
口(工具栏上点击右键选中”Debug”),同时
常用的绘图函数
5)绘制椭圆 CDC::Ellipse( int x1, int y1, int x2,
int y2 ); CDC::Ellipse( LPCRECT lpRect ); 6)在屏幕上打点 CDC::SetPixel( int x, int y,
COLORREF crColor ); CDC::SetPixel( POINT point,
1)规范的变量和函数命名,包括控件变量和 自定义变量、函数的命名
控件ID命名如:IDC_BUTTON_REMOVEPOINT 控件变量命名如:m_btnRemovePoint 自定义变量命名如:fBernstein,m_iPointNum 函数命名如:DrawBezier(int n, CPaintDC* dc)
为简单起见,推荐在OnPaint()中使用 CPaintDC类进行图形绘制。
WM_PAINT消息
WM_PAINT消息是Windows系统的标准消息, 当操作系统或其他应用程序发出请求要求画/重画 一个应用程序窗口的一部分时,便会向该应用程 序窗口发出该消息,该消息对绘图而言至关重要。 比如:
VisualC++绘图基础
• 形象地说,一个设备环境提供了一张画布和一些
绘画的工具,我们可以使用不同颜色的工具在上
202面1/3/绘6 制点、线、圆和文本。
18
中国矿业大学 环境与测绘学院
2 Window图形绘制基本概念
• 设备环境中的“设备”是指任何类型的显示器或 打印机等输出设备,绘图时用户不用关心所使用 设备的编程原理和方法。所有的绘制操作必须通 过设备环境进行间接的处理,Windows自动将设 备环境所描述的结构映射到相应的物理设备上。
2021/3/6
2
中国矿业大学 环境与测绘学院
1 VC++编程入门
1.1生成一个新的图形界面工程
2021/3/6
3
中国矿业大学 环境与测绘学院
1 VC++编程入门
2021/3/6
4
中国矿业大学 环境与测绘学院
1 VC+境与测绘学院
2021/3/6
6
24
中国矿业大学 环境与测绘学院
2 Window图形绘制基本概念
4)RGB宏
很 多 涉 及 到 颜 色 的 GDI 函 数 都 需 要 使 用 COLORREF类型的参数,如设置背景色的成员函数 CDC::SetBkColor() 、 设 置 文 本 颜 色 的 成 员 函 数 CDC::SetTextColor()。例如:
MFC 的 DC 类 包 括 CDC 、 CPaintDC 、 CClientDC 、 CWindowDC和CMetaFileDC等,其中CDC类是MFC设 备环境类的基类,其它的MFC设备环境类都是CDC 的派生类。
2021/3/6
21
中国矿业大学 环境与测绘学院
2 Window图形绘制基本概念
Visual+C图形图像编程之一基础知识及基本绘图方法
为抵色处理和明髟i黾莸取或设置此c珥如对橐的呈现原点。
获取或设置此&舳对象的呈理质量。
’
获取或设置与此G螂妇对象关联的文本的呈理簋式。
获取戚设置此c嘶对象的全局变换。
创建完Graphics实例后,就可以使用表02中的方法来绘制 线条和形状、呈现文本或显示与操作图像等。与Gmphics一起使
∥编穆龌
绘翻一系列莲接一组B“m结构的拽殷。
n“哳
n№hr咖 mⅢh岫
m—蛳
绘制矗-山mP址对象。 绘橱一十麝形.谈扇形自一十坐标对、宽度和高度以及两条射线所指 定的椭翟定艾。
绘制由一组胁结构定义的当边形。
绘橱由坐标对、宽度和高度指定的矩形。
绘村一系列自R刚-n出结构指定的矩形。 在指定位置并且用指定的Bn吐和F缸对象绘铜指定的文本宇符串。
或者: Rectang『e rc=new Rectang}e(10,10,250,150): LinearGrad{entBrush br=new LjnearGrad}entBrush (rc. COIOr BhJe.CoIor Black.LinearGrad}entMOde BackwardDiagonaI):
瓣牺娄器釜篡梦
ARGB属性及其说明: 每一种颜色都是color结构的成员,以下是使用color结构
的一种典型的方式:
pn.Color=Color.Red;
‘
5.字体(Font类)。 Font类用以定义特定的文本格式,包括字体、字号和字形属 性。初始化一个Font实例既可以使用指定的属性也可以使用已 经存在的Font实例和Fontstyle枚举来初始化新的F0nt实例。, 具体如下:
表3 Pen类的常用属性及其说明
属
计算机图形学VC++绘图基础
四、绘制基本图形
7. 其他绘图函数 (2) CRect的构造函数
* 绘制椭圆 BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Ellipse( LPCRECT lpRect ); (3) 画饼图 BOOL pie (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); BOOL pie (LPCRECT lpRect, POINT ptStart, POINT ptEnd);
四、绘制基本图形
7. 其他绘图函数 (2) CRect的构造函数 CRect();
CRect( int l, int t, int r, int b ); CRect( POINT topLeft, POINT bottomRight ); * 绘制矩形 void FrameRect( LPCRECT lpRect, CBrush* pBrush ); void FillRect( LPCRECT lpRect, CBrush* pBrush ); Rectangle (int x1, int y1, int x2, int y2); Rectangle (LPCRECT lpRect); * 绘制椭圆 BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Ellipse( LPCRECT lpRect );
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
四、绘制基本图形
5. 设置当前画笔 CPen的构造函数 CPen(); CPen( int nPenStyle, int nWidth, COLORREF color); CPen的CreatePen函数 BOOL CreatePen(int nPenStyle, int nWidth, COLORREF color); 例: CPen *pOld, pen( PS_DOT, 1, RGB( 255, 0, 0)); pOld=pDC->SelectObject(&pen); 绘图 pDC->SelectObject(pOld);
VC图形程序设计基础课件
成环境。从文件菜单中选择新建(New)命令,
2.1.2 应用程序工程的建立方法
弹出图2-2对话框。切换到工程(Projects)标 签,项目类型选择MFC AppWizard(exe),输 入工程的名字(如VcApp),选择项目放置的 位置,然后单击“确定”按钮。
GetCurrentBrush() 获取所选画刷的指针
GetCurrentFont() 获取所选字体的指针
GetCurrentPalette() 获取所选调色板的指针
GetCurrentPen() 获取所选画笔的指针
GetCurrentPosition() 获取画笔的当前位置
GetDeviceCaps() 获取显示设备能力的信息
GDI是Windows系统核心的三种动态链接库之一, 它管理Windows系统的所有程序的图形输出。在 Windows系统中,GDI向程序员提供了高层次的 绘图函数,只要掌握这些绘图函数,就可以很方 便地进行图形程序设计。
设备描述表(DC, Device Context)
DC是一个数据结构,当程序向GDI设备中绘图时, 需要访问该设备的DC。MFC将GDI的DC封装在C++ 类中,包括CDC类和CDC派生类,这些类中的许多 成员都是对本地GDI绘图函数进行简单封装而形成的 内联函数。
PolyLine()
绘制一组直线
RealizePalette() 将逻辑调色板映射到系统调色板
Rectangle()
绘制矩形
RoundRect() 绘制圆角矩形
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
七、思考题(尽量做,计入成绩) :
1、为什么要用 CDC 定义一个对象来作图? Windows 使用与设备无关的图形设备环境进行显示 。MFC 基础类库定义了设备环境对象类----CDC 类。 因为使用的是 mfc,如果是 sdk 的话就得用 dc,这个 cdc 想当是一个给设备画画的笔。 2、如果要绘制多条直线,应该如何编程?
4、 VC 中编程环境中,工程(project)是什么意义?为什么要用 project 的方式管理代码?
Project 文件的扩展名是 dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息, 每个工程都对应有一个 dsp 类型的文件。 clw 为扩展名的文件是用来存放应用程序中用到的类和资源的信 以 息的,这些信息是 VC 中的 ClassWizard 工具管理和使用类的信息来源。 因为用 project 的方式管理代码比较方便,可以看成是在一个文件夹下进行的。
3、 在 MyView.cpp 文件的 OnDraw 函数中加入如下代码。 pDC->MoveTo(100,100); pDC->LineTo(200,200); CPen *pOldPen; CPen dashPen; dashPen.CreatePen(PS_DASH,1,RGB(255,0,0)); pOldPen = pDC->SelectObject(&dashPen); pDC->LineTo(300,100); pDC->SelectObject(pOldPen); pDC->LineTo(400,200);
实验(No. 1
)题目:使用 VC 开发绘图程序的基本方法
实验目的及要求:
一、实验目的:
编写一个具有一定功能的 MFC 类库应用程序 (引入简单的视图/文档概念) 掌握 GDI 画图的基本方法, , 并调用系统函数画直线。
二、基本概念:
1、什么是视图 用户角度:与其他 Windows 窗口一样的窗口 程序员:从 MFC 的 Cview 类派生的类的一个对象 2、单文档界面和多文档界面 单文档:一次只能打开一个文档(NotePad) 多文档:一次能打开多个文档(Word) 3、设备上下文 DC (Device Context) 是一种数据结构,在 Windows 下表示物理设备的逻辑形式。有多种 DC: 显示设备上下文 Display DC:将显示信息输出到视频显示器。 打印设备上下文 Printer DC:将显示信息输出到打印机。 内存设备上下文 Memory DC:为特定的设备保存位图图像。 信息设备上下文 Information DC:用于访问默认设备数据信息的设备上下文。 4、使用设备上下文 DC MFC 类库提供了不同类型的设备上下文的类, 每一个类都封装了代表 Windows 设备上下文的句柄 (HDC)和函数 CDC 类:是设备上下文的基类,其它的设备上下文类都是 CDC 的派生类。CDC 类非常庞大,包 含 170 多个成员函数和数据成员。利用它可以访问整个显示设备和其它输出设备 CPaintDC 类:是 OnPaint()函数使用的设备上下文类,代表了窗口的绘图画面。 CClientDC 类:是窗口客户区的设备上下文类,代表了客户区窗口的绘图画面。 CWindowDC 类: 类是整个窗口区域的设备上下文类, 整个窗口区域即包括客户区又包括非客户区, 即允许用户在显示器屏幕的任何地方绘图,包括窗口边框、标题区域。 CMetaFileDC 类:用于创建一个 Windows 图元文件的设备上下文。Windows 图元文件包含了一系 列 GDI 绘图命令。 5、使用 GDI 对象 GDI 对象的创建也要分为两步: 第一步定义一个 GDI 绘图对象类的实例,即调用默认构造函数; 第二步调用该对象的创建方法真正创建对象 使用该对象时,调用 CDC::SelectObject() 将它选入到设备上下文中,同时保存原来的设置到一个 GDI 对象指针,如 pOldObject 中 在使用完后, SelectObject(pOldObject)
三、上机作业要求
1. 2. 3. 4. 修改 P28,2.2:基于 VC++平台,单文档结构,GDI 方式,在窗口中绘制 2 条不同颜色、线 型线段;(参考教材 20 页) 每人单独完成实验。 不要取中文类名;工程(project)以自己名字全拼和/或学号来命名;否则不计成绩! ! 思考能否像实验五那样,做出一个菜单来实现画线?
实验设备:
四、实验内容和步骤:
1、 启动 VC,选择“文件 | 新建项目” ,新建一个 MFC Appwizard (exe)工程,假设工程名为 My(实 际操作中取自己名字全拼和/或学号,例如:0714050105-1) ,如下图所示。
2、 点击 OK,在出现的界面中选择“Single Document” ,点击“Finish”按钮。
八、实验体会
这是第一次计算机图形学的上机,也是第一次使用 MFC。初步了解一下图形的基本画法。 根据老师给的资料和程序代码,DC、MFC 类库、CDC 类的概念,和 CPaintDC、CClientDC 类、 CWindowDC 的意思及使用方法。 使用 GDI 对象在,视图窗口中绘图(GDI) ,通过自己修改代码,变成想要的图形,在 OnDraw 函 数中放入代码。例如修改 RGB 改变颜色。 通过查书及其他资料了解了,CDC 定义,绘制多条直线,改变直线的o(,) LineTo(,) MoveTo(,) LineTo(,) MoveTo(,) LineTo(,)
3、如果要改变直线的颜色、线型,如何做? CPEN 类就可以的,可以创建一个新的 CPEN 对象,并定义他的线条宽度,和线条颜色,如果定义的不是 SOLID 类型的 CPEN 对象,就可以定义 CPEN 类对象的线条类型了
将原来的 OnDraw 函数内的两行代码 CExercise2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); 都删除掉或注释掉。
五、核心代码:
这里将拟自己编写的上机程序中的主要代码拷贝粘贴过来;即 OnDraw 函数部分 pDC->MoveTo(100,100); pDC->LineTo(200,200);
CPen *pOldPen; CPen dashPen; dashPen.CreatePen(PS_DASH,1,RGB(0,0,255)); pOldPen = pDC->SelectObject(&dashPen); pDC->LineTo(500,400); pDC->SelectObject(pOldPen); pDC->LineTo(400,500);六、屏幕显示结果: 这里将绘出的图形界面拷贝下来;
效 PS_DASHDOTDOT 创建一个双点线画笔, 该值只有当画笔宽度等于 1 个设备单位或更小时才有效 PS_NULL 创建一个空线画笔 PS_INSIDEFRAME 创建一个内框线画笔, 代码: CPen( ); CPen(int nPenStyle, int nWidth, COLORREF crColor); throw(CResourceException); CPen(int nPenStyle, int mWidth, const LOGVRUSH* pLogBrush, int nStyleCount=0, const DWORD* lpStyle=NULL); throw(CResourceException); 例如: dashPen.CreatePen(PS_DASH,1,RGB(0,0,255)) 在 RGB(0,0,0,)中,改变数值 0~255 之间,就可以改变线条颜色
PS_SOLID 创建一个实线画笔
PS_DASH 创建一个虚线画笔,该值只有当画笔宽度等于 1 个设备单位或更小时才有效 PS_DOT 创建一个点线画笔,该值只有当画笔宽度等于 1 个设备单位或更小时才有效 PS_DASHDOT 创建一个点和虚线交替画笔, 该值只有当画笔宽度等于 1 个设备单位或更小时才有
恢复原来的设置 6、在视图窗口中绘图(GDI) 通过修改 OnDraw()函数来完成绘图 是 CView 类的虚拟成员函数,每次视图重画时调用(WM_PAINT->OnPaint->OnDraw) 7、在 OnDraw 等函数中绘图时步骤: p20 选择好画笔和画刷等绘图工具 确定好绘图坐标及比例尺 根据需要选用适当的绘图函数绘出图形 8、注意几个坐标系:屏幕坐标系、绘图坐标系…各自原点和坐标轴刻度大小?
教师评语:
成绩: 教师签字: 年 月 日