计算机图形学实验 用VC++在屏幕上绘图.

Slides:



Advertisements
Similar presentations
PRESENTED BY OfficePLUS
Advertisements

第14章 c++中的代码重用.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第六章 三维真实感物体显示技术 虚拟现实(Virtual Reality,简称VR)技术是一种逼真的模拟人在自然环境中视觉、听觉、运动等行为的人机界面技术。其目的是:不仅能够在多维空间仿真建模,而且能够帮助人们获取知识和形成新的概念,Mark Green给出了一个简明的虚拟现实应用系统模型,如图6.1所示。
7.1.1 设备环境类 设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。 (1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。
Hadoop I/O By ShiChaojie.
第5章 图形和文本输出.
蓄势待发 知识准备阶段.
Windows 程式設計 (使用 C++ / C#)
Visual C++ Windows Programming
VISUAL C++ 简介.
第1章 Windows应用程序框架的 创建与消息处理
大学计算机基础 典型案例之一 构建FPT服务器.
第11讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数.
辅导课程六.
第十一讲 MFC常用控件的使用(3) 严宣辉 数学与计算机科学学院
绘制圆与多边形 椭圆形 绘制椭圆形的方法是 drawOval(x ,y , width , height), 绘制实心椭圆形的方法是
VC++开发实例 张荣梅 2007年2月.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
版权所有 复制必究 第 8 章 图形设备接口.
第7章图形、文本和位图 7.1概述 7.2图形设备接口 7.3图形绘制 7.4字体与文字处理 7.5在对话框及控件中绘图 7.6综合应用.
数学模型实验课(三) 插值与三维图形.
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
Visual C++ Windows Programming
第十三章 繪 圖 13-1 繪圖方法 13-2 繪圖屬性 13-3 綜合範例.
POWERPOINT TEMPLATE HI.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第八章 文档/视图结构应用程序 8.1 文档/视图结构 8.2 图形与文字输出 8.3 定时器 8.4 鼠标和键盘消息处理 8.5 对话框
第3讲 Windows的图形设备接口及windows绘图
第七章 操作符重载 胡昊 南京大学计算机系软件所.
CLICK HERE TO ADD YOUR TITLE
程序设计工具实习 Software Program Tool
VISUAL C++ 编程中的图形 图形设备接口(Graphic device interface)
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第11讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数.
产品推广 PRODUCT PROMOTION PRESENTED BY OfficePLUS.
C#面向对象程序设计 $6 深入理解类.
第十二讲 菜单、工具栏和状态栏 严宣辉 数学与计算机科学学院
72% 29% 33% ADD YOUR TITLE HERE 点击此处添加文本信息。
《面向对象程序设计与Visual C++6.0教程》
Visual C++ Windows Programming
VisComposer 2019/4/17.
MFC及其应用.
姚金宇 MIT SCHEME 使用说明 姚金宇
Logo语言. Logo语言 视图窗口 小海龟 ?: 提示符 l: 光标 命令窗口.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
CLICK HERE TO ADD YOUR TITLE
一个简单的二维光栅图形软件包:Windows API
iSIGHT 基本培训 使用 Excel的栅栏问题
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
第二章 一个简单的二维光栅图形软件包 ----Windows API简介
2019/5/21 实验一 离散傅立叶变换的性质及应用 实验报告上传到“作业提交”。 11:21:44.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
Python 环境搭建 基于Anaconda和VSCode.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
MFC的六大核心 机制 命令传递 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chinese Virtual Observatory
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本课内容 接下来的几节课,我们要利用C语言开发一些游戏 本节课开发一个俄罗斯方块游戏 游戏规则.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
Presentation transcript:

计算机图形学实验 用VC++在屏幕上绘图

如何建立一个VC++应用程序框架文件:

一.MFC绘图函数: 1.1 生成设备环境对象 设备环境是一个对窗口的绘图表面的属性保持跟踪的数据结构。这些属性包括用于在屏幕上绘图的当前所使用的画笔和画刷。与可以同时使用很多画刷和画笔的艺术家不同,设备环境每次只能用一种画笔和一种画刷。而设备环境对象就是设备环境类的一个实例,它设置了绘图工具,并提供了绘制点,线等简单图形的绘图函数。所有的绘图工作都要通过设备环境对象来实现。

例如,如果想用一个能够画粗线条的画笔,就必须创建一个新画笔,然后用它取代设备环境中原有的画笔。类似的,如果想用红色的画刷填充一个图形,必须创建一个画刷,并将它选进设备环境,这就是Windows程序员在设备环境中取代工具的方式。

下面简单介绍几种设备环境: ①.CDC 设备环境对象类,是其它设备环境的基类。 一般情况下,应用程序都要在View(视图)类中来进行绘图,视图窗口绘制或者重绘,应用程序框架都要调用视图类的OnDraw成员函数。 void CMyDrawView::OnDraw(CDC* pDC) { // TODO: add draw code for native data here }

②.CPaintDC 构造函数调用BeginPaint ,析构函数调用EndPaint。 有时在视图窗口以外的窗口(如对话框)中绘制图形,需要调用窗口类的WM_PAINT的消息处理函数 OnPaint来绘制或者重绘窗口,OnPaint函数必须生成由 CPaintDC类派生的设备环境对象,如下所示: void CMyDialog::OnPaint() { CPaintDC dc(this); } (*)

CPaintDC dc(this);创建一个名为dc的设备环境对象,而this指向当前的对话框。这样就可以在对话框画图了。 注意:由于视图类窗口也是窗口的一类,所以视图窗口要绘制时也收到WM_PAINT 的消息,但是Cview提供一个OnPaint函数,生成和准备设备环境对象,然后将对象传入OnDraw函数。只有不从视图类派生的窗口类才需要提供自己的OnPaint函数做各种窗口绘图工作。

③.CClientDC 这个设备环境对象仅仅代表了当前窗口区域。它的构造函数调用GetDC函数,它的析构函数调用ReleaseDC 函数。 对于在OnDraw和OnPaint处理器之外的函数中显示图形,必须生成CClientDC类成员的设备环境对象。 CMyFunction::Function() {CClientDC ClientDC(this); // TODO: Add your message handler code here}

1.2 选择绘图工具 画笔,画刷,字体等等。 系统默认的画笔和画刷: 默认的画笔画出的线为宽度为1像素的黑色实线。默认的画刷是白色的,己用默认的画刷填充图形时,图形的内部填充成白色。

1.2.1 选用库存的绘图工具 CDC::SelectStockObject(int nIndex); void CMyView::OnDraw(CDC*pDC) { pDC-> SelectStockObject(WHITE_PEN); SelectStockObject(GRAY_BRUSH); }

1.2.2 生成自定义的绘图工具 生成自定义画笔和画刷的基本步骤: (1)生成画笔(CPen类)和画刷(CBrush)类的实例; (3)将生成的画笔和画刷选入设备环境对象中,并将设备环境对象的原有的画笔和画刷保存在指针中; (4)调用相应的绘图函数进行绘图; (5)将原来的画笔和画刷重新选入设备环境对象中

(1)生成笔(CPen类)和刷(CBrush)类的实例; CPen pen; CBrush brush; (2)调用CPen类和CBrush类的成员函数来初始化笔和刷; 画笔的初始化 CPen::CreatePen

BOOL CreatePen(int nPenStyle, int nWidth,COLORREF crColor); nPenStyle : PS_SOLID PS_DOT PS_DASH PS_DASHDOT PS_DASHDOTDOT nWidth : 线的宽度(线宽>1均产生实线)

COLORREF RGB(BYTE bRed , BYTE bGreen, BYTE bBlue); crColor参数指定线的颜色,类型为 COLORREF RGB(BYTE bRed , BYTE bGreen, BYTE bBlue); 0≤bRed ,bGreen, bBlue≤255 RGB宏功能定义了16种纯颜色。

RGB(0,0,0);黑色RGB(255,255,255);白色 RGB(128,0,0);深红RGB(255,0,0);淡红 RGB(0, 128,0);深绿RGB(0, 255,0);淡绿 RGB(0,0,128);深蓝RGB(0,0.255);淡蓝 RGB(128,128,0);深黄 RGB(255,255,0);淡黄 RGB(0,128,128);深青 RGB(0,255,255);淡青 等。

画刷的初始化: BOOL CreateSolidBrush( COLORREF crColor); BOOL CreateHatchBrush( int nIndex,COLORREF crColor); BOOL CreatePatternBrush( Cbitmap *pBitmap);

nIndex指定格子的形式。 HS_CROSS 水平垂直交叉阴影 HS_HORIZONAL 水平阴影线 HS_VERTICAL 竖直阴影线 HS_DIAGCROSS 45度交叉阴影对角线 HS_BDIAGONL 以45度角从左上到右下倾斜的阴影 HS_FDIAGONL 以45度角从左下到右上倾斜的阴影

(3)将生成的笔和刷选入设备环境对象中,并将设备环境对象的原有的笔和刷保存在指针中; CDC::SelectObject CPen * SelectObject (CPen *pPen); CBrush*SelectObject(Cbrush*pBrush); 注意:该函数返回的是原来的设备环境对象的指针

1.3 设置绘图属性 (1) 背景色 GetBkColor()返回当前的背景色。 SetBkColor(COLORREF crColor)函数是将当前的背景色设置成参数crColor所代表的颜色值。

(2)背景方式 GetBkMode() SetBkMode(int nBkMode) nBkMode: OPAQUE TRANSPARENT 这两个函数主要影响Chord ,Ellipse和Pie等闭合图形绘图函数。

(3)绘图方式 GetROP2( ); int SetROP2( int nDrawMode ); 绘图方式(nDrawMode) 组合后像素的颜色 R2_BLACK 总为黑色 R2_WHITE 总为白色 R2_NOT 颜色与屏幕颜色相反 R2_COPYPEN 具有画笔的颜色 R2_NOTCOPYPEN 具有与画笔相反的颜色

1.4 几种常用的绘图函数 1.画线函数 (1) 成员函数MoveTo:将当前的绘图位置移到point 指定的坐标处 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);

(3)成员函数Arc 画一个椭圆形的弧线,它是一个指定边界矩形内一个内切椭圆的一段。 BOOL Arc(int x1,int y1,int x2, int y2,int x3,int y3,int x4,int y4); (4)成员函数PolylBezier BOOL PolyBezier( const POINT *lpPoints,int nCount); 绘制由几个控制点所决定的多条Bezier曲线 一般给定的点为所画样条函数的3倍加1

void CMyDrawView::OnDraw(CDC *pDC) { CPen Pen; CPen *OldPen; Pen.CreatePen(PS_SOLID,4,RGB(0,0,0)); OldPen=pDC->SelectObject(&Pen); POINT points[7];

points[0].x=100; points[0].y=100; pDC->PolyBezier(points,7); pDC-> SelectObject(OldPen);}

2.画简单的闭合图形 BOOL Rectangle(int x1,int y1, int x2,int y2); (2) Ellipse BOOL Ellipse(int x1,int y1,

(3) Chord(一个椭圆和一条直线相交的图形) BOOL Chord(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); (4) Polygon BOOL Polygon( LPPOINT lpPoints, int nCount ); LpPoints是一个指向CPoint实例的POINT数组的指针 其中 nCount>2

void CMyTestView::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)); OldPen=pDC->SelectObject(&Pen); OldBrush=pDC->SelectObject(&Brush); pDC->Chord(120,20,420,450,100,0,400,200); pDC->SelectObject(OldPen); pDC->SelectObject(OldBrush);}

二..实例 void CMyTestView::OnDraw(CDC *pDC) {CPen Pen;CPen *OldPen; Pen.CreatePen(PS_SOLID,2,RGB(255,255,0)); CBrush Brush; CBrush *OldBrush; Brush.CreateHatchBrush(4,RGB(0,200,200)); OldPen= pDC->SelectObject(&Pen); OldBrush=pDC->SelectObject(&Brush);

pDC->RoundRect(100,100,300,300,30,60); pDC->SetBkColor(RGB(255,255,0)); pDC->SetBkMode(OPAQUE); pDC->Ellipse(300,100,500,200); pDC->Pie(300,100,600,400,300,400,600,400); pDC->SelectObject(OldPen); pDC->SelectObject(OldBrush); }

三.鼠标消息函数的应用:

void CMyLineView::OnLButtonDown (UINT nFlags, CPoint point) { m_Oldpoint=point;//保存光标的当前位置 m_Newpoint=point;//存放画线的起始位置 SetCapture(); //捕捉鼠标 m_pLMouseDown=TRUE;//表示鼠标为按下的状态 CRect rect; GetClientRect(&rect);//获得并保存用户区坐标

ClientToScreen(&rect); //用用户区坐标重新计算屏幕坐标 ClipCursor(&rect); //限制光标在用户区内 //默认处理,调用基类消息处理函数 CView::OnLButtonDown(nFlags, point); }

void CMyLineView::OnMouseMove (UINT nFlags, CPoint point) { SetCursor(m_HCursor); //设置自定义光标 if(m_pLMouseDown) {CClientDC dc(this); dc.SetROP2(R2_NOT); //设置绘图模式,以屏幕颜色的相反色绘图

//以重绘的方式擦除前一个OnMouseMove绘制的直线 dc.MoveTo(m_Newpoint); dc.LineTo(m_Oldpoint); dc.MoveTo(m_Newpoint); //重新位置到当前位置画一条直线 dc.LineTo(point); m_Oldpoint=point; //存放当前鼠标位置 } CView::OnMouseMove(nFlags, point);}

void CMyLineView::OnLButtonUp (UINT nFlags, CPoint point) {if(m_pLMouseDown) { m_pLMouseDown=FALSE;//标志鼠标释放 ReleaseCapture();//释放鼠标捕捉 ClipCursor(NULL);//使光标可以随意移动} CView::OnLButtonUp(nFlags, point);}