【C语言】 底层UI框架封装 控件 & 窗体的封装

目录

源码分享

1.main.c  [程序主入口]

2.Ctool.h  [工具类 头文件]

3.Ctool.c  [工具类 源文件]

4.Cwindow.h  [窗体类 头文件]

5.Cwindow.c  [窗体类 源文件]

6.loginWin.h  [登录窗 头文件]

7.loginWin.c  [登录窗 源文件]

效果展示


源码分享

1.main.c  [程序主入口]

#include<stdio.h>
#include"loginWin.h"//登录界面使用

int main()
{	
    loginInit();//登录界面绘制显示
	return 0;				
}

2.Ctool.h  [工具类 头文件]

#ifndef CTOOL_H
#define CTOOL_H
 
void paintWindow(int startX,int startY,int width,int height);//打印窗口
 
void gotoxy(int x,int y);//形参  光标定位
 
 
/*
函数功能:字符串输入控制
函数参数:
int maxLen 允许输入最大长度
int inputType 允许输入的字符类型  0:数字 1:字母 2:字母+数字
int ips 数据显示格式  0:密文  1:明文
char str[] 存储输入字符
函数返回值:无
char str[]    char str[20]    char*str
*/
void glb_string(int maxLen,int inputType,int ips,char str[]); 
 
#endif

3.Ctool.c  [工具类 源文件]

#include "Ctool.h"
#include <windows.h>   //gotoxy
#include<stdio.h>
#include<conio.h>
 
void gotoxy(int x,int y)//形参
{
	HANDLE hOut;
	COORD pos= {x,y};
	// 光标的起始位(第1列,第3行) 0是第1列 2是第3行
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	//printf("定位光标位置搜索(%d,%d)\n",pos.X,pos.Y);
}
 
void paintWindow(int startX,int startY,int width,int height)  //打印窗口 可以设置窗口大小  用户登录系统窗口
{
	int i=0;
	//打印顶部   
	//光标定位 找规律 ┗  ┛ ┏ ┓ ┃ ━
	//顶部 y不变 x 在变 (x-x+w)
	gotoxy(startX,startY);
	printf("┏");
	for(i=0;i<width-2;i++)  //控制循环次数width-2次
	{
		printf("━ ");
	}
	printf("┓");
 
	//左边 x不变 y在变 (y到y+height)
	for(i=1;i<=height-1;i++)
	{
		gotoxy(startX,startY+i);
		printf("┃");
	}
	
	//右边 x不变 =startx+width-1  y在变 y 到 y+height
	for(i=1;i<=height-1;i++)
	{
		gotoxy(startX+width*2-3,startY+i);
		printf("┃");
	}
 
	//底部 x在变化    y不变 (x到x+width) ━ 
	gotoxy(startX,startY+height-1);
	printf("┗");
	for(i=0;i<width-2;i++)
	{
		printf("━ ");
	}
	printf("┛");
 
	gotoxy(startX,startX+height);
}
 
void glb_string(int maxLen,int inputType,int ips,char str[])
{
	  char ch=0;
	  int i=0;
	  while(1)
	  {
		  ch=getch();
		  if(ch=='\r'&&i>0)
		  {   
			   break;  
		  }
		  switch(inputType)
		  {
		  case 0:
			  if(ch>='0'&&ch<='9'&&i<maxLen)
			  {
				  if(ips==0)
				  {
					 putch('*');   
				  }
				  else{   
					 putch(ch);
				  }
				  str[i++]=ch;   
			  }
			   break;
		   case 1:
			   if(i<maxLen&&(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			   {
				   if(ips==0)
				   {
					   putch('*'); 
				   }
				   else{  
					   putch(ch);
				   }
				   str[i++]=ch; 
			   }
			   break;
		   case 2:
				if(i<maxLen&&(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
				{
					if(ips==0)
					{
						putch('*');					 
					}
					else{	 
						putch(ch);
					}
					str[i++]=ch;			 
				}
				break;
			default:
				break;						 
		   }
	   }	   
}

4.Cwindow.h  [窗体类 头文件]

#ifndef CWINDOW_H
#define CWINDOW_H
//描述窗口相关的
#define LABEL 1  //控件使用宏定义  标签文本
#define EDIT 2   //                编辑框
#define BUTTON 3 //                按钮   
//ctrlType:说明是哪个种类的控件
 
//标签结构体的声明
typedef struct label_t
{
	int startx; //标签文本所放位置
	int starty;
	int width;//标签文本自身宽高
	int height;
	char content[20];//标签文本中输入对应的内容 字符数组
};
 
//编辑框结构体的声明
typedef struct edit_t
{
	int startx;//编辑框所放位置
	int starty;
	int width;//编辑框自身宽高
	int height;
	char content[20];//编辑框中输入的内容  字符数组的使用
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;      //显示类型 0-密文 1-明文
	int maxLen;   //最大长度
};
 
//按钮结构体的声明
typedef struct button_t
{
	int startx;//按钮所放位置
	int starty;
	int width;//按钮自身宽高
	int height;
	char content[20];//按钮中输入的内容	
};
 
//以编辑框为标准统一管控(编辑框要求最多)
//控件结构体的声明--编辑框 标签 按钮
typedef struct control_t
{
	int startx;//控件所放位置
	int starty;
	int width;//控件自身宽高
	int height;
	int maxLen;//最大长度
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;      //显示类型 0-密文 1-明文
	int ctrlType; //控件类型 1-label 2-edit 3-button  区分控件的使用
	char content[20];//控件中输入的内容
}CONTROL_T;//typedef重命名
 
//窗口结构体的声明 控件要放入窗口当中
typedef struct win_t
{
    int startx;//窗口所放位置
	int starty;
	int width;//窗口对应宽高
	int height;
	CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件(结构体)
    int ctrlCount;        //记录控件总个数 初始化为0 用于添加控件函数的中
}WIN_T;
 
//添加控件 void addControl(参数1:控件结构体 参数2:控件结构体数组 参数3:控件个数);
int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount);//添加控件到对应窗口中
 
//窗口显示函数可以绘制整个窗口以及每一个控件 而paintWindow只能画大框 不能显示里面的内容	
void showWindow(WIN_T win);//WIN_T win窗口结构体:数据类型+变量名
 
#endif

5.Cwindow.c  [窗体类 源文件]

#include "Cwindow.h"
#include "Ctool.h"//界面绘制
 
//添加控件 void addControl
//(参数1:控件结构体 参数2:控件结构体数组 参数3:控件个数);
int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount)
{
	ctrlArr[ctrlCount++]=ctrl;//通过下标将控件结构体ctrl放到控件结构体数组ctrlArr中   
//	ctrlCount记录控件总个数 添加控件
	return ctrlCount;	
}
 
//窗口显示函数 绘制整个窗口以及每一个控件
void showWindow(WIN_T win)
{
	int i=0;
	//首先显示大框
	paintWindow(win.startx,win.starty,win.width,win.height);//结构体变量名.属性
	//显示每一个控件
	for(i=0;i<win.ctrlCount;i++)//遍历ctrlArr[]数组  控件在窗口里
	{
		//类型 label  edit   button
		//如果是label    直接显示内容即可
		//如果是edit     画框(paintWindow) 显示内容
		//如果是button   画框                显示内容
		if(win.ctrlArr[i].ctrlType==LABEL)
		{
			gotoxy(win.ctrlArr[i].startx,win.ctrlArr[i].starty);//光标定位放入内容
			puts(win.ctrlArr[i].content);
		}
		else
		{
			//画编辑框 按钮框(小框)  避免小框和放入的内容镶嵌 小框向左 向上调整
			paintWindow(win.ctrlArr[i].startx-2,win.ctrlArr[i].starty-1,win.ctrlArr[i].width,win.ctrlArr[i].height);
			gotoxy(win.ctrlArr[i].startx,win.ctrlArr[i].starty);//光标定位放入内容
			puts(win.ctrlArr[i].content); 
		}
	}
	gotoxy(0,29);//优化显示
}

6.loginWin.h  [登录窗 头文件]

#ifndef LOGINWIN_H
#define LOGINWIN_H
 
//登录的初始化--登录窗口的展示
void loginInit();
 
#endif

7.loginWin.c  [登录窗 源文件]

#include"loginWin.h"//登录窗口头文件
#include"Cwindow.h"//窗口 控件工具头文件
#include "Ctool.h"
#include<stdio.h>//使用到printf
 
//登录的初始化
void loginInit()
{
/* 
1.定义一个窗口
2.准备控件
3.组装:把控件结构体放在窗口的控件结构体数组当中
4.展示:整个窗口 每一个控件
/*    
int startx;//窗口所放位置
int starty;
int width;//窗口对应宽高
int height;
CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件
int ctrlCount;   //记录控件总个数 初始化为0 用于添加控件的函数中 
*/
	WIN_T loginWin={5,5,24,16};//有两个没填 部分初始化 控件结构体数组{0}  ctrlCount=0
 
//控件的使用:控件所放位置 控件自身宽高 以及以下
/*	
int maxLen;//最大长度
int inputType;//输入类型 0-数字 1-字母 2-数字+字母
int ips;//显示类型 0-密文 1-明文       这三个是编辑框使用 对标签文本和按钮初始化0即可
int ctrlType;  //控件类型 1-label 2-edit 3-button  区分控件的使用
char content[20];//控件中输入的内容      
共填9个参数
*/
//标签文本控件
	CONTROL_T title={19,7,10,2,0,0,0,LABEL,"点菜系统"};
	CONTROL_T labName={10,9,10,3,0,0,0,LABEL,"请输入账号:"};
	CONTROL_T labPwd={10,12,10,3,0,0,0,LABEL,"请输入密码:"};
//编辑器控件
	CONTROL_T editName={25,9,10,3,10,2,1,EDIT,""};
	CONTROL_T editPwd={25,12,10,3,8,0,0,EDIT,""};
//按钮控件
	CONTROL_T btnok={10,15,8,3,0,0,0,BUTTON,"登录"};
	CONTROL_T btncancle={26,15,8,3,0,0,0,BUTTON,"返回"};
 
//添加控件 void addControl(参数1:控件结构体(控件) 参数2:控件结构体数组 参数3:控件个数);	
//通过下标将控件ctrl放到控件数组ctrlArr[20]当中  在登录窗口界面中添加控件
	loginWin.ctrlCount=addControl(title,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(labName,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(labPwd,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(editName,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(editPwd,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(btnok,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(btncancle,loginWin.ctrlArr,loginWin.ctrlCount);
	printf("控件个数,%d\n",loginWin.ctrlCount);
 
//展示窗口和每一个控件 
    showWindow(loginWin);//把登录窗口显示出来
}

效果展示

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值