easy X(C语言图形化界面)学习

  • 易错:
  • 头文件
    • 创建窗口
  • 图形填充
  • 文字创建
  • 输出图片
  • 鼠标消息函数(老版)
  • 鼠标操作(新版)
  • 键盘消息函数
    • getch()
  • 音乐播放
  • 修改窗口标题,弹出框框

易错:

1.文件为(.cpp)后缀

头文件

#include  // 包含图形库的头文件

创建窗口

# define _CRT_SECURE_NO_WARNINGS#include #include  // 包含图形库的头文件int main(){// 创建一个窗口大 小initgraph(640, 480);getchar(); // 保持窗口打开// 关闭窗口closegraph();return 0;}

运行结果如下:

第三个参数

//1 创建一个窗口initgraph(640, 480,SHOWCONSOLE); // 这里第三个参数是显示控制台//第三个参数,如果是NOCLOSE,窗口关闭键失效。NOMINIMIZE,窗口缩小键失效// 二者 NOCLOSE | NOMINIMIZE ,则全部失效

图形填充


画几个圆

# define _CRT_SECURE_NO_WARNINGS#include #include  // 包含图形库的头文件int main(){//1 创建一个窗口initgraph(640, 480);//设置背景颜色setbkcolor(WHITE);cleardevice();//清屏// 给圆填涂颜色setfillstyle(PS_SOLID,5);// 设置线条格式ps_solid 实线5个像素setfillcolor(YELLOW);// 设置填充颜色setlinecolor(BLUE);// 设置线条颜色//画个圆circle(50, 50, 50);fillcircle(50, 150, 50);solidcircle(50, 250, 50);getchar();//2 关闭窗口closegraph();return 0;}

文字创建


举例:

//绘制文字//设置颜色settextcolor(RED);//设置文字样式,大小,字体settextstyle(50, 0, "楷体");//设置背景模式tran sparent 透明setbkmode(TRANSPARENT);//设置颜色 RGBsettextcolor(RGB(0, 255, 13));//画板里的三原色数据outtextxy(50, 50, "打印字体咯~");

运行结果:

RGB画板的三原色数据

修改outtextxy函数,让其输出多个字符(字符串)

文字居中

//把文字居中setfillcolor(YELLOW);// 设置填充颜色setlinecolor(BLUE);// 设置线条颜色setbkmode(TRANSPARENT);fillrectangle(200, 50, 500, 100);//500-200=300 100-50=50settextcolor(RED);char arr[] = "居中好吧!!!";int width = 300 / 2 - textwidth(arr) / 2;int height = 50 / 2 - textheight(arr) / 2;outtextxy(width + 200, height + 50, arr);

运行结果:


输出图片


举例:
输出图片相对路径时,把文件放在vs对应的项目文件中

// 输出图片IMAGE img;// 定义一个(变量)对象// 加载图片// 相对路径:./表示当前文件下,../表示当前文件的上一级目录// 绝对路径:C:\Users\30438\Pictures\CSDN插图\MySQL.jpgloadimage(&img, "C:\\Users\\30438\\Pictures\\CSDN插图\\MySQL.jpg",250,250);// 若文件路径有空格 处理方法举例:\"12 easyX学习\" //250,250为照片设置高度,宽度//相对路径//loadimage(&img, "./MySQL.jpg");putimage(0, 0, &img);//前面坐标用变量也可以

运行结果为:

鼠标消息函数(老版)

举例:

//鼠标信息while (1)// 不断地处理事务,需要循环{if (MouseHit()){MOUSEMSG msg = GetMouseMsg();printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标// 消息分发switch (msg.uMsg){case WM_LBUTTONDOWN:outtextxy(400, 400, "鼠标左键按下");break;case WM_RBUTTONDOWN:outtextxy(400, 400, "鼠标右键按下");break;}}}

运行结果:

判断鼠标是否在以上矩形中,若在就输出其语句

// 文字居中setfillcolor(YELLOW);// 设置填充颜色setlinecolor(BLUE);// 设置线条颜色setbkmode(TRANSPARENT);fillrectangle(200, 50, 500, 100);//500-200=300 100-50=50settextcolor(RED);char arr[] = "居中好吧!!!";int width = 300 / 2 - textwidth(arr) / 2;int height = 50 / 2 - textheight(arr) / 2;outtextxy(width + 200, height + 50, arr);//鼠标信息while (1)// 不断地处理事务,需要循环{if (MouseHit()){MOUSEMSG msg = GetMouseMsg();//判断鼠标是否在上面的矩形中,若在就输出一句话,不过这个是重复一直输出//若放在wm_lbuttondown这种,就点击再输出if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 100){printf("鼠标就在这个矩形里了哦\n");}// 消息分发switch (msg.uMsg){case WM_LBUTTONDOWN:outtextxy(400, 400, "鼠标左键按下");printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标break;case WM_RBUTTONDOWN:outtextxy(400, 400, "鼠标右键按下");printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标break;}}}

运行结果:

鼠标操作(新版)

只是换了一个结构体,可以获取更多的信息(鼠标,按键等等等)

ExMessage msg;while (1)// 不断地处理事务,需要循环{if (peekmessage(&msg,EM_MOUSE)){// 消息分发switch (msg.message){case WM_LBUTTONDOWN:outtextxy(400, 400, "鼠标左键按下");if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 100){printf("鼠标就在这个矩形里了哦\n");}break;case WM_RBUTTONDOWN:outtextxy(400, 400, "鼠标右键按下");printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标break;}}}

运行结果:

键盘消息函数

非easyX函数

getch()

用到头文件 conio.h
堵塞函数,不输入一直在这里等

#include  // 使用_getch() 获取键位while (1)// 不断地处理事务,需要循环{char key = _getch();printf("%d,%c\n", key, key);switch (key){case 72://上键case 'w':// 这里是定义了上键为w ,当然也可以定义其他的键位case 'W':printf("上键\n");break;case 80://下键case 's':case 'S':printf("下键\n");break;case 75://左键case 'a':case 'A':printf("左键\n");break;case 77://右键case 'd':case 'D':printf("右键\n");break;}}

效果演示:

目前只是在控制台上操作

设置一个小球,对其进行键位控制

int x=0, y=0;//鼠标信息ExMessage msg;while (1)// 不断地处理事务,需要循环{// 创建一个小物体,进行移动cleardevice();//清屏,除去移动后留下的拖影setfillcolor(BLUE);fillcircle(x, y, 20);char key = _getch();printf("%d,%c\n", key, key);switch (key){case 72://上键case 'w':// 这里是定义了上键为w ,当然也可以定义其他的键位case 'W':y -= 5;printf("上键\n");break;case 80://下键case 's':case 'S':y += 5;printf("下键\n");break;case 75://左键case 'a':case 'A':x -= 5;printf("左键\n");break;case 77://右键case 'd':case 'D':x += 5;printf("右键\n");break;}}

效果演示:

在显示其他组件(图片什么的)的同时,完成小球移动,就是把其语句放在同一个while循环中,当然这样也会导致界面缓存闪屏

解决方法,可以创建一个缓冲区(双缓冲绘图)

开始:

int x = 0, y = 0;// 设置小球的初识位置while (1)// 不断地处理事务,需要循环{// 双缓冲绘图 ,需要放在绘图代码之前和之后BeginBatchDraw();//设置背景颜色(a,b)

结束:

// 创建一个小物体,进行移动setfillcolor(BLUE);fillcircle(x, y, 20);EndBatchDraw();char key = _getch();

完整代码如下:

# define _CRT_SECURE_NO_WARNINGS#include #include  // 包含图形库的头文件#include  // 使用_getch() 键位int main(){//1 创建一个窗口initgraph(640, 480,SHOWCONSOLE);// 这里第三个参数是显示控制台//第三个参数,如果是NOCLOSE,窗口关闭键失效。NOMINIMIZE,窗口缩小键失效,二者 | ,则全部失效int x = 0, y = 0;// 设置小球的初识位置while (1)// 不断地处理事务,需要循环{// 双缓冲绘图 ,需要放在绘图代码之前和之后BeginBatchDraw();//设置背景颜色(a,b)setbkcolor(WHITE);//acleardevice();//b 清屏// 输出图片IMAGE img;// 定义一个(变量)对象// 加载图片// 相对路径:./表示当前文件下,../表示当前文件的上一级目录// 绝对路径:C:\Users\30438\Pictures\CSDN插图\MySQL.jpgloadimage(&img, "C:\\Users\\30438\\Pictures\\CSDN插图\\MySQL.jpg", 250, 250);// 若文件路径有空格 处理方法举例:\"12 easyX学习\" //250,250为照片设置高度,宽度//相对路径//loadimage(&img, "./MySQL.jpg");putimage(0, 0, &img);//前面坐标用变量也可以//鼠标信息ExMessage msg;// 创建一个小物体,进行移动setfillcolor(BLUE);fillcircle(x, y, 20);EndBatchDraw();// 结束缓冲区char key = _getch();printf("%d,%c\n", key, key);switch (key){case 72://上键case 'w':// 这里是定义了上键为w ,当然也可以定义其他的键位case 'W':y -= 5;printf("上键\n");break;case 80://下键case 's':case 'S':y += 5;printf("下键\n");break;case 75://左键case 'a':case 'A':x -= 5;printf("左键\n");break;case 77://右键case 'd':case 'D':x += 5;printf("右键\n");break;}}getchar();//2 关闭窗口closegraph();return 0;}

音乐播放


这个只支持mp3,网易云的不行

# define _CRT_SECURE_NO_WARNINGS#include #include  // 包含图形库的头文件#include  // 使用_getch() 键位#include  // 包含多媒体设备接口头文件//必须在graphics头文件下方#pragma comment(lib,"winmm.lib")//加载静态库 // 这是预编译指令void BGM() // 播放音乐{// 打开音乐,播放音乐alias取别名 后面参数调音量等mciSendString("open 天后.mp3 alias BGM",0,0,0);//repeat 重复播放 pause 暂停close 关闭mciSendString("play BGM repeat", 0, 0, 0);}

repeat 重复播放 pause 暂停 close 关闭 resume 继续

修改窗口标题,弹出框框

void change(){// 获取窗口句柄HWND hnd = GetHWnd();// 设置窗口标题SetWindowText(hnd, "c语言plus");//弹出窗口,提示用户操作int isok=MessageBox(NULL, "干嘛?","提示标题",MB_OKCANCEL);// 这里是NULL,窗口和主窗口都可以拖动,// 若写变量hnd,则是强制小窗口的确认,主窗口一直弹出,且无法点击// 其返回值是Int型,可进行赋值判断if (isok == IDOK){printf("您点击了确认\n");// 在控制台输出}else if (IDCANCEL == isok){printf("您点击了取消\n");}}

把其操作写入change()函数内