目录
1.星空
2.彩虹
3.鼠标绘图
效果如下:
#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,颜色和移动位置则由随机数决定
效果如下:
代码如下:
#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 时为白色。
效果如下:
代码:
#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; // 鼠标滚轮滚动值 };
以上三个小程序转自:案例