面向过程中模拟出面向对象,用c语言模拟出MFC控件,消息循环,“设计用户界面”

大家好,今天给大家分享“怎样用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;
}

应知识有限,免不了错误,希望大家谅解。希望大家给予意见,批评,指导。 谢谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值