-
2018-05-31 20:12:05#pragma comment(linker,"/SUBSYSTEM:Windows /ENTRY:mainCRTStartup")
#include <windows.h>
/* 使类名成为全局变量 */
TCHAR szClassName[ ] = TEXT("WindowsApp");
/* 这个函数由Windows内部函数DispatchMessage()调用 */
LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message) /* 处理信息 */
{
case WM_DESTROY:
PostQuitMessage (0); /* 发送WM_QUIT到消息队列 */
break;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps) ;
GetClientRect (hWnd, &rect) ;
DrawText (hdc, TEXT("Hello, Windows NT!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hWnd, &ps) ;
break ;
default: /* 不处理的消息 */
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}
/* 下面是主函数 */
int main ( void )
{
HINSTANCE hThisInstance = GetModuleHandle(NULL) ;
int nFunsterStil = SW_SHOW ;
HWND hWnd; /* 这是窗口的句柄 */
MSG messages;/* 应用程序的消息保存在这里 */
WNDCLASSEX wincl;/* 窗口类的数据结构 */
/* 窗口结构 */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;/* 这个函数由Windows操作系统调用 */
wincl.style = CS_DBLCLKS; /* 获取双击指令 */
wincl.cbSize = sizeof (WNDCLASSEX);
/* 使用默认图标和鼠标指针 */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* 没有菜单 */
wincl.cbClsExtra = 0;/* 窗口类后面没有多余的字节 */
wincl.cbWndExtra = 0;/* 结构或者窗口实例 */
/* 使用窗口的默认颜色作为窗口的背景色 */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* 注册窗口类。如果注册失败,那么就退出程序 */
if (!RegisterClassEx (&wincl))
return 0;
/* 窗口类已被注册。创建它的程序 */
hWnd = CreateWindowEx (
0,
szClassName, /* 类名 */
TEXT("Windows App"), /* 窗口标题栏的文字 */
WS_OVERLAPPEDWINDOW, /* 默认窗口 */
CW_USEDEFAULT, /* 窗口左上角的位置 */
CW_USEDEFAULT, /* 窗口右下角的位置 */
300, /* 窗口宽度(以“像素”位单位) */
300, /* 窗口高度(以“像素”位单位) */
HWND_DESKTOP,/* 窗口是桌面的子窗口 */
NULL,/* 该窗口无菜单 */
hThisInstance, /* 程序实例的句柄 */
NULL /* 没有窗口创建的数据 */
);
/* 显示窗口 */
ShowWindow (hWnd, nFunsterStil);
/* 重绘窗口 */
UpdateWindow(hWnd);
/* 运行消息循环。循环到GetMessage()函数返回0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* 把虚拟信息翻译成字符信息 */
TranslateMessage(&messages);
/* 发送信息到窗口过程 */
DispatchMessage(&messages);
}
/* 返回PostQuitMessage()函数的返回值 */
return messages.wParam;
}更多相关内容 -
c语言图形化界面贪吃蛇
2019-07-30 15:43:16一个不到两百行的图形化界面版贪吃蛇小游戏,只是实现了基本核心的蛇吃食物长大玩法,可以继续添加炸弹、菜单栏等内容,适合c语言初学者拿来做课设练手 -
C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)
2020-02-15 09:42:37本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。0.引言
\qquad 看了CSDN上很多关于C程序图形化界面的介绍,有的代码繁琐难解,不方便调试修改;有的不够详细。本文提供的代码简单、易于移植、容易理解,望急需使用C语言制作图形化界面的朋友采纳。
\qquad 对easyx尚不熟悉的朋友不需要担心,我敢打包票它只需10分钟就可以上手,而它为你节省的时间可能是3个小时甚至更多。关于easyx的简单应用请参考一篇我以前写的关于C程序可视化的博文。
→【C语言实现动画控制】←
\qquad 本文的讲解是循序渐进的,读者应该重点关注每个步骤的理解,两步之间代码的变化,即可完全理解本文。1.素材准备
- easyx的下载链接如下:(本文使用的版本是2014冬至版)
https://www.easyx.cn/downloads/
注:使用easyx需要注意它兼容的编译器(下载的帮助文件会写),不同的easyx兼容的编译器不同,但总是和visual C++6兼容(和字符编码有关),本文以visual C++6编译器为例书写代码。 - easyx的最新英文帮助文档链接(下载2014冬至版会自带中文帮助文档):
https://docs.easyx.cn/en-us/intro - 如果你成功下载了easyx2014冬至版,那么解压后把头文件(easyx.h和graphic.h)和lib文件(amd64)分别放在VC文件夹默认的include文件夹和lib文件夹中。右键你的VC程序,选择打开文件所在位置,然后找到MFC文件夹,友情提供两个文件夹的位置截图。
- 建议编译的C文件以cpp后缀保存。
2.编程
2.1.创建你的界面
\qquad 创建一个480×360的窗口,我们需要使用initgraph()函数,闲言少叙,让我们直接看一段代码:
#include <graphics.h> // 引用图形库头文件 #include <conio.h> #include <stdio.h> #include <windows.h> //用到了定时函数sleep() #include <math.h> int main() { int i; short win_width,win_height;//定义窗口的宽度和高度 win_width = 480;win_height = 360; initgraph(win_width,win_height);//初始化窗口(黑屏) for(i=0;i<256;i+=5) { setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色 cleardevice();//清屏(取决于背景色) Sleep(15);//延时15ms } closegraph();//关闭绘图界面 }
\qquad 这段代码很容易理解,运行这段程序,就会出现逐渐明亮的屏幕。因为不断刷新背景色为 R G B ( i , i , i ) RGB(i,i,i) RGB(i,i,i)。C语言中的颜色使用十六进制表示的,RGB函数可以将0~255范围内的三个整数三原色转换成这个十六进制。
\qquad cleardevice()函数用于清屏,是界面内所有元素都被清空,一般只会在初始化出现。
\qquad Sleep()是毫秒级延迟,当然界面变亮时间不一定是准确的15ms×255/5=0.765s,因为其他语句还需要执行时间。
\qquad closegraph():关闭绘图界面。注意,如果初始化了绘图界面但没有在主函数结束前关闭它,可能会引发一些莫名其妙的错误!所以这个函数一定要有!2.2.创建按钮
\qquad 我们尝试在界面创建几个按钮,按钮需要的操作是绘制矩形和打印文字。虽然看着简单,但是里面还是有点学问,为了方便大家理解,还是先放上代码和注释。
#include <graphics.h> // 引用图形库头文件 #include <conio.h> #include <stdio.h> #include <windows.h> //用到了定时函数sleep() #include <math.h> int r1[]={30,20,130,60};//输入按钮的矩形参数 int r2[]={170,20,220,60};//运行按钮的矩形参数 int r3[]={260,20,310,60};//退出按钮的矩形参数 int main() { int i; short win_width,win_height;//定义窗口的宽度和高度 win_width = 480;win_height = 360; initgraph(win_width,win_height);//初始化窗口(黑屏) for(i=0;i<256;i+=5) { setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色 cleardevice();//清屏(取决于背景色) Sleep(15);//延时15ms } RECT R1={r1[0],r1[1],r1[2],r1[3]};//矩形指针R1 RECT R2={r2[0],r2[1],r2[2],r2[3]};//矩形指针R2 RECT R3={r3[0],r3[1],r3[2],r3[3]};//矩形指针R3 LOGFONT f;//字体样式指针 gettextstyle(&f); //获取字体样式 _tcscpy(f.lfFaceName,_T("宋体")); //设置字体为宋体 f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式 settextcolor(BLACK); //BLACK在graphic.h头文件里面被定义为黑色的颜色常量 drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示 drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示 drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示 setlinecolor(BLACK); rectangle(r1[0],r1[1],r1[2],r1[3]); rectangle(r2[0],r2[1],r2[2],r2[3]); rectangle(r3[0],r3[1],r3[2],r3[3]); system("pause");//暂停,为了显示 closegraph(); return 0; }
\qquad 这里需要特别介绍的是矩形指针 p R e c t pRect pRect,它使用句柄RECT定义,并且不可以中途再次赋值。之所以要设置矩形指针了为了打印字体的时候以矩形为边界自动填充。它的格式是RECT r={X1,Y1,X2,Y2}
,X1和X2是矩形的左边和右边的横坐标,Y1和Y2是矩形的上边和下边的纵坐标,这一点和rectangle()绘制空心矩形函数参数排列一致。后面的DT_CENTER | DT_VCENTER | DT_SINGLELINE
就是描述填充格式的常量。使用drawtext书写文字不需要再计算文字的坐标和设置大小,会方便很多。
\qquad LOGFONT是字体样式指针,通过gettextstyle()函数来获取当前的字体类型,再通过settextstyle()函数加以设置。这里只修改了字体的名称和显示质量,还可以修改斜体、下划线等属性,更详细的部分请参考帮助文档。2.3.鼠标操作
2.3.1.单击特效
\qquad 作为一个图形化界面的C程序,鼠标操作总不能少吧。在讲解程序前先别着急,简单为大家科普一下鼠标事件:
\qquad 鼠标是输入设备,只要发生以下的事件,就会暂存在鼠标消息列表中,我们的操作系统就会依次响应列表中的鼠标消息事件,常用的鼠标事件如下:- WM_MOUSEMOVE——鼠标移动
- WM_MOUSEWHEEL——鼠标滚轮滚动
- WM_LBUTTONDOWN——鼠标左键按下
- WM_LBUTTONUP——鼠标左键弹起
- WM_LBUTTONDBLCLK——鼠标左键双击
- WM_RBUTTONDOWN——鼠标右键按下
- WM_RBUTTONUP——鼠标右键弹起
- WM_RBUTTONDBLCLK——鼠标左键双击
- WM_MBUTTONDOWN——鼠标中键按下
- WM_MBUTTONUP——鼠标中键弹起
- WM_MBUTTONDBLCLK——鼠标中键双击
\qquad 我们只需要根据不断获取鼠标消息队列的消息并根据消息依次进行响应即可。
\qquad 相信大家已经迫不及待了,那么请看下面一个简单的程序。
#include <graphics.h> // 引用图形库头文件 #include <conio.h> #include <stdio.h> #include <windows.h> //用到了定时函数sleep() #include <math.h> int r1[]={30,20,130,60};//输入按钮的矩形参数 int r2[]={170,20,220,60};//运行按钮的矩形参数 int r3[]={260,20,310,60};//退出按钮的矩形参数 int main() { int i; short win_width,win_height;//定义窗口的宽度和高度 win_width = 480;win_height = 360; initgraph(win_width,win_height);//初始化窗口(黑屏) for(i=0;i<256;i+=5) { setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色 cleardevice();//清屏(取决于背景色) Sleep(15);//延时15ms } RECT R1={r1[0],r1[1],r1[2],r1[3]};//按钮1的矩形区域 RECT R2={r2[0],r2[1],r2[2],r2[3]};//按钮2的矩形区域 RECT R3={r3[0],r3[1],r3[2],r3[3]};//按钮2的矩形区域 LOGFONT f; gettextstyle(&f); //获取字体样式 _tcscpy(f.lfFaceName,_T("宋体")); //设置字体为宋体 f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式 settextcolor(BLACK); //BLACK在graphic.h头文件里面被定义为黑色的颜色常量 drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示 drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示 drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示 setlinecolor(BLACK); rectangle(r1[0],r1[1],r1[2],r1[3]); rectangle(r2[0],r2[1],r2[2],r2[3]); rectangle(r3[0],r3[1],r3[2],r3[3]); MOUSEMSG m;//鼠标指针 setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色) while(true) { m = GetMouseMsg();//获取一条鼠标消息 if(m.uMsg==WM_LBUTTONDOWN) { for(i=0;i<=10;i++) { setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色 circle(m.x,m.y,2*i); Sleep(25);//停顿2ms circle(m.x,m.y,2*i);//抹去刚刚画的圆 } FlushMouseMsgBuff();//清空鼠标消息缓存区 } } system("pause");//暂停,为了显示 closegraph(); return 0; }
\qquad 每点击鼠标以下,应该可以看到鼠标点击处有一个逐渐扩大并淡出的圆(截图无法清晰,在画面的中右侧),当循环体内Sleep的视觉大于20ms后视觉效果很强。
\qquad 每响应一次鼠标左键单击事件,都会调用一次清空鼠标消息缓存区的函数FlushMouseMsgBuff()
,如果没有这个函数会怎么样呢?如果我们快速连续地单击鼠标左键N次,那么特效就会播放N次,如果特效播放速度比单击的速度慢,那么即使你停下来了,程序仍然会接着播放单击特效,因为你的左键单击仍然在鼠标的消息队列m.uMsg
中的鼠标消息没有响应完。
\qquad 这里需要解释的是一个二元光栅设置函数setrop2()
,二元光栅是混合背景色和当前颜色的模式。我们这里采用的方式是同或(NOT XOR)的方式,若底色为白色(1),则当前颜色不变;若底色是黑色(0),则当前颜色反色。为什么需要采用这种方式呢?因为我们在第二次抹去原来的圆的时候不能采用白色,否则如果背景色原来就为黑(比如按钮和文字),就也会被抹成白色。而背景色与任意一个颜色同或两次都为其本身,即可起到还原背景色的效果。这里的背景色与cleardevice()前面那个背景色不同,这里的是指执行这一条绘画指令之前屏幕上的颜色。2.3.2.光标感应
\qquad 我们希望鼠标移到按钮上时按钮会有所变化,移开按钮时又会回到原样。这里我们采用一种简单的填充颜色的方法,就是按钮变色。我们需要解决一个问题就是按钮变色了但是按钮的文字不能被覆盖,那么我们还是需要使用到二元光栅。只是我们这次的模式改成了同或。
\qquad 为了方便起见,存放三个按钮的数组我们合并为了一个二维数组,在鼠标事件中更容易使用和分配任务。#include <graphics.h> // 引用图形库头文件 #include <conio.h> #include <stdio.h> #include <windows.h> //用到了定时函数sleep() #include <math.h> int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组 int button_judge(int x,int y) { if(x>r[0][0] && x<r[0][2] && y>r[0][1] && y<r[0][3])return 1; if(x>r[1][0] && x<r[1][2] && y>r[1][1] && y<r[1][3])return 2; if(x>r[2][0] && x<r[2][2] && y>r[2][1] && y<r[2][3])return 3; return 0; } int main() { int i,event=0; short win_width,win_height;//定义窗口的宽度和高度 win_width = 480;win_height = 360; initgraph(win_width,win_height);//初始化窗口(黑屏) for(i=0;i<256;i+=5) { setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色 cleardevice();//清屏(取决于背景色) Sleep(15);//延时15ms } RECT R1={r[0][0],r[0][1],r[0][2],r[0][3]}; RECT R2={r[1][0],r[1][1],r[1][2],r[1][3]}; RECT R3={r[2][0],r[2][1],r[2][2],r[2][3]}; LOGFONT f; gettextstyle(&f); //获取字体样式 _tcscpy(f.lfFaceName,_T("宋体")); //设置字体为宋体 f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式 settextcolor(BLACK); //BLACK在graphic.h头文件里面被定义为黑色的颜色常量 drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示 drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示 drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示 setlinecolor(BLACK); rectangle(r[0][0],r[0][1],r[0][2],r[0][3]); rectangle(r[1][0],r[1][1],r[1][2],r[1][3]); rectangle(r[2][0],r[2][1],r[2][2],r[2][3]); MOUSEMSG m;//鼠标指针 while(true) { m = GetMouseMsg();//获取一条鼠标消息 switch(m.uMsg) { case WM_MOUSEMOVE: setrop2(R2_XORPEN); setlinecolor(LIGHTCYAN);//线条颜色为亮青色 setlinestyle(PS_SOLID, 3);//设置画线样式为实现,10磅 setfillcolor(WHITE);//填充颜色为白色 if(button_judge(m.x,m.y)!=0) { if(event != button_judge(m.x,m.y)) { event = button_judge(m.x,m.y);//记录这一次触发的按钮 fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//有框填充矩形(X1,Y1,X2,Y2) } } else { if(event != 0)//上次触发的按钮未被修正为原来的颜色 { fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//两次同或为原来颜色 event = 0; } } break; case WM_LBUTTONDOWN: setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色) for(i=0;i<=10;i++) { setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色 circle(m.x,m.y,2*i); Sleep(30);//停顿30ms circle(m.x,m.y,2*i);//抹去刚刚画的圆 } break; FlushMouseMsgBuff();//清空鼠标消息缓存区 } } system("pause");//暂停,为了显示 return 0; }
\qquad 这里我们运用了两次设置二元光栅的函数setrop2,在鼠标的移动条件内(case MOUSEMOVE
),我们使用的是屏幕颜色和当前颜色异或,这是为什么呢?因为fillrectangle()
函数是画一个有框填充矩形,我们让这个有框填充矩形和原按钮的一样大。由于线条的颜色为亮青色,填充颜色为白色(1),白色的填充颜色和屏幕颜色异或,取的是屏幕颜色的反色。按钮的边框是黑色(0),它与亮青色异或,则会保留原来的亮青色。
\qquad 与同或一样,异或两次等于没有执行操作,所以可以还原到原屏幕画布的颜色。2.3.3.进度条
\qquad 既然涉及到进度条了,那么就应该涉及到正式程序了,这里我不想涉及太多的专业知识影响大家理解,但又不能让程序运行得太快以至于看不出进度条的变化,所以我设计了一个简单的弹性球轨迹作图程序。
\qquad 假设球半径为R,初始高度为 h 0 h_0 h0,初速度为0(自由落体),非弹性碰撞时能量损失率为 α \alpha α。计算部分子函数如下:int simulation() { float dt = 0.01;//仿真间隔10ms long int N = (long int)(sim_t/dt);//迭代次数 float *h=(float*)calloc(N,sizeof(float));//高度 float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向) long int i;//迭代变量 for(i=1;i<N;i++) { if(h[i-1]>R)//未发生碰撞 { v[i]=v[i-1]-9.8*dt;//速度计算 } else//发生碰撞,动能损失alpha,速度损失alpha的开方 { v[i]=-sqrt(alpha)*v[i-1]; } } free(h); free(v);//释放内存 return 0; }
\qquad 当然,我们还需要绘图网格,定义绘图网格的函数如下:
void init_figure() { int i; setrop2(R2_COPYPEN);//当前颜色 setlinecolor(BLACK); setlinestyle(PS_SOLID);//实线 rectangle(30,100,420,330);//外框线 setlinestyle(PS_DOT);//点线 for(i=30+39;i<420;i+=39) { line(i,100,i,330);//竖直辅助线 } for(i=100+23;i<330;i+=23) { line(30,i,420,i);//水平辅助线 } }
\qquad 注意,我们使用了rectangle()空心矩形函数绘制网格外框架,使用了line函数依次画出了辅助线。
\qquad 我们现在的目标就是将h的坐标转换到网格上去,绘制出球心的轨迹,这样似乎并不复杂,只需要对simulation()函数稍加修改即可。
int simulation() { float dt = 0.01;//仿真间隔10ms float dy = 230/h0;//单位纵坐标 long int N = (long int)(sim_t/dt);//迭代次数 float *h=(float*)calloc(N,sizeof(float));//高度 float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向) long int i;//迭代变量 float process_duty;//进度 init_figure();//初始化图像网格 setrop2(R2_COPYPEN);//当前颜色 //计算步骤 h[0]=h0;v[0]=0; for(i=1;i<N;i++) { if(h[i-1]>R)//未发生碰撞 { v[i]=v[i-1]-9.8*dt;//速度计算 } else//发生碰撞,动能损失alpha,速度损失alpha的开方 { v[i]=-sqrt(alpha)*v[i-1]; } h[i]=h[i-1]+v[i]*dt;//高度计算 process_duty = (i+1)/(float)(N); putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);//画点putpixel(X,Y,color*) Sleep(dt*1000);//延时 } free(h); free(v); return 0; }
\qquad 这里的新函数
putpixel(X,Y,color*)
是画像素点的函数,适合刻画不连续或不规则的移动轨迹。
\qquad 现在我们只剩下了刻画进度条的函数了,进度条的刷新很明显是应该放在for循环里面的,那么我们采用什么进度条的格式呢?进度条可以有圆形、扇形、长条连续型、长条不连续型等多种,我们这里采用的是环形进度条,将进度数字显示在环中心。请看以下的对simulation()函数改进的代码://仿真运行 int simulation() { char t[3];//百分值的字符 char *out_text;//带百分号的百分字符 float dt = 0.01;//仿真间隔10ms float dy = 230/h0;//单位纵坐标 long int N = (long int)(sim_t/dt);//迭代次数 float *h=(float*)calloc(N,sizeof(float));//高度 float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向) long int i;//迭代变量 float process_duty;//进度 RECT r={370,35,400,65};//百分值显示区域的矩形指针 init_figure();//初始化图像网格 setrop2(R2_COPYPEN);//当前颜色 setfillcolor(WHITE); setlinecolor(WHITE); fillrectangle(354,19,411,81);//覆盖原进度条区域 setlinestyle(PS_NULL);//无线条 setbkmode(TRANSPARENT);//设置文字填充背景为透明 //计算步骤 h[0]=h0;v[0]=0; BeginBatchDraw();//开始缓存区 for(i=1;i<N;i++) { if(h[i-1]>R)//未发生碰撞 { v[i]=v[i-1]-9.8*dt;//速度计算 } else//发生碰撞,动能损失alpha,速度损失alpha的开方 { v[i]=-sqrt(alpha)*v[i-1]; } setfillcolor(WHITE); setlinecolor(WHITE); fillrectangle(354,19,416,81);//覆盖原进度条区域 h[i]=h[i-1]+v[i]*dt;//高度计算 process_duty = (i+1)/(float)(N); setlinestyle(PS_SOLID); putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED); setfillcolor(BLUE); setlinestyle(PS_NULL); fillpie(355,20,415,80,0,process_duty*2*PI); setfillcolor(WHITE); fillcircle(385,50,20); sprintf(t,"%d",(int)(process_duty*100.0));//整型转换为字符串 out_text = strcat(t,"%");//添加一个百分号 drawtext(out_text,&r,DT_CENTER | DT_VCENTER | DT_SINGLELINE); Sleep(dt*1000); FlushBatchDraw();//刷新缓存区 } EndBatchDraw();//结束缓存区 free(h); free(v); return 0; }
\qquad 这里我们需要多加载一个头文件<string.h>。
\qquad 首先需要计算进度条的坐标,把环形进度条区域用白色矩形刷新掉,环形进度条需要一个扇形和圆形的组合,扇形的角度是0~360°。这里我们用到了fillpie(X1,Y1,X2,Y2,start_angle,end_angle)
,前四个参数为椭圆扇形的外接矩形坐标,后两个参数分别为起始角和终止角(弧度制)。每过一次迭代都重新计算终止角(起始角始终为0),即可起到扇形角度逐渐增长的效果,再用一个白色填充圆覆盖中心部分即可变成环形进度条。
\qquadFlushBatchDraw()
函数是刷新缓存区的函数,与BeginBatchDraw()
和EndBatchDraw()
一起使用,如果我们绘图之后不想立即显示,而想批量绘图最后一起刷新画板,用缓存区的方法再合适不过了。3.完整代码及效果
#include <graphics.h> // 引用图形库头文件 #include <conio.h> #include <stdio.h> #include <windows.h> //用到了定时函数sleep() #include <math.h> #include <string.h> #define PI 3.1416 int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组 float alpha,R,h0,sim_t;//碰撞时的能量损失率,球的半径、初始高度、仿真时间 //按钮判断函数 int button_judge(int x,int y) { if(x>r[0][0] && x<r[0][2] && y>r[0][1] && y<r[0][3])return 1; if(x>r[1][0] && x<r[1][2] && y>r[1][1] && y<r[1][3])return 2; if(x>r[2][0] && x<r[2][2] && y>r[2][1] && y<r[2][3])return 3; return 0; } //初始化图像 void init_figure() { int i; setrop2(R2_COPYPEN);//当前颜色 setlinecolor(BLACK); setlinestyle(PS_SOLID);//实线 rectangle(30,100,420,330);//外框线 setlinestyle(PS_DOT);//点线 for(i=30+39;i<420;i+=39) { line(i,100,i,330);//竖直辅助线 } for(i=100+23;i<330;i+=23) { line(30,i,420,i);//水平辅助线 } } //仿真运行 int simulation() { char t[3];//百分值的字符 char *out_text; float dt = 0.01;//仿真间隔10ms float dy = 230/h0;//单位纵坐标 long int N = (long int)(sim_t/dt);//迭代次数 float *h=(float*)calloc(N,sizeof(float));//高度 float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向) long int i;//迭代变量 float process_duty;//进度 RECT r={370,35,400,65};//百分值显示区域的矩形指针 init_figure();//初始化图像网格 setrop2(R2_COPYPEN);//当前颜色 setfillcolor(WHITE); setlinecolor(WHITE); fillrectangle(354,19,411,81);//覆盖原进度条区域 setlinestyle(PS_NULL);//无线条 setbkmode(TRANSPARENT);//设置文字填充背景为透明 //计算步骤 h[0]=h0;v[0]=0; BeginBatchDraw();//开始缓存区 for(i=1;i<N;i++) { if(h[i-1]>R)//未发生碰撞 { v[i]=v[i-1]-9.8*dt;//速度计算 } else//发生碰撞,动能损失alpha,速度损失alpha的开方 { v[i]=-sqrt(alpha)*v[i-1]; } setfillcolor(WHITE); setlinecolor(WHITE); fillrectangle(354,19,416,81);//覆盖原进度条区域 h[i]=h[i-1]+v[i]*dt;//高度计算 process_duty = (i+1)/(float)(N); setlinestyle(PS_SOLID); putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED); setfillcolor(BLUE); setlinestyle(PS_NULL); fillpie(355,20,415,80,0,process_duty*2*PI); setfillcolor(WHITE); fillcircle(385,50,20); sprintf(t,"%d",(int)(process_duty*100.0));//整型转换为字符串 out_text = strcat(t,"%");//添加一个百分号 drawtext(out_text,&r,DT_CENTER | DT_VCENTER | DT_SINGLELINE); Sleep(dt*1000); FlushBatchDraw();//刷新缓存区 } EndBatchDraw();//结束缓存区 free(h); free(v); return 0; } int main() { int i,event=0; char s[30];//输入字符串变量 short win_width,win_height;//定义窗口的宽度和高度 win_width = 480;win_height = 360; initgraph(win_width,win_height);//初始化窗口(黑屏) for(i=0;i<256;i+=5) { setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色 cleardevice();//清屏(取决于背景色) Sleep(30);//延时30ms } RECT R1={r[0][0],r[0][1],r[0][2],r[0][3]}; RECT R2={r[1][0],r[1][1],r[1][2],r[1][3]}; RECT R3={r[2][0],r[2][1],r[2][2],r[2][3]}; LOGFONT f;//字体样式指针 gettextstyle(&f); //获取字体样式 _tcscpy(f.lfFaceName,_T("宋体")); //设置字体为宋体 f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 settextstyle(&f); // 设置字体样式 settextcolor(BLACK); //BLACK在graphic.h头文件里面被定义为黑色的颜色常量 drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示 drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示 drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示 setlinecolor(BLACK); rectangle(r[0][0],r[0][1],r[0][2],r[0][3]); rectangle(r[1][0],r[1][1],r[1][2],r[1][3]); rectangle(r[2][0],r[2][1],r[2][2],r[2][3]); MOUSEMSG m;//鼠标指针 while(true) { m = GetMouseMsg();//获取一条鼠标消息 switch(m.uMsg) { case WM_MOUSEMOVE: setrop2(R2_XORPEN); setlinecolor(LIGHTCYAN);//线条颜色为亮青色 setlinestyle(PS_SOLID, 3);//设置画线样式为实现,10磅 setfillcolor(WHITE);//填充颜色为白色 if(button_judge(m.x,m.y)!=0) { if(event != button_judge(m.x,m.y)) { event = button_judge(m.x,m.y);//记录这一次触发的按钮 fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//有框填充矩形(X1,Y1,X2,Y2) } } else { if(event!=0)//上次触发的按钮未被修正为原来的颜色 { fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//两次同或为原来颜色 event = 0; } } break; case WM_LBUTTONDOWN: setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色) for(i=0;i<=10;i++) { setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色 circle(m.x,m.y,2*i); Sleep(20);//停顿30ms circle(m.x,m.y,2*i);//抹去刚刚画的圆 } //按照按钮判断左键单击后的操作 switch(button_judge(m.x,m.y)) { //复原按钮原型 case 1: InputBox(s,30,"请输入碰撞时的能量损失率、球的半径、初始高度、仿真时间"); sscanf(s,"%f%f%f%f",&alpha,&R,&h0,&sim_t);//将输入字符串依次扫描到全局变量里面 FlushMouseMsgBuffer();//单击事件后清空鼠标消息 break; case 2: simulation();//仿真运行 FlushMouseMsgBuffer();//单击事件后清空鼠标消息 break; case 3: closegraph();//关闭绘图环境 exit(0);//正常退出 default: FlushMouseMsgBuffer();//单击事件后清空鼠标消息 //printf("\r\n(%d,%d)",m.x,m.y);//打印鼠标坐标,方便调试时确定区域 break; } break; } } return 0; }
希望本文对您有帮助,谢谢阅读。 - easyx的下载链接如下:(本文使用的版本是2014冬至版)
-
2014-04-02-cpp-C语言图形化界面相关函数
2020-10-28 23:45:46C语言图形化界面相关函数 基本 初始化图形界面 int gdriver; int gmode; gdriver = DETECT; initgraph(&gdriver,&gmode,"" ); 清空屏幕 cleardevice (); 退出图形化界面 closegraph (); 前景色/背景色 ...C语言图形化界面相关函数
基本
初始化图形界面
int gdriver; int gmode; gdriver = DETECT; initgraph(&gdriver,&gmode,"");
清空屏幕
cleardevice();
退出图形化界面
closegraph();
前景色/背景色
画图之前未设定调用颜色,则背景色默认为黑色,前景色默认为白色
setbkcolor(WHITE); // 背景色 setcolor(4); // 前景色
颜色定义
颜色代码 字符常量 颜色 用途 0 BLACK 黑 前景,背景 1 BLUE 蓝 前景,背景 2 GREEN 绿 前景,背景 3 CYAN 青 前景,背景 4 RED 红 前景,背景 5 MAGENTA 洋红 前景,背景 6 BROWN 棕 前景,背景 7 LIGHTGRAY 淡灰 前景 8 DARKGRAY 深灰 前景 9 LIGHTBLUE 淡蓝 前景 10 LIGHTGREEN 淡绿 前景 11 LIGHTCYAN 淡青 前景 12 LIGHTRED 淡红 前景 13 LIGHTMAGENTA 淡洋红 前景 14 YELLOW 黄 前景 15 WHITE 白 前景 128 BLINK 闪烁 前景
基本画图函数
比较常用的
void far line (int x1, int y1, int x2, int y2) // 画线 void far setlinestyle (int linestyle, unsigned upattern, int thickness); // 设置线的形状 linestyle 设置线的形状, 0 实线 1 点线 2 中心线 3 点画线 4 用户定义线 thickness 设置线的宽度 1 一个像素宽(默认值) 3 三个像素宽 当linestyle取值为 4时,还必须设置upattern参数。此时upattern的16位二进制数 每一位代表一个像素,该位为1则画像素点,为0则不画。 void far circle (int x, int y, int radius); // 画圆圈 void far rectangle (int x1, int y1, int x2, int y2); // 画矩形
比较少用的
void far putpixel (int x, int y, int color) // 画点 void far linerel (int dx, int dy); // 从当前光标 (x,y)画线到点 (x + dx , y + dy) void far arc (int x, int y, int stangle, int endangle, int radius); // 画弧线 void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius) // 画椭型 void far drawpoly (int numpoints , int far * polypoints) // 画多边形,顶点数为 numpoints 各顶点坐标由 polypoints 给出
没测出效果的
// 自己测试的时候下面四个得到的值都是0 int far getmaxx (void) int far getmaxy (void) int far getx (void) int far gety (void) // 自己测试的时候下面两个没看到效果 void far moveto (int x, int y) 光标移动到 (x,y)点,在移动过程中画点 void far moverel (int dx, int dy); 光标从 (x,y)移动到 (x+dx, y+dy)的位置,移动中不画店
小例子
#include "stdio.h" #include "conio.h" #include "graphics.h" void main () { int gdriver; int gmode; int arw[16] = {200, 102, 300, 102, 300, 107, 330, 100, 300, 93, 300, 98, 200, 98, 200, 102}; gdriver = DETECT; initgraph(&gdriver,&gmode,"" ); setbkcolor (WHITE); cleardevice (); setcolor (BLUE); circle (320, 240, 98); setlinestyle (0, 0, 3); setcolor (GREEN); rectangle (220, 140, 420, 340); setcolor (GREEN); setlinestyle (4,0xaaaa, 3); line (220, 240, 420, 240); line (320, 140, 320, 340); getch(); closegraph (); return 0; }
填充函数
void far setfillstyle (int pattern, int color ) // 设置填充模式以及颜色。 符号常量 数值 含义 略 0 以背景色颜色填充 1 以实线填充 2 以直线填充 3 以斜线填充(阴影线) 4 以粗斜线填充(粗阴影线) 5 以粗反斜线填充(~) 6 以反斜线填充(~) 7 以直方网格填充 8 以斜网格填充 9 以间隔点填充 10 以大间隔点填充 11 以小间隔点填充 12 以用户自定义样图填充 void far floodfill (int x, int y, int border); // 填充
// 做五子棋的时候, 我这样设置红方的棋子。 setfillstyle(1, RED); floodfill(XiaoYuanX1+10,XiaoYuanY1+10,7);
图形界面下输出文本
void far outtext (char far *textstring); // 当前位置输出字符串 void far outtext (int x, int y, far *textstring ) // 在 (x,y) 位置输出字符串 outtextxy(230,30,"player use Red chess!"); int sprintf (char * str, char *format, 变量列表) char s[30]; int i = 400; sprintf (s, "your score is %d", i );
void far settextjustify (int horiz, int vert); // 定位输出字符串时的对齐方式, 参数名 符号常量 值 含义 horiz LEFT_TEXT 0 左对齐 CENTER_TEXT 1 中心对齐 RIGHT_TEXT 2 右对齐 vert BOTTON
void far settextstyle (int font, int direction, int charsize); // 设置字体 font 字型 direction 输出方向 charsize 字符大小 font 符号 数值 含义 DEFAULT_FONT 0 8*8点阵字(默认) TRIPLEX_FONT 1 三重笔画字体 SMALL_FONT 2 小号画笔字体 SANSSERIF_FONT 3 无衬线画笔字体 GOTHIC_FONT 4 黑体笔画笔 direction HORIZ_DIR 0 从左到右 VERT_DIR 1 从底到顶 charsize 1 8*8 2 16*16 3 24*24 ''' 10 80*80 USER_CHAR_SIZE=0 用户定义字符大小
例子-五子棋
-
Easy c语言图形界面 插件
2018-11-16 19:46:56Easyx c语言开发图形界面的插件 安装可直接用 -
C语言的窗口式图形界面案例
2018-12-28 11:06:49C语言的窗口式图形界面 C语言的窗口式图形界面设计——自带汉字环境的应用软件编程 由刘路放著 -
c语言图形化界面开发 (一)
2018-02-01 18:00:14既然Android逆向是杂学,而且c语言又是我的本命学科,那么学习一下还是可以的,但是肯定不会占很多的时间,也就是一心三用,然后进行一个简单的博客说明。 2.其他系列文章 现在有三个系列 1.java基础...0x00 前言
1.说明
既然Android逆向是杂学,而且c语言又是我的本命学科,那么学习一下还是可以的,但是肯定不会占很多的时间,也就是一心三用,然后进行一个简单的博客说明。
3.环境
vs 2013
4.推荐
推荐先去学习c语言基础
0x01 第一个窗口程序
1.创建
1.1 新建
1.2 向导点击下一步
1.3 应用程序设置
不勾选安全周期,选择空项目
1.4 新建文件
添加-新建项-cpp文件
2.第一个项目
2.1 框架搭好
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { return 0; }
2.2 添加内容
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, "LOVE猪猪", "LOVE", MB_OK); return 0; }
我们添加了一行代码。这个代码就是显示我们框框的代码。但是会因为字符问题出错,所以我们要进行修改。
2.3 修改
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"), MB_OK); return 0; }
使用text把我们需要输入的字符包裹起来就可以了。TEXT是一个宏,当字符串中有中文的时候用TEXT包裹起来。
2.4 编译运行
2.5 代码分析
MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"), MB_OK);
这是我们的主要代码 ,这里有四个参数,第一个参数传入NULL,第二个参数就是显示内容,第三个参数就是标题,第四个参数就是样式。
0x02 其他样式的窗口
1.MB_OKCANCEL
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"),MB_OKCANCEL); return 0; }
2.MB_ABORTRETRYIGNORE
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"),MB_ABORTRETRYIGNORE); return 0; }
3.MB_ICONERROR
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"),MB_ICONERROR); return 0; }
4.组合使用
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"),MB_OKCANCEL|MB_ICONQUESTION); return 0; }
5.结束语
还有很多种组合方式,可以进行自己尝试。
0x03 组合使用原理
1. “|”含义
在c语言中“|”的含义就是“或”的意思。
简单的说就是只要有1就为1,只有同为0的时候才为0。2. 原理
首先来看一张图。
#define MB_OK 0x00000000L #define MB_ICONHAND 0x00000010L
这两个进行或运算,也就是0x00000000和0x00000010进行或运算
使用软件进行转化:
00000和10000就是10000,所以会保留两个特征。
其他同理0x04 默认按钮
1.使用原因
(1)方便使用者,enter选择默认按钮
(2)防止误操作,默认按钮是最优选2.实现
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("LOVE猪猪"), TEXT("LOVE"),MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2); return 0; }
这里可以通过指定BUTTON1,或者BUTTON2,BUTTON3,或者BUTTON4。
展示:
0x05返回值
1.基础
首先来看这张图,是关于返回值的
2.简单demo
#include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { int r=MessageBox(NULL, TEXT("你是猪吗"), TEXT("LOVE"),MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2); if (r == IDOK) { MessageBox(NULL, TEXT("看来你很有自知之明嘛"), TEXT("LOVE"), MB_OK); } else { MessageBox(NULL, TEXT("想否认也没有办法,你还是猪"), TEXT("LOVE"), MB_OK); } return 0; }
这个就是简单的一个恶搞demo,当然如果写成其他的也是可以的。这个就看个人的发挥了。
0x06结束
以上就是c语言实战开发中的简单应用了,感觉下了一下午,但是收获还是有很多的。
有兴趣还可以看看其他系列 -
「分享」C语言如何编写图形界面
2021-05-25 08:45:25该楼层疑似违规已被系统折叠隐藏此楼查看此楼贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面。大家也都有回答,需要其他的库。MFC,GTK,QT。本人近期刚用GTK库加上纯C写成了第一个LINUX... -
C语言图形界面开发(演示视频、完整代码文件)
2022-04-08 19:19:35主要面向想做出图形界面的C语言初学者 C语言初学者开始都是在黑白控制台上开发一些小程序,实现一些小功能,因为基础的C语言可视化效果比较差,所展示的都是黑白的字符和数字,比较单调乏味。一些大学的计算机类专业... -
C语言是怎么实现图形界面的?
2021-05-22 11:09:09GTK就可以,一个基于C语言的免费、开源、跨平台图形工具包,可以直接使用C语言调用实现图形界面开发,下面我简单介绍一下这个工具包的安装和使用,这里以Windows平台为例:1.首先,下载GTK安装包,这个可以直接到... -
C语言初学者如何做出美观的图形界面(附源码及完整文件)
2019-08-13 13:46:35主要面向想做出图形界面的C语言初学者 C语言初学者开始都是在黑白控制台上开发一些小程序,实现一些小功能,因为基础的C语言可视化效果比较差,所展示的都是黑白的字符和数字,比较单调乏味。一些大学的计算机类专业... -
[C语言界面设计]EGE图形化界面简易版教程(适合初学者)
2022-03-01 14:01:55利用EGE简单有效的代码设计界面 -
C语言图形化窗口创建,与设置。
2022-02-04 13:35:05//关闭图形系统。 MessageBox(hwnd, "语句1", "语句2", MB_OK); //显示一个消息对话框。 //MessageBox (句柄, 显示内容,标题,MB_OK) ; outtextxy(int x, int y, char *string)函数,此函数是在屏幕上的指定点(x,y... -
图形化界面扫雷(C语言+easyx实现,多图教学)
2021-11-07 22:41:37扫雷前言准备工作EasyX的下载一些准备知识头文件的引用图形化界面的创建图形化界面简介鼠标操作提示框 前言 学了那么长时间的C语言,我们所有的一切似乎都被禁锢在黑框框(控制台)里,让人觉得很无趣,学习unity... -
C语言图形化操作
2018-05-25 21:18:57C语言图形化操作 有时候,我们需要进行一些图形化操作,完成对所在项目的美化。例如,做贪吃蛇大作战,简单的用户注册模块。这时,就需要进行图形化操作,来进行美化。例如: 从上面我们发现,这是不是和... -
C语言编写图形登陆界面
2014-09-22 12:17:56纯C语言实现漂亮的登陆界面,实现密码隐藏,实现鼠标点击登陆。 -
震惊!!!一个关于c语言图形化界面编程的小游戏
2018-12-04 11:54:54关于C语言的图形化界面编程 第一个小程序《飞翔的小鸟》 本人也是小白,大家轻点喷!!!! 下面是源码 作者: @追风 #include&amp;amp;lt;graphics.h&amp;amp;gt; #include&amp;... -
经典中的经典 c语言教程——窗口图形界面设计
2010-08-03 10:50:33本书介绍了如何为使用C语言编写的应用程序设计一个“自带汉字环境”的窗口式图形用户界面。书中系统地介绍了VGA显示卡、鼠标、键盘和扩充存储器等设备的编程方法,并在此基础上建立了一个内含式汉字编程环境HANENV,... -
c语言图形化界面编程之《五指棋》
2018-12-07 16:43:24用c语言写《五子棋》 目前还不太完善大神别喷,萌新们都来改改吧! 主要思路 捕获鼠标的消息来获取它的坐标,从而来下棋子,(目前还不能判定它的输赢) 逻辑差不多就是,一个棋子 的坐标的上下左右同时出现五个相同... -
C语言实现图形界面登陆窗口
2021-05-20 03:48:28//初始化图形界面 IMAGE Img1;//声明一个IMAGE变量 IMAGE Img2(640,480);//声明一个IMAGE变量 char input1[LEN_A];//用于接收输入的字符串 char input2[LEN_P];//用于接收输入的字符串 int j; InputAPword account; ... -
用C语言写的一个图形界面程序(改)
2017-12-23 00:31:45作者无聊时用Dev-C++编写的一个图形界面小程序,图形显示精准的打开文件时间和上个月、这个月、...想学习C语言图形界面编程或多文件编程的可以参考下。(之前曾上传过该文件,近来发现月份日期判断出错了,现已改正。) -
C语言课程设计--计算器(图形界面).doc
2021-05-19 01:37:05C语言课程设计--计算器(图形界面)扬 州 大 学………………………………………………1程序设计内容:………………………………………………1课程设计所补充的内容:补充的函数或算法…………3,4系统总体设计…………...