图解在VC里使用graphics.h绘图(类似TC)

1 www.easyx.cn 下载 EasyX 库

我下的2014;解压后如下图;

2 根据自己的VC 版本进行安装

3 在控制台画一个圆

#include <graphics.h> // 引用图形库
#include <conio.h>
void main()
{
     initgraph(640, 480); // 初始化绘图窗口
     circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100
     getch(); // 按任意键继续
     closegraph(); // 关闭图形界面
}

4 在控制台画一个方块

#include <graphics.h>
#include <conio.h>

#define PI 3.14159265

void main()
{
	// 创建大小为 800 * 600 的绘图窗口
	initgraph(400, 300);

	// 设置原点 (0, 0) 为屏幕中央(Y轴默认向下为正)
	setorigin(200, 150);

	// 使用藏青色填充背景
	setbkcolor(0x7c5731);
	cleardevice();

	// 设置绘图样式
	setlinecolor(WHITE);							// 设置线条颜色为白色
	setlinestyle(PS_SOLID | PS_ENDCAP_FLAT, 10);	// 设置线条样式为宽度 10 的实线,端点是平的
	setfillcolor(0x24c097);							// 设置填充颜色为绿色

	// 画方块
	fillroundrect(-75, -111, 75, 39, 36, 36);

	// 按任意键退出
	_getch();
	closegraph();
}

5 星空

这是来自easyx网站上的一个范例;

// 程序名称:星空
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后更新:2009-2-22
//
#include <graphics.h>
#include <time.h>
#include <conio.h>

#define MAXSTAR 200	// 星星总数

struct STAR
{
	double x;
	int y;
	double step;
	int color;
};

STAR star[MAXSTAR];

// 初始化星星
void InitStar(int i)
{
	star[i].x = 0;
	star[i].y = rand() % 480;
	star[i].step = (rand() % 5000) / 1000.0 + 1;
	star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5);	// 速度越快,颜色越亮
	star[i].color = RGB(star[i].color, star[i].color, star[i].color);
}

// 移动星星
void MoveStar(int i)
{
	// 擦掉原来的星星
	putpixel((int)star[i].x, star[i].y, 0);

	// 计算新位置
	star[i].x += star[i].step;
	if (star[i].x > 640)	InitStar(i);

	// 画新星星
	putpixel((int)star[i].x, star[i].y, star[i].color);
}

// 主函数
void main()
{
	srand((unsigned)time(NULL)); // 随机种子
	initgraph(640, 480);	// 打开图形窗口

	// 初始化所有星星
	for(int i=0; i<MAXSTAR; i++)
	{
		InitStar(i);
		star[i].x = rand() % 640;
	}

	// 绘制星空,按任意键退出
	while(!kbhit())
	{
		for(int i=0; i<MAXSTAR; i++)
			MoveStar(i);
		Sleep(20);
	}

	closegraph();    // 关闭图形窗口
}

6 屏幕截图

这也是来自easyx网站的例子,演示了graphics.h也可在Win32程序中使用;

/////////////////////////////////////////////////////////
// 程序名称:实现桌面截图
// 编译环境:Visual C++ 6.0 / 2010,EasyX 20130117(beta)
// 作    者:yangw80 <[email protected]>
// 最后修改:2013-1-29
// 项目类型:Win32 Application
//
#include <graphics.h>

// 抓取桌面图像到 *pimg 对象中
void CaptureDesktop(IMAGE *pimg)
{
	// 通过 Windows API 获取桌面的宽高
	int w = GetSystemMetrics(SM_CXSCREEN) / 2;
	int h = GetSystemMetrics(SM_CYSCREEN) / 2;

	// 调整 pimg 的大小
	Resize(pimg, w, h);

	// 获取桌面 DC
	HDC srcDC = GetDC(NULL);
	// 获取 IMAGE 对象的 DC
	HDC dstDC = GetImageHDC(pimg);

	// 在两个 DC 之间执行图像拷贝,将桌面抓图拷贝到 IMAGE 对象里面
	BitBlt(dstDC, 0, 0, w, h, srcDC, 0, 0, SRCCOPY);
}

// 主函数
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// 定义 IMAGE 对象
	IMAGE img;

	// 调用抓取桌面图像的函数
	CaptureDesktop(&img);

	// 创建绘图窗口
	initgraph(500, 300);

	// 在窗口中显示 IMAGE 中保存的桌面图像
	putimage(0, 0, &img);

	// 按 ESC 键退出
	while(!(GetAsyncKeyState(VK_ESCAPE) & 0x8000))
		Sleep(20);

	closegraph();
	return 0;
}

7 做一个字符动画

做一个字符从控制台窗口顶端往下落的动画;

#include <graphics.h>
#include <conio.h>
#include <time.h>

// 主函数
void main()
{
	initgraph(400, 300);		// 初始化屏幕为 640x480

	srand(time(NULL));			// 设置随机种子
	setfont(16, 0, "Arial");	// 设置字母的字体和大小
	setfillstyle(BLACK);		// 设置清除字母的填充区域颜色

	char target;				// 目标字母
	int x, y;					// 字母的位置

	// 主循环
	while(true)
	{
		target = 65 + rand() % 26;		// 产生任意大写字母
		x = rand() % 380;				// 产生任意下落位置
		for (y=0; y<280; y++)
		{
			setcolor(GREEN);			// 设置字母的颜色
			outtextxy(x, y, target);	// 显示字母

			// 延时,并清除字母
			Sleep(10);
			bar(x, y, x + 16, y + 16);
		}
	}

	// 关闭图形界面
	closegraph();
}

还有些问题,下落的字母会拖着一个白色尾巴;下次再搞;

8 改进

在 VC 中创建代码请直接使用默认的 .cpp 扩展名,不要加 .c 扩展名。

并不是所有的 TC 绘图函数都能支持,许多函数在 EasyX 库中都变得更强大了,比如颜色,过去 TC 只能支持 16 色,现在可以支持上千万种颜色。还有字体,可以使用 Windows 下安装的任何字体,等等。参考帮助。

上述工程下载

http://pan.baidu.com/s/1o8qyWLs

文件名

easyxdemo

时间: 2024-11-07 17:15:44

图解在VC里使用graphics.h绘图(类似TC)的相关文章

使用graphics.h来绘制图形

|   版权声明:本文为博主原创文章,未经博主允许不得转载. graphics.h是TC里面的图形库,如果要用的话应该用TC来编译.分为:像素函数.直线和线型函数.多边形函数.填充函数等.然而在我们使用的编译器vc6.0和visual studio 2013编译器中是不支持graphics.h图形库的,当然vc6.0和visual studio 2013编译器也自带了微软的图形库API(也叫Windows API,它的函数基本上包含在了windows.h的头文件中),那么如果我们要在vc6.0和

VC GDI双缓冲机制绘图防屏幕闪烁实现步骤

在OnDraw(CDC* pDC) 中添加如下代码 CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上) MemBit

VMware虚拟机 VC里报告虚拟磁盘丢失的解决方案

中石化某省分公司的信息管理平台,几台VMware虚拟机--ESX SERVER共享一台IBM DS4100存储,大约有40~50组虚拟机,占用1.8TB空间,正常工作中,vc里报告虚拟磁盘丢失,ssh到ESX中执行fdisk -l查看磁盘,发现storage已经没有分区表了.重启所有设备后,ESX SERVER均无法连接到DS4100所在的STORAGE. 我们接到案例后仔细询问当时的管理员但是可用信息不多,但是他们无意间提到曾经在这个存储网络里连接过一台windows 2003服务器,具体情况

媒体层:Core Graphics(绘图)

1.简介: 基于C的API,用于绘图, 当使用UIKit来创建按钮.图像或者其他UIView的子类时,UIKit会使用Core Graphics来将这些元素绘制在屏幕上 可创建直线.路径.渐变.文字.图像等内容 CGContextRef:图像上下文.画布 从UIView的子类中获取它的当前上下文UIGraphicsGetCurrentContext(),然后重写drawRect方法 绘图动作是顺序的,每个动作都是在前一个动作的基础上面完成的 只要iOS任务一个视图需要被刷新或者重绘drawRec

c中头文件在cpp文件里引用和.h文件引用的思考

我们在编敲代码中头文件是常常使用的. 可是头文件是应该包括在.H文件里还是在.cpp文件里.在这个其中有什么样去差别呢. 假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a.h中. 在a.h文件有使用了b.中定义的类型type1数据m_type,相同b.cpp的头文件一些变量也声明在b.h中. 此时我们当然能够在a.cpp中包括b.h 也能够在a.h中.这样都是可行的.由于我们编译的时候会会将b.h包括进来. 而.h文件是不參与编译的.然后我们继续深入. 假如我们将b.

Graphics View绘图架构(二)

Graphics View结构的主要类包括:视图类QGraphicsView.场景类QGraphicsScene.和各种图形项类(基类都是 QGraphicsItem) 1. QGraphicsView 用于观察一个场景的物理窗口 场景小于视图,整个场景在视图中可见:当场景大于视图时,试图自动提供卷滚条 QGraphicsView的视口坐标等于显示设备的物理坐标,但是可以对QGraphicsView的坐标进行平移.旋转和缩放 设置接口函数如下: 场景 void     setScene()  /

VC 鼠标滚轮事件控制绘图的问题

问题描述: 在MFC中绘制数据曲线,通过鼠标滚轮来进行放大缩小操作.在使用滚轮事件时,发现如果数据量较大,会出现卡顿. 解决方案: 鼠标滚轮事件会进行重复绘图,考虑在鼠标滚轮结束之后再重绘: 在鼠标滚轮事件中更新:重绘标识,新坐标轴值,此时时间: 利用OnTimer函数,在重绘标识为真时,判断当前时间与滚轮事件时间的差,超过预定值(比如500ms)就重绘,并置重绘标识为假. 方案待验证.

VC里判断系统是不是64bit

不过,理论上来说,也可以用一个int的大小作为参考,判断是32位还是64位.sizeof(int) == 4 //32位系统.sizeof(int) == 8 //64位系统. 也可以使用函数如下: BOOL IsWow64() { typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL bIsWow64 = FALSE; fnIsWow64Pro

VC里的编码问题

void CAlignSentenceDoc::NormalizeCH(wstring& delim) { for(int i = 0; i < delim.size(); i++) { if(delim[i] == L'.') delim[i] = L'.'; if(delim[i] == L',') delim[i] = L','; } } delim是wstring,因此里面的每个字符都是宽的,因此要用L宏做转化. 但是我试过代码写成如下 wchar_t t = '.';//这里t是0