VC绘图简易教程.docx

上传人:b****0 文档编号:8922510 上传时间:2023-05-16 格式:DOCX 页数:43 大小:31.53KB
下载 相关 举报
VC绘图简易教程.docx_第1页
第1页 / 共43页
VC绘图简易教程.docx_第2页
第2页 / 共43页
VC绘图简易教程.docx_第3页
第3页 / 共43页
VC绘图简易教程.docx_第4页
第4页 / 共43页
VC绘图简易教程.docx_第5页
第5页 / 共43页
VC绘图简易教程.docx_第6页
第6页 / 共43页
VC绘图简易教程.docx_第7页
第7页 / 共43页
VC绘图简易教程.docx_第8页
第8页 / 共43页
VC绘图简易教程.docx_第9页
第9页 / 共43页
VC绘图简易教程.docx_第10页
第10页 / 共43页
VC绘图简易教程.docx_第11页
第11页 / 共43页
VC绘图简易教程.docx_第12页
第12页 / 共43页
VC绘图简易教程.docx_第13页
第13页 / 共43页
VC绘图简易教程.docx_第14页
第14页 / 共43页
VC绘图简易教程.docx_第15页
第15页 / 共43页
VC绘图简易教程.docx_第16页
第16页 / 共43页
VC绘图简易教程.docx_第17页
第17页 / 共43页
VC绘图简易教程.docx_第18页
第18页 / 共43页
VC绘图简易教程.docx_第19页
第19页 / 共43页
VC绘图简易教程.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VC绘图简易教程.docx

《VC绘图简易教程.docx》由会员分享,可在线阅读,更多相关《VC绘图简易教程.docx(43页珍藏版)》请在冰点文库上搜索。

VC绘图简易教程.docx

VC绘图简易教程

 

VC

 

——刘小备整理

 

目录

 

前言3

1:

创建新项目4

2:

简单绘图,学习单步执行5

3:

熟悉更多的绘图语句7

4:

结合流程控制语句来绘图9

5:

数学知识在绘图中的运用11

6:

实现简单动画13

7:

捕获按键,实现动画的简单控制13

8:

用函数简化相同团的制作16

9:

绘图中的位运算17

10:

用鼠标控制绘图/游戏程序21

11:

随机函数23

12:

数组25

13:

getimage/putimage/IMAGE的用法29

14:

通过位运算实现颜色的分离与处理31

15:

窗体句柄(windows编程入门)33

16:

设备上下文句柄(windows编程入门2)34

 

前言

学习目标

能做简单的图形小游戏

讲解以简单实用为主,不要指望看了这几篇文章就能过耳机考试

锻炼编程思想

学习方式

自学为主

学习要求

多实践

使用平台

VC++6.0

请到下载最新的EasyX,并安装

XXeasyx吧发帖说明

1:

创建新项目

学会在VC里面创建项目,并写简单的程序

VC写程序要有项目的概念,一个项目可以有多个.cpp文件,多个项目构成一个工作区。

记住这两个英文单词:

Workspace:

工作区

Project:

项目

以下是创建项目的视频演示:

下载VC6_new_project.zip,打开看看,flash格式的。

看明白后,自己动手简历项目试试,并输入以下代码:

#include

Voidmain()

{

Printf(“HelloWorld!

”);

}

然后输入以下代码试试(无需理解代码含义)

#include

#include

Voidmain()

{

Initgraph(640,480);

Line(200,240,440,240);

Line(320,120,320,360);

Getch();

Closegraph();

}

执行后应该可以看到屏幕正中央有一个十字。

成功,classover。

2:

简单绘图,学习单步执行

【本期目标】

学会简单绘图,并学会简单调试

先看看上一课的代码,我加上了注释

#include//绘图库头文件,绘图语句需要

#include//控制台输入输出头文件,getch语句需要

Voidmain()

{

Initgraph(640,480);//出生640*480的绘图屏幕

Line(200,240,440,240);//画线(200,240)-(440,240)

Line(320,120,320,360);//画线(320,120)-(320,260)

Getch();//按任意键

Closegraph();//关闭绘图屏幕

}

解释一下

1.创建的绘图屏幕640*480,表示横向有640个店,纵向有480个点。

注意:

左上角是原点(0,0),也就是说,y轴(向下为正)和数学的y轴是相反。

2.getch实现按任意键功能,按任意键后,程序继续执行,否则,程序会立刻执行closegraph以至于看不到绘制的内容。

【作业】

用线条画出更多的图形,要求不少于10条直线。

【学习单步执行】

完成作业后(务必完成),开始试着单步执行刚才的程序,有用绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):

1.将VC取消最大化,并缩小窗口,能看到代码就行。

2.按下F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。

3.当箭头指向initgrach语句时,按F10,能看到窗口发生了变化。

4.将新的绘图窗口和VC并排放,相互需要有覆盖。

这不很重要,否则绘图内容将会被VC窗口覆盖

5.按F1-执行getch后,记得激活绘图窗口,并按任意键,否则程序就不会继续执行。

6.closegraph后,直接按F5执行全部升序的程序,结束。

单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行除了问题等等。

更详细的调试资料,请打开:

下载里面的VC6_how_to_debug.zip

该文档写的调试的东西比较多,看一下大概有个了解,以后都会用到(不过以后我就不再讲了)

【作业2】

仍然是写一个用直线绘制的图形,并熟悉调试过程。

注:

1.许多学校都忽略了调试部分,如果你不曾用过调试,请务必熟悉该过程。

2.tc没有调试,请使用有调试功能的IDE

3:

熟悉更多的绘图语句

【学习目标】

学会更多的绘图语句

【常用的绘图语句】

Line(x1,y1,x2,y2);//画直线(x1,y1)-(x2,y2),都是整形

Cirele(x,y,r)//画圆,圆心(x,y),半径为r

Putplixel(x,y,c)//画点(x,y),颜色c

还有狠多,如画椭圆、圆弧、矩形,多边形等,请参考绘图帮助文件,第一课的绘图库的下载里面有。

【设置颜色】

Setcolor(c)//设置绘图颜色,如setcolor(RED)设置为红色等

常用的颜色常量可以用:

BLACK黑DARKGRAY深灰

BLUE蓝LIGHTBLUE亮蓝

GREEN绿LIGHTGREEN亮绿

CYAN青LIGHTCYAN亮青

RED红LIGHTRED亮红

MAGENTA紫LIGHTMAGENTA亮紫

BROWN棕YELLOW黄

LIGHTGRAY浅灰WHITE白

【配出更多的颜色】

颜色除了前面写的16种以外,还可以自由配色,格式:

RGB(r,g,b)

r/g/b分别代表红色、绿色、蓝色,范围都是0~255

例如,RGB(255,0,0),表示纯红色。

红色和绿色配成黄色,因此RGB(255,255,0),表示黄色。

嫌调色麻烦可以用画笔里面的调色试试,调好了以后直接将数值抄过来就行。

例如,画两条红色浓度为200的直线,可以写:

Setcolor(RGB(200,0,0))

Line(100,100,200,100);

Line(100,120,200,120);

【用数字表示颜色】

除了用RGB(r,g,b)方式外,还可以用16进制表示颜色,格式:

0xrrggbb

例如setcolor(0xff0000)和setcolor(RGB(255,0,0))是等效的

【延时语句】

这个很简单Sleep(n)就可以表示n毫秒的延时,例如延时3秒,可以用Sleep(3000);

【作业】

1.简单看一下绘图的帮助文件,了解更多的绘图语句

2.绘制更丰富的图形内容,不低于20行。

3.将延时语句适当的插入上个作业的代码中,看看执行效果。

注:

绘图语句不需要记住,用的时候翻翻手册就行。

4:

结合流程控制语句来绘图

【学习目标】

熟练使用循环、判断语句

【熟悉for语句】

这步需自学,看看自己手边的书,是怎样讲for语句的,简单看看就行

【范例】

例如,画10跳直线的代码

#include

#include

Voidmain()

{

Initgraph(640,480);

Fro(inti=100;i<200;i+=10)

Line(100,y,300,y)

Getch();

Closegraph();

}

换一下循环的范围和间隔,看看效果

还可以用来画渐变色,例如

#include

#include

Voidmain()

{

Initgraph(640,480);

For(inti=0;i<256;i++)

{

Setcolor(RGB(0,0,i));

Line(100,y,300,y);

}

}

【熟悉if语句】

这步需自学,看看自己手边的书,是怎样讲for语句的,简单看看就行

配合if语句,实现红色、蓝色交替画线:

#include

#include

Voidmain()

{

Initgraph(640,480);

For(inti=100;i<200;i+=10)

{

If(y/10%2==1)

Setcolor(RGB(255,0,0));

Else

Setcolor(RGB(0,00,255));

Line(100,i,300,i);

}

Getch();

Closegraph();

}

【作业】

1.画围棋棋盘

2.画中国象棋的棋盘

3.画国际象棋的棋盘,看手册找到颜色填充语句,实现国企象棋棋盘区块的填充

4.自学while语句

学到这里,已经可以画出很多东西了,把自己想象中的团绘制以下吧。

5:

数学知识在绘图中的运用

【学习目标】

理解数学的重要性

1.最简单的,来个全屏的渐变色吧,是上一课的扩展,就是需要将0~255的颜色和0~479的y轴对应起来:

c表示颜色,范围0~255,y表示y轴,范围0~479

于是:

C/255=y/479;

C=y/479*255=y*255/479(先算惩罚再算出发可以提高精度)

看代码:

#include

#include

Voidmain()

{

Initgraph(640,480);

Intc;

For(inty=0;y<480;y++)

{

C=y*255/479;

Setcolor(RGB(0,0,c));

Line(0,y,639,y);

}

Getch();

Closegraph();

}

试试效果吧。

2.画一个圆形的渐变色

首先,我们要用到画圆的基本公式:

X*x+y*y=r*r

让弧度从0~2*3.14,然后需要根据弧度和半径算出(x,y)

用pi表示圆周率

用r表示半径

用a表示弧度

用c表示颜色

于是

X=r*cos(a);

Y=r*sin(a);

C=a*255/(2*pi)

看看代码:

#include

#include

#include

Voidmain()

{

Initgraph(640,480);

Intc;

Doublea;

Intx,y,r=200;

For(a=0;a

{

X=(int)(r*cos(a)+320+0.5);

Y=(int)(r*sin(a)+240+0.5);

C=(int)(a*255/(2*pi)+0.5);

Setcolor(RGB(c,0,0));

Line(320,240,x,y);

}

Getch();

Closegraph();

}

【作业】

这次没什么作业,只是理解一下数学的重要性而已。

如果读者还在念书,请重视数学。

6:

实现简单动画

所谓动画,其实是连续显示一系列图形而已。

结合程序上,我们需要以下几个步骤:

1.绘制图像

2.延时

3.擦掉图像

循环以上即可实现动画。

举一个例子,我们实现一条直线从上往下移动:

#include

#include

Voidmain()

{

Initgraph(640,480);

For(inty=0;y<480;y++)

{

Setcolor(GREEN);//绘制绿色直线

Line(0,y,639,y);

Seloop(10);//延时

Setcolor(BLACK);//绘制黑色直线,即擦掉之前的绿线

Line(0,y,639,y);

}

Closegraph();

}

也就是说,移动的间距越小、延时短,动画就会越细腻,但当画面教复杂时,会带来画面的闪烁(怎样消除闪烁是以后的话题)

【作业】

绘制一个沿45度移动的球,碰到窗口边界后反弹。

7:

捕获按键,实现动画的简单控制

最常用的一个捕获按键的函数:

getch()

前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键:

charc=getch();

然后再判断即可。

不过程序执行到getch()是会阻塞的,知道用户有按键才能继续执行。

可游戏中总不能因为等待按键而停止游戏执行吧?

所以,要有一个函数,判断是否有用户按键:

kbhit()这个函数返回当前是否有用户按键,如果有,再用getch()获取即可,这样是不会阻塞的。

即:

Charc;

If(kbhit())

C=getch();

举一个简单的例子,如果有按键,就输出相关按键。

否则,输出“。

”。

每隔100毫秒输出一次。

按esc退出。

注:

esc的ASCII码是27.

完整代码如下:

#include

#Include

#include

Voidmain()

{

Charc=0;

While(c!

=27)

{

If(kbhit())

C=getch();

Else

C=‘.’;

Printf(“%c”,c);

Sleep(100);

}

}

结合上一课简单动画,就可以做出来靠按键移动的图形了吧,看一下代码,实现as控制圆的左右移动:

#include

#include

Voidmain()

{

Initgraph(640,480);

Intx=320;

//画初始图形

Setcolor(YELLOW);

Setfillstyle(GREEN);

Fillellipse(x,240,20,20);

Charc;

While(c!

=27)//获取按键

{

C=getch();

//先擦出上次显示的旧图形

Setcolor(BLACK);

Setfillstyle(BLACK);

Fillellipse(x,240,20,20);

//根据输入,计算新的坐标

Switch(c)

{

Case‘a’:

X-=2;break;

case‘d’:

x+=2;break;

}

//绘制新的图形

Setcolor(YELLOW);

Setfillstyle(GREEN);

Fillellipse(x,240,20,20);

//延时

Sleep(10);

}

Closegraph();

}

【作业】

请继续完成这个程序,实现以下功能:

1.上下的控制

2.边界的检测

3.结合kbhit实现惯性移动(即按一下方向键,圆就会一直向这个方向移动)

8:

用函数简化相同团的制作

总目录:

(里面包括VC下graphics.h的配置方法)

实习中有许多类似的团,如果一一单独绘制,太麻烦。

于是,我们需要一个公用的绘制过程,就是函数。

例如,我们需要5个三角形,位于不同的位置。

我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程狠简单。

然后,在需要绘制的时候,调用这个函数即可。

可以通过参数来解决细微差异(图案的坐标、颜色等),例如:

#include

#include

//在坐标(x,y)处,用颜色c绘制三角形

Voidsanjiaoxing(intx,inty,intc)

{

Setcolor(c);//设置画线颜色

//画三角形的三条边

Line(x,y,x+50,y);

Line(x,y,xy,y+50);

Line(x+50,y,x,y+50);

}

Voidmain()

{

Initgraph(640,480);

Sanjiaoxing(100,100,RED);

Sanjiaoxing(120,160,BLUE);

Sanjiaoxing(140,220,GREEN);

Sanjiaoxing(160,120,BLUE);

Getch();

Closegraph();

}

再结合循环等控制条件,就能绘制更复杂漂亮的图案了。

试试运行下面程序,理解一下函数的用处。

#include

#include

Voidsanjiaoxing(intx,inty,intc)

{

Setcolor(c);//设置画线颜色

//画三角形的三条边

Line(x,y,x+10,y);

Line(x,y,xy,y+10);

Line(x+10,y,x,y+10);

}

Voidmain()

{

Initgraph(640,480);

For(intx=10;x<640;x+=10)

For(inty=0;y<480;y+=10)

Sanjiaoxing(x,y,RGB(X*255/640,Y*255/480,0));

Getch();

Closegraph();

}

【作业】

1.绘制Windows自带游戏“扫雷”的初始界面。

9:

绘图中的位运算

位运算和位图有什么关系?

先举个例子来个感性认识:

使用XOR运算可以实现擦除图形后不破坏背景,这种时钟程序绘制表针是很有用的,稍后我们会给出这样的例子。

【位运算的运算法则】

位运算主要分4种:

NOT、ANT、OR、XOR

位运算的运算对象是二进制数(十进制要转换为二进制,计算机会自动转换)。

运算法则如下:

1.NOT

表示去翻,将二进制位的1变0,、0变1。

C语言用符号~表示

如:

二进制:

~1101==0010

用十进制表示就是:

~13==2

2.AND

表示“并且”,只有两数的对应二进制位都为1,结果的二进制才为1;否则,结果的二进制位为0.

C语言用符号&表示。

如:

二进制:

1101&0110==0100

用十进制表示就是13^&6=4

3.OR

表示“或者”,两数对应二进制位只要有一个是1,结果的二进制位就是1:

否则,结果的二进制位为0.

C语言用符号|表示

如:

二进制:

0101|0110==0111

用十进制表示就是:

5|6=7

4.XOR

表示“异或”,两数的对应二进制位不同,结果的二进制位为1:

相同,结果的二进制位0.

C语言用符号^表示。

如:

二进制:

0101^1110==1011

以上只是简单介绍一下,详细的还是轻大家看课本上的讲解。

【位运算的应用】

位运算的应用很多,例如ADN或OR在获取和设置标志位时经常使用。

更多的,以后大家会逐渐遇到,暂时先记下有这么回事。

这里着重说下XOR运算,它有一个重要的特效:

(a^b)^b=a;

也就是说,a^b之后可能是某些其他数字,但只要再^b一下,就又变成了a

一些简单的加密就用的XOR这个特效。

至于绘图,加入a是背景图案,b是将要绘制的团,只要用XOR方式绘图,连晖两次,那么背景是不变的。

【演示】

我们来一个简单的XOR运算演示

#include

#include

Voidmain

{

Initgraph(640,480);

Setlinestyle(PS_SOLID,NULL,10);//设置线宽为10

Rectangle(100,100,200,200);//画一个矩形,当背景。

Setwritemode(R2_XORPEN);//设置XOR绘图模式

Setcolor(RED)

Line(50,0,200,300);//画线

Getch();

Line(50,0,200,300)//画线(XOR方式重复画线会回复背景图案)

Getch();

Closegraph();

}

运行一下,看到第一次画线后,矩形与直线相交的部分,颜色变成了青色,青色就是白色和红色XOR的值。

当再次以红色画线时,青色部分就消失了,还原为完整的白色矩形框

【完整的范例】

来一个相对完整的范例吧,就是钟表程序,三个表针用的都是XOR方式绘制,请大家运行体会一下XOR的作用:

#include

#include

#include

VoidDraw(inthour,intminute,intsecond)

{

Doublea_hour,a_min,a_sec;//时、分、秒针的弧度值

Intx_hour,y_hour,x_min,y_min,x_sec,y_sec;//时分秒针的末端位置

//计算时分秒针的弧度值

a_sec=second*2*PI/60;

a_min=minute*2*PI/60+a_sec/60;

a_hour=hour*2*PI/12+a_min/12;

//计算时分秒针的末端位置

X_sec=320+(int)(120*sin(a_sec));

Y_sec=240–(int)(120*cos(a_sec));

X_min=320+(int)(120*sin(a_min));

Y_min=240–(int)(120*cos(a_min));

X_hour=320+(int)(120*sin(a_hour));

Y_hour=240–(int)(120*cos(a_hour));

//画时针

Setlinestyle(PS_SDLID,NULL,10);

Setcolor(WHITE);

Line(320,240,x_hour,y_hour);

//画分针

Setlinestyle(PS_SOLID,NULL,6);

Setcolor(LIGHTGRAY);

Line(320,240,x_min,y_min);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2