1. 第一个图形窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//第一个图形窗口 #include <graphics.h> int main() { //初始化为640*480大小 initgraph(640, 480); //等待用户按键 getch(); //关闭图形界面 closegraph(); return 0; } |
2. 设置窗口背景色:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//设置窗口背景色 #include <graphics.h> int main() { //初始化为640*480大小 initgraph(640, 480); //设置窗口背景色(纯白) setbkcolor(EGERGB(0xFF, 0xFF, 0xFF)); //等待用户按键 getch(); //设置窗口背景色(蓝色) setbkcolor(EGERGB(0x23, 0xAB, 0xF2)); //等待用户按键 getch(); //关闭图形界面 closegraph(); return 0; } |
3. 开场动画的开启:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//开场动画的开启 #include <graphics.h> int main() { //窗口初始化为640*480大小,开启EGE开场动画 initgraph(640, 480, INIT_WITHLOGO); //设置窗口背景色(蓝色) setbkcolor(EGERGB(0x23, 0xAB, 0xF2)); //等待用户按键 getch(); //关闭图形界面 closegraph(); return 0; } |
4. 开场动画的关闭:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//开场动画的关闭 #include <graphics.h> int main() { //窗口初始化为640*480大小,第三个参数设置为0,关闭EGE开场动画 initgraph(640, 480, 0); //设置窗口背景色(蓝色) setbkcolor(EGERGB(0x23, 0xAB, 0xF2)); //等待用户按键 getch(); //关闭图形界面 closegraph(); return 0; } |
5. 简单作图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//简单作图 #include <graphics.h> int main() { initgraph(640, 480); //设置窗口背景色为纯白色 setbkcolor(EGERGB(0xFF, 0xFF, 0xFF)); //设置线条颜色, GREEN是颜色常数 详细可以查ege.h对这个宏的定义的值 setcolor(GREEN); //画一条直线, 从(100, 100)到(400, 150) //特别注意的是端点, (100,100)这个点会被画上颜色, 但(400,150)不会画上颜色 //以下所有的矩形(或者说两点)描述方式, 总是前一个点取得到, 但后一个点取不到 line(100, 100, 400, 150); //设置线条颜色为蓝色 setcolor(EGERGB(0x23, 0x80, 0xF2)); //画一条直线, 从(600,50)到(80,400) line(600, 50, 80, 400); getch(); closegraph(); return 0; } |
6. 色彩的计算:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//色彩的计算 #include <graphics.h> int main() { initgraph(640, 480, 0); //设置窗口背景色(纯白) setbkcolor(EGERGB(0xFF, 0xFF, 0xFF)); //设置填充颜色, 使用EGERGB宏 //三个参数值的范围均为0 - 255 (0xFF),分别表示红色亮度,绿色亮度,蓝色亮度 //EGERGB(0x23,0x80,0xF2)为蓝色, 各分量值为红色R(0x23), 绿色G(0x80), 蓝色B(0xF2) setcolor(EGERGB(0x23, 0x80, 0xF2)); //画一个圆, 圆心在(200,200),半径100 circle(200,200,100); getch(); closegraph(); return 0; } |
7. 填充图形:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//填充图形 #include <graphics.h> int main() { initgraph(640, 480, 0); //设置窗口背景色(纯白) setbkcolor(EGERGB(0xFF, 0xFF, 0xFF)); //设置填充颜色,一般为图形内部颜色 setfillcolor(EGERGB(0xFF, 0x0, 0x80)); //画一个填充矩形, 范围为: x坐标从50-300, y坐标从100-200 bar(50, 100, 300, 200); //设置圆的填充颜色 setfillcolor(EGERGB(0x80, 0x0, 0xFF)); //画一个填充圆,圆心坐标:(460, 300), 半径: 100 fillellipse(460, 300, 100, 100); getch(); closegraph(); return 0; } |
8. 图形边界和填充
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//图形边界和填充 #include <graphics.h> int main() { initgraph(640, 480, 0); //设置绘图颜色,一般用于边界 setcolor(EGERGB(0xFF, 0xFF, 0x0)); //设置填充颜色,一般为图形内部颜色 setfillcolor(EGERGB(0xFF, 0x0, 0x80)); //画一带填充的椭圆 fillellipse(160, 120, 120, 80); //画一带填充的圆(圆为长短半轴相等的椭圆) fillellipse(480, 120, 100, 100); //画一个空心圆 circle(320, 340, 120); //再次设置填充颜色,用于决定下一函数填充的颜色 setfillcolor(EGERGB(0x80, 0x0, 0xFF)); //手工填充 //x,y是开始填充的坐标, 第三个参数是填充的边界颜色, 或者说以这个颜色作为边界 //如果这个边界不封闭,那么会导致整个屏幕都是这个颜色 floodfill(320, 340, EGERGB(0xFF, 0xFF, 0x0)); getch(); closegraph(); return 0; } |
9. 窗口背景色的替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//窗口背景色的替换 #include <graphics.h> int main() { initgraph(640, 480, 0); //第一次设置背景色 setbkcolor(EGERGB(0x7B, 0xD6, 0xA6)); //浅绿色 setcolor(EGERGB(0xFF, 0xAF, 0x00)); setfillcolor(EGERGB(0xFF, 0xAF, 0x00)); //画带填充的扇形 sector(200, 200, 45, 135, 150, 100); getch(); //按下一任意键后,再次改变背景色 setbkcolor(EGERGB(0x23, 0x80, 0xF2)); //浅蓝色 getch(); closegraph(); return 0; } //补充:另有setbkcolor_f函数: 它设置的是cleardevice函数所使用的颜色, //所以要等到cleardevice调用时,它的效果才会展现。 //当然, setbkcolor也会设置, 但同时也会立即把屏幕上的原背景色改变 |
10. 文字绘制与文字相关设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//文字绘制与文字相关设置 #include <graphics.h> int main() { initgraph(640, 480, 0); //先画一个矩形,以便于看出背景色的问题 setfillcolor(EGERGB(0x0, 0x80, 0x80)); bar(50, 50, 500, 200); //文字颜色 setcolor(EGERGB(0x0, 0xFF, 0x0)); //文字背景色(注意setbkcolor函数也会同时改变文字背景色) setfontbkcolor(EGERGB(0x80, 0x00, 0x80)); //设置字体,第一个参数是字体的高度(像素),第二个参数是字体的宽度,第二个参数如果为0,就使用默认比例值 //如果高度为12,即相当于小五号字,或者9磅字,实际的换算就自己完成吧 setfont(12, 0, "宋体"); //写文字,注意:outtextxy不支持\t \n这类格式化用的特殊字符,这类字符会被忽略 //要使用特殊格式化字符请用outtextrect outtextxy(100, 100, "Hello EGE Graphics"); outtextrect(100, 120, 200, 100, "\tHello EGE Graphics\nHere is the next line."); //设置文字背景填充方式为透明,默认为OPAQUE不透明 setbkmode(TRANSPARENT); outtextxy(100, 150, "Hello EGE Graphics, 中文也是支持的"); getch(); closegraph(); return 0; } |
11. 图形视口裁剪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//图形视口裁剪 #include <graphics.h> int main() { initgraph(640, 480, 0); //设置视口矩形区域为(200,100) - (330, 130) //最后一个参数为1表示出了这个区域的图形会被裁剪 //后面所绘画的图形的原点坐标(0,0),会映射到(200,100) setviewport(200, 100, 330, 130, 1); //画一些文字,注意文字会因区域被裁剪的效果 setcolor(EGERGB(0x0, 0xFF, 0x0)); setfontbkcolor(EGERGB(0x80, 0x00, 0x80)); setfont(18, 0, "宋体"); outtextxy(0, 0, "Hello EGE Graphics"); setbkmode(TRANSPARENT); outtextxy(0, 20, "Hello EGE Graphics"); //还原视口 setviewport(0, 0, getwidth(), getheight(), 1); outtextxy(0, 0, "Hello EGE Graphics"); getch(); closegraph(); return 0; } |
12. 使用IMAGE类抓图、保存图片以及绘图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
//使用IMAGE——抓图,绘画到IMAGE,IMAGE到屏幕 #include <graphics.h> //IMAGE对象相当于一个绘图板,而同时也可以作为图片画到其它IMAGE上 //它是一个非常灵活的对象,复杂的绘图都要借助IMAGE,以便更好地保存和输出图像 int main() { //声明一个img图片对象 PIMAGE img; initgraph(640, 480, 0); //先随便画一些东西 setcolor(EGERGB(0xFF, 0xFF, 0x0)); setfillcolor(EGERGB(0xFF, 0x0, 0x80)); fillellipse(50, 50, 50, 50); //用newimage在initgraph后创建这个对象。但记得要在不使用的时候delimage img = newimage(); //从屏幕上截取(0, 0) - (80, 60)这部分作为img,这个img大小为80*60 //img的尺寸会重设,大小由第三第四个参数决定 //注意,(0,0)这点会被包含在img里,但(80, 60)不包含 getimage(img, 0, 0, 80, 60); //对img设置填充色为绿色 setfillcolor(EGERGB(0x0, 0x70, 0x0), img); //对img画实心矩形 bar(40, 20, 70, 50, img); int x, y; //把img平铺在屏幕上,使用一个二重循环 for (y = 0; y < 8; ++y) { for (x = 0; x < 8; ++x) { //把img整个,画在指定的坐标上,左上角对齐这个坐标 putimage(x * 80, y * 60, img); } } getch(); delimage(img); closegraph(); return 0; } |
13. 使用IMAGE 缩放:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//使用IMAGE——拉伸 #include <graphics.h> int main() { PIMAGE img; initgraph(640, 480, 0); //先随便画一些东西 setcolor(EGERGB(0xFF, 0xFF, 0x0)); setfillcolor(EGERGB(0xFF, 0x0, 0x80)); fillellipse(50, 50, 50, 50); img = newimage(); getimage(img, 0, 0, 160, 120); int x, y; //把img平铺在屏幕上,使用一个二重循环 for (y = 0; y < 8; ++y) { for (x = 0; x < 8; ++x) { //把img整个,拉伸画在指定的矩形里 //需要指定目标矩形,源矩形 //源矩形参数不能忽略,否则会和其它非拉伸功能的贴图函数混淆 putimage(x * 80, y * 60, 80, 60, img, 0, 0, 160, 120); } } getch(); delimage(img); closegraph(); return 0; } |
14. 使用IMAGE 透明、半透明贴图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//使用IMAGE——透明,半透明 #include <graphics.h> int main() { PIMAGE img; initgraph(640, 480, 0); //先随便画一些东西 setcolor(EGERGB(0xFF, 0xFF, 0x0)); setfillcolor(EGERGB(0xFF, 0x0, 0x80)); fillellipse(50, 50, 50, 50); img = newimage(); getimage(img, 0, 0, 160, 120); //先画一个非黑色背景,以便于比较 setbkcolor(EGERGB(0x80, 0x80, 0x80)); cleardevice(); //四种贴图比较 putimage(0, 0, img); putimage_alphablend(NULL, img, 160, 0, 0x80); //半透明度为0x80 putimage_transparent(NULL, img, 0, 80, BLACK); //透明贴图,关键色为BLACK,源图为这个颜色的地方会被忽略 putimage_alphatransparent(NULL, img, 160, 80, BLACK, 0xA0); //同时使用透明和半透明 getch(); delimage(img); closegraph(); return 0; } |
15 用户交互 — 键盘事件与字符串输出(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//用户交互——键盘1 #include <graphics.h> //这个例子需要这个头文件 #include <stdio.h> int main() { initgraph(640, 480, 0); setfont(18, 0, "宋体"); outtextxy(0, 0, "please press any key"); int k = 0; for ( ; k != key_esc; ) // key_esc是ege定义的按键常数 { char str[32]; //等待用户按键,并把得到的按键给k //如果你不想等待,可以在调用getch之前,使用kbhit检测是否有按键按下 //如 if ( kbhit() ) k = getch(); k = getch(); //格式化输出为字符串,用于后面输出 sprintf(str, "%c %3d", k, k); cleardevice(); outtextxy(0, 0, str); } closegraph(); return 0; } |
用户交互 — 键盘事件与字符串输出(2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//用户交互——键盘2 #include <graphics.h> //这个例子需要这个头文件 #include <stdio.h> int main() { initgraph(640, 480, 0); setfont(18, 0, "宋体"); outtextxy(0, 0, "press any key"); key_msg k = {0}; for ( ; k.key != key_esc; ) // key_esc是ege定义的按键常数 { char str[32]; //等待用户按键,并把得到的按键给k //如果你不想等待,可以在调用getkey之前,使用kbmsg检测是否有按键按下 //如 if ( kbmsg() ) k = getkey(); k = getkey(); //格式化输出为字符串,用于后面输出 //msg参见key_msg_e, flag参见key_flag_e sprintf(str, "key= %c %3d %2x msg=%d flag=%d", k.key, k.key, k.key, k.msg, k.flags); cleardevice(); outtextxy(0, 0, str); } closegraph(); return 0; } |
16. 鼠标事件的处理
(1) 获取鼠标坐标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//用户交互——鼠标1 #include <graphics.h> #include <stdio.h> int main() { initgraph(640, 480, 0); setrendermode(RENDER_MANUAL); //不使用自动刷新,减少闪烁 setfont(18, 0, "宋体"); int k = 0; // 这个循环,is_run判断窗口是否还在,delay_fps是延时 // 后面讲动画的时候会详细讲解,现不要在此纠结 for ( ; is_run(); delay_fps(60)) { char str[32]; int x, y; //获取鼠标坐标,此函数不等待。若鼠标移出了窗口,那么坐标值不会更新 //特殊情况是,你按着鼠标键不放,拖出窗口,这样坐标值会依然更新 mousepos(&x, &y); //格式化输出为字符串,用于后面输出 sprintf(str, "%4d %4d", x, y); outtextxy(0, 0, str); } closegraph(); return 0; } |
(2) 获取鼠标点击、移动、滚轮等输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//用户交互——鼠标2 #include <graphics.h> #include <stdio.h> int main() { initgraph(640, 480, 0); setrendermode(RENDER_MANUAL); //不使用自动刷新,减少闪烁 setfont(18, 0, "宋体"); mouse_msg msg = {0}; for ( ; is_run(); delay_fps(60)) { //获取鼠标消息,此函数不会等待,运行后会立即返回 while (mousemsg()) { msg = getmouse(); } cleardevice(); xyprintf(0, 0, "x = %10d y = %10d", msg.x, msg.y); xyprintf(0, 20, "move = %d down = %d up = %d", (int)msg.is_move(), (int)msg.is_down(), (int)msg.is_up()); xyprintf(0, 40, "left = %d mid = %d right = %d", (int)msg.is_left(), (int)msg.is_mid(), (int)msg.is_right()); xyprintf(0, 60, "wheel = %d wheel rotate = %d", (int)msg.is_wheel(), msg.wheel); } closegraph(); return 0; } |
如果要使用系统的双击甚至三击事件,可以参看mouse_msg,选择对应所需项
17. 处理字符串输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//用户交互——字符串数据输入* (非重点) #include <graphics.h> #include <stdio.h> int main() { initgraph(640, 480, 0); //用来接收输入 char str[100]; //调用对话框函数 inputbox_getline("请输入", "你爱输入什么就输入什么(回车确认)", str, 100); //显示输入的内容 outtextxy(0, 0, str); getch(); closegraph(); return 0; } |
18. 文字对齐的设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//高级:更多的文字对齐方式设置 #include <graphics.h> int main() { initgraph(640, 480, 0); setfont(18, 0, "宋体"); //settextjustify(LEFT_TEXT, TOP_TEXT); //默认值 outtextxy(300, 0, "Hello Graphics"); settextjustify(RIGHT_TEXT, TOP_TEXT); outtextxy(300, 50, "Hello Graphics"); settextjustify(CENTER_TEXT, TOP_TEXT); outtextxy(300, 100, "Hello Graphics"); settextjustify(LEFT_TEXT, BOTTOM_TEXT); outtextxy(300, 50, "Hello Graphics"); getch(); closegraph(); return 0; } |
请复制文本框里面的代码运行试试看吧!
近期评论