⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selbox.c

📁 这是一个支持"微型嵌入式 GUI" 的 SDK For Linux 版,其 GUI 核心可于 Linux, DOS 16/32 Bit, uC/OS-II及Windows 等平台工作,支持常用
💻 C
字号:
/*
SelBox - 选择框
www.ecub2006.com
*/
#include "gui.h" /* GUI 的头文件 */

#define ITEM_NUM 6 /* 项目数*/

/*
GUI 中内置了内存分配管理模块,作用 malloc,free相同,但功能更强大!
使用 GMemInit 函数,将一个储存空间交给 GUI 内存分配模块管理后,
再使用 Gmalloc,Gfree 函数时,GUI可以检测内存是否正确释放,
当有释放错误时(释放大小不符,空指针释放),或者 内存没有释放(退出窗口时) 会给出 提示窗口。
有助于开发更稳定的应用程序。
*/

char Gmemory[1024*10];/* 10kb储存空间 */

const MENU mymenu[]={/* 选择框与菜单的子项结构相同,但内容使用上有差异 */
{0,"苹果",0,0},
{1,"香蕉",0,0},
{2,"西瓜",0,0},
{3,"葡萄",0,0},
{4,"杏子",0,0},
{5,"菠萝",0,0}
};

void MyWin(HAND hd,MESSAGE msg) /* 窗口的消息处理函数 */
{
HAND box,button;/* 句柄 */
PMENU pm;
int i;
if(msg.type == GM_SYSTEM)/* 判断消息类型,消息类型全部为大写  */
	switch(msg.message)/* 判断消息 */
	{
	case GM_Create:/* 对象被创建后产生该消息,一般情况下,收到该消息时,
                对象还没有显示。可以在这里进行一些初始化工作。
				如果是窗口的GM_Create消息,可以创建新的对象,如 BUTTON 等 */

		        GMemInit(Gmemory,1024*10); /* 储存空间 托管 */

				{
				/* 分配 ITEM_NUM*2 个菜单子项的空间,供两个 选择框(SelBox) 使用 */
				pm=(PMENU)Gmalloc(sizeof(MENU)*ITEM_NUM*2,"");
				 
                memcpy(pm,mymenu,sizeof(MENU)*ITEM_NUM);/* 复制内容 */
                memcpy(pm+ITEM_NUM,mymenu,sizeof(MENU)*ITEM_NUM);/* 复制内容 */

                SetObjVar(hd,(HAND)pm);/* 设定为对象 自定义数据,方便在GM_Destroy 时释放 */
				button=CreateObject(hd,BUTTON,3,1,"统计A",10,110,210,130,0,0);/* 创建按钮 */
				box=CreateObject(hd,SELBOX,1,1,"",10,50,210,100,0,0); /* 创建 选择框 对象 */				 
				
				for(i=0;i<ITEM_NUM;i++,pm++)
		        efSelBox->Add(box,pm); /* 添加子项 */

                efSelBox->Set(box,1); /* 设置为多选,如果不设置,则默认为单选 */

				
				SetObjVar(button,box);/* 将选择框句柄设置为按钮的 自定义数据 */
                
                box=CreateObject(hd,SELBOX,2,1,"",220,50,310,100,0,0);/* 创建 选择框 对象 */	
				 
				for(i=0;i<ITEM_NUM;i++,pm++)
		        AddMenu(box,pm);/* 添加子项 */
                 
                button=CreateObject(hd,BUTTON,4,1,"统计B",220,110,310,130,0,0);/* 创建按钮 */
				SetObjVar(button,box);/* 将选择框句柄设置为按钮的 自定义数据 */
		        }
		return;
    case GM_Destroy:
		{		 
		void *pm;
		pm=GetObjVar(hd);/* 获得自定义数据指针 */
		Gfree(pm,sizeof(MENU)*ITEM_NUM*2); /* 释放占用的空间 */	 
		}
		return;
	default:return;
	}

pm=(PMENU)GetObjVar(hd);/* 获得自定义数据指针 */

if(msg.type ==GM_COMMAND)/* 按钮被触发 */
	switch(msg.message)/* 按钮 ID*/
	{
	case 3:/* "统计A" 按钮*/
        {
		char buf[256];
		int j;
		memset(buf,0,256); /* 被选择的子项 key 值为 1 ,未选则为 0 */
		for(i=0,j=0;i<ITEM_NUM;i++,pm++)
			if(pm->key) j++; /* 统计选择的子项数 */
        sprintf(buf,"您选择了%d项",j);/* 生成指定格式的字符串 */
		MessageBox(hd,"统计A",buf,0);
		}
		return;
	case 4:/* "统计B" 按钮*/
		{
		box=GetObjVar(msg.pData);
        
		i=efSelBox->Get(box);/* 返回选择的子项ID,没有选或者出错返回 -1 */
		 
		if(i==-1) 
			{
			MessageBox(hd,"Message","没有选",0);
			return;
			}
        MessageBox(hd,"选中",(pm+i)->szTitle,0);
		  
		}
		return;
	default:return;
	}
}

int gmain(void *data)
{
	/* 创建窗口 */
	CreateObject(0,MAINWINDOW,1,1,"SelBox",10,10,630,300,MyWin,0);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -