大家好,今天给大家分享“怎样用c模拟出MFC控件 简单模拟出消息循环,按钮控件”,面向过程中模拟出面向对象。
编程思路
首先用绘图库EasyX绘制窗口,窗口中绘制按钮,把按钮对象化,把它的坐标属性来判断,当鼠标点击时,是否在按钮上。是的话执行相应的按钮消息处理函数。
演示效果
运行可以看到这样一个界面
我们来点击菜单栏中的开始按钮试试 下方会出现一段语句
在点击帮助按钮试试
再按没做处理的按钮试试
完美不!
代码部分
//软件名称:用户界面程序
//文件名:main.cpp
//版本:2019.07.18.002
//软件说明:设计出用户界面,菜单栏,模拟消息循环,模拟出MFC控件
//作者:A贝尔(Abr)
//时间:2019年月18日12:20分
#include <conio.h>
#include <graphics.h>//图像库
int contkey();//按键生成函数
int mainmsg(int id);//消息处理函数
int out_graph();
struct skey//保存按键属性的结构体变量
{
int rx;//按键左上方x坐标
int ry;//按键左上方y坐标
int lenx;//按键宽度
int leny;//按键高度
wchar_t name[20];//按键标题
}skeys[10];
int contkey()//按键生成函数
{
//给按键属性赋值,生成菜单栏按键
skeys[0] = { 0, 0, 50, 30,_T("开始") };
skeys[1] = { 50, 0, 50, 30,_T("编辑") };
skeys[2] = { 100, 0, 50, 30,_T("视图") };
skeys[3] = { 150, 0, 50, 30,_T("项目") };
skeys[4] = { 200, 0, 50, 30,_T("生成") };
skeys[5] = { 250, 0, 50, 30,_T("工具") };
skeys[6] = { 300, 0, 50, 30,_T("帮助") };
//设置按键标题颜色
settextstyle(20, 0, _T("方正舒体"));
//字体按键颜色
settextcolor(BLACK);
//按键边框颜色
setlinecolor(BLACK);
//设置按键边框宽度
setlinestyle(PS_SOLID, 2);
//画出按键到图形界面
for(int id=0;id<7;id++)
{
//画出按键
rectangle(skeys[id].rx, skeys[id].ry, skeys[id].lenx+ skeys[id].rx, skeys[id].ry+ skeys[id].leny);
//打印按键标题
outtextxy(skeys[id].rx+5, skeys[id].ry+5, skeys[id].name);
}
return 0;
}
int out_graph()
{
COLORREF bcolor = WHITE, tcolor = 0x00ff66, scolor = 0xff005f, lcolor = LIGHTMAGENTA;
initgraph(640, 480);//初始化绘图界面
setcolor(scolor);//绘制颜色
settextcolor(tcolor);//字体颜色
setbkcolor(bcolor);//背景颜色
setlinecolor(lcolor);//画线颜色
cleardevice();//背景颜色擦屏
contkey();//按键控制函数
setfillcolor(RGB(60, 60, 60));//设置填充颜色
fillrectangle(20, 60, 500, 360);//话正方形
setfillcolor(RGB(100, 100, 100));
fillrectangle(20, 370, 500, 470);
setfillcolor(RGB(50, 98, 128));
fillrectangle(510, 60, 630, 470);
return 0;
}
//检测那一键被点击
int keymsg()
{
MOUSEMSG ms;//存储鼠标消息的结构体
while (true)//消息循环
{
if (MouseHit())//检测鼠标消息
{
ms = GetMouseMsg();//获取鼠标消息
if (ms.mkLButton)//判断鼠标左键是否被按下
{
int x, y;
x = ms.x, y = ms.y;//赋值鼠标坐标
for (int id = 0; skeys[id].lenx != 0; id++)//循环到案件长度等于0为止
{
//根据按键的左上方坐标和右下方坐标来判断鼠标按下的模拟键
if ((skeys[id].rx < x && (skeys[id].rx + skeys[id].lenx) > x) && (skeys[id].ry < y && (skeys[id].ry + skeys[id].leny) > y))
{
mainmsg(id);//消息处理函数 根据开关的 id 处理相应事件
FlushMouseMsgBuffer();// 清空鼠标消息缓冲区
x = 0, y = 0; // 删除干扰
memset(&ms, NULL, sizeof(ms));//清空存储鼠标消息结构体内容
break; // 跳出循环 已找到那一件被按下没必要循环下去
}
}
}
}
}
return 0;
}
//消息处理函数
int mainmsg(int id)
{
//在这里可以写自己的鼠标消息处理程序
switch (id)//id为按键数组的下标,id表示第几按键被左击
{
case 0://开始按钮
{
setbkcolor(RGB(100, 100, 100));
outtextxy(30, 380, L"已经开始运行炸弹脚本,你这下彻底完蛋了!");
}
break;
case 6://帮助按钮
{
setbkcolor(RGB(60, 60, 60));
outtextxy(30, 70, L"请记住到时候除了你自己,谁都帮不了你");
}
break;
default:
MessageBox(NULL, L"这键没有设置处理鼠标消息语句", skeys[id].name, MB_OK);
break;
}
return 0;
}
int main()
{
out_graph();//显示图像
HANDLE hd= CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)keymsg, NULL, NULL, NULL);//创建一个线程并运行 keymsg()函数(检测那一键被点击函数),存储线程 handle
_getch();
return 0;
}
应知识有限,免不了错误,希望大家谅解。希望大家给予意见,批评,指导。 谢谢!