目录
1.星空
效果如下:
#include<graphics.h>
#include<time.h>
#include<conio.h>
#define MAXSTAR 200 //设置最大星星数目
struct STAR
{
double x;
int y;
double step;
int color;
//DWORD 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;//*(rand()/(RAND_MAX+0.0)-0.3);
if (star[i].x > 640)
InitStar(i);
//画心得星星
putpixel((int)star[i].x,star[i].y, star[i].color);
}
int main()
{
srand((unsigned)time(NULL));
initgraph(640, 480);
//初始化所有星星
for (int i = 0; i < MAXSTAR; i++)
{
InitStar(i);
star[i].x = rand() % 480;
}
//绘制星空
while (!_kbhit())
{
for (int i = 0; i < MAXSTAR; i++)
{
MoveStar(i);
}
Sleep(100);
}
closegraph();
//return 0;
}
定义了一个星星的结构体,最大星星数目设置为200,颜色和移动位置则由随机数决定
2.彩虹
效果如下:
代码如下:
#include<graphics.h>
#include<conio.h>
#include<iostream>
int main()
{
//创建绘图窗口
initgraph(640, 480);
//画渐变的天空
float H = 190;
float S = 1; //饱和度
float L = 0.7f; //亮度
for (int y = 0; y < 480; y++)
{
L += 0.0005f;
setlinecolor(HSLtoRGB(H, S, L));
line(0, y, 639, y);
}
//画彩虹
H = 0;
S = 1;
L = 0.5f;
setlinestyle(PS_SOLID, 2); //设置线宽为2
for (int r = 400; r > 344; r--)
{
H += 5;
setlinecolor(HSLtoRGB(H, S, L));
circle(500, 480, r);
}
//按任意键退出
_getch();
//Sleep(20000);
closegraph();
}
主要是关于HSL颜色模式的使用,
HSL 又称 HLS。
HSL 的颜色模型如图所示:
H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,具有最纯的色光。
L 是英文 Lightness 的首字母,表示亮度,等于 0 时为黑色,等于 0.5 时是色彩最鲜明的状态,等于 1 时为白色。
3.鼠标绘图
效果如下:
代码:
#include<graphics.h>
#include<conio.h>
int main()
{
//初始化
initgraph(640, 480);
MOUSEMSG m; //定义鼠标消息
while (true)
{
//获取一条鼠标消息
m = GetMouseMsg();
switch (m.uMsg)
{
case WM_MOUSEMOVE:
//鼠标移动的时候画红色小红点
putpixel(m.x, m.y, RED);
break;
case WM_LBUTTONDOWN:
//如果点左键同事按下了Ctr键
if (m.mkCtrl)
//话题个大方框
rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
else
//画一个小方框
rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);
break;
case WM_RBUTTONUP:
return 0;
default:
break;
}
}
//关闭窗口
closegraph();
}
核心在于鼠标消息的捕捉和响应。EasyX的鼠标消息结构如下
struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
int x; // 当前鼠标 x 坐标(物理坐标)
int y; // 当前鼠标 y 坐标(物理坐标)
int wheel; // 鼠标滚轮滚动值
};
以上三个小程序转自:案例