ucgui界面设计&实体按键驱动



ucgui界面设计&实体按键驱动


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本:3.90

mcu: stm32f103VE


说明:

本程序基于ucgui对话框机制设计了一个界面,并用6个实体按键对界面进行控制


效果图:

ucgui界面设计&实体按键驱动_第1张图片


源码:

gui_main.h

/*********************************************************************
*						    主界面模块头文件
*						(c)copyright 2014,jdh
*						  All Right Reserved
*新建时间:2014/10/23 by jdh
**********************************************************************/

#ifndef _GUI_MAIN_H_
#define _GUI_MAIN_H_

/*********************************************************************
*							头文件
**********************************************************************/

#include "world.h"

/*********************************************************************
*							宏定义
**********************************************************************/

/*********************************************************************
*							工作间隔
*单位:ms
**********************************************************************/

#define INTERVAL_GUI_MAIN			100  

/*********************************************************************
*							函数
**********************************************************************/

/*********************************************************************
*							模块载入
**********************************************************************/

void gui_main_load(void);

/*********************************************************************
*							模块运行
**********************************************************************/

void gui_main_run(void);

/*********************************************************************
*							设置显示状态
*参数:enable:0:关闭显示,1:打开显示
**********************************************************************/

void gui_main_show(uint8_t enable);

/*********************************************************************
*							得到当前的显示状态
*返回:0:关闭显示,1:打开显示
**********************************************************************/

uint8_t gui_main_get_show(void);

#endif



gui_main.c

/*********************************************************************
*						    主界面模块主文件
*						(c)copyright 2014,jdh
*						  All Right Reserved
*新建时间:2014/10/23 by jdh
**********************************************************************/

/*********************************************************************
*							头文件
**********************************************************************/

#include "gui_main.h"

/*********************************************************************
*							宏定义
**********************************************************************/

#define ID_FRAMEWIN            		(GUI_ID_USER + 0x10)
#define ID_BUTTON_OK            	(GUI_ID_USER + 0x11)
#define ID_BUTTON_CANCEL            (GUI_ID_USER + 0x12)
#define ID_BUTTON_UP            	(GUI_ID_USER + 0x13)
#define ID_BUTTON_DOWN            	(GUI_ID_USER + 0x14)
#define ID_BUTTON_LEFT            	(GUI_ID_USER + 0x15)
#define ID_BUTTON_RIGHT            	(GUI_ID_USER + 0x16)
#define ID_TEXT_MATCH           	(GUI_ID_USER + 0x17)
#define ID_TEXT_RSSI           		(GUI_ID_USER + 0x18)
#define ID_LISTBOX_FUNC           	(GUI_ID_USER + 0x19)

/*********************************************************************
*							数据结构
**********************************************************************/

/*********************************************************************
*							按键状态
**********************************************************************/

struct _Key_State
{
	uint8_t ok;
	uint8_t cancel;
	uint8_t up;
	uint8_t down;
	uint8_t left;
	uint8_t right;
};

/*********************************************************************
*							静态变量
**********************************************************************/

/*********************************************************************
*							界面句柄
**********************************************************************/

static WM_HWIN Handle_Gui;

/*********************************************************************
*							资源表
**********************************************************************/

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = 
{
  { FRAMEWIN_CreateIndirect, 	"Frame3", 	ID_FRAMEWIN, 			0, 0, 240, 320, 0, 0x0},
  { BUTTON_CreateIndirect, 		"OK", 		ID_BUTTON_OK, 		5, 255, 40, 20, 0, 0x0},
  { BUTTON_CreateIndirect, 		"Button", 	ID_BUTTON_DOWN, 	95, 280, 40, 20, 0, 0x0},
  { BUTTON_CreateIndirect, 		"UP", 		ID_BUTTON_UP, 		95, 255, 40, 20, 0, 0x0},
  { BUTTON_CreateIndirect, 		"CANCEL", 	ID_BUTTON_CANCEL, 	185, 255, 40, 20, 0, 0x0},
  { BUTTON_CreateIndirect, 		"RIGHT", 	ID_BUTTON_RIGHT, 	140, 270, 40, 20, 0, 0x0},
  { BUTTON_CreateIndirect, 		"LEFT", 	ID_BUTTON_LEFT, 	50, 270, 40, 20, 0, 0x0},
  { TEXT_CreateIndirect, 		"Match", 	ID_TEXT_MATCH, 		140, 15, 80, 20, 0, 0x0},
  { TEXT_CreateIndirect, 		"RSSI", 	ID_TEXT_RSSI, 		140, 40, 80, 20, 0, 0x0},
  { LISTBOX_CreateIndirect, 	"Listbox", 	ID_LISTBOX_FUNC, 	5, 10, 120, 220, 0, 0x0},
  // USER START (Optionally insert additional widgets)
  // USER END
};

/*********************************************************************
*							上次工作时间
**********************************************************************/

static struct _Time Time_Last = 
{
    .s = 0,
    .ms = 0,
    .us = 0
};

/*********************************************************************
*							按键状态
**********************************************************************/

static struct _Key_State Key_State = 
{
	.ok = 0,
	.cancel = 0,
	.up = 0,
	.down = 0,
	.left = 0,
	.right = 0
};

/*********************************************************************
*							当前显示状态
*0:未显示,1显示
**********************************************************************/

static uint8_t State_Show = 1;

/*********************************************************************
*							静态函数
**********************************************************************/

/*********************************************************************
*							回调函数
**********************************************************************/

static void _cbDialog(WM_MESSAGE * pMsg);

/*********************************************************************
*							定时工作
**********************************************************************/

static void slot_tick(void);

/*********************************************************************
*							按键处理
**********************************************************************/

static void deal_key(void);

/*********************************************************************
*							函数
**********************************************************************/

/*********************************************************************
*							模块载入
**********************************************************************/

void gui_main_load(void)
{
	//新建界面
	Handle_Gui = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), 
									 _cbDialog, WM_HBKWIN, 0, 0);
}

/*********************************************************************
*							模块运行
**********************************************************************/

void gui_main_run(void)
{
	struct _Time time;
	
	//判断当前是否显示
	if (State_Show == 0)
	{
		return;
	}
    
    //得到当前时间
    get_time(&time);

    //判断是否到工作时间
	if (sub_time(time,Time_Last) >= INTERVAL_GUI_MAIN * 1000)
    {
        //更新时间
        Time_Last = time;
        
        //定时工作
        slot_tick();
    }
}

/*********************************************************************
*							设置显示状态
*参数:enable:0:关闭显示,1:打开显示
**********************************************************************/

void gui_main_show(uint8_t enable)
{
	State_Show = enable;
	if (enable)
	{
		WM_ShowWindow(Handle_Gui);
	}
	else
	{
		WM_HideWindow(Handle_Gui);
	}
}

/*********************************************************************
*							得到当前的显示状态
*返回:0:关闭显示,1:打开显示
**********************************************************************/

uint8_t gui_main_get_show(void)
{
	return State_Show;
}

/*********************************************************************
*							定时工作
**********************************************************************/

static void slot_tick(void)
{
	//按键处理
	deal_key();
}

/*********************************************************************
*							按键处理
**********************************************************************/

static void deal_key(void)
{
	WM_HWIN hItem;
	
	//按键扫描
    //inf_key_scan();
	
	//判断关机键是否按下
	if (inf_key_detect_hold(KEY_CANCEL))
	{
		if (Key_State.cancel == 0)
		{
			Key_State.cancel = 1;
			
			//按下状态
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_CANCEL);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);
			
			//关机
			inf_power_set(OFF);
		}
	}
	else
	{
		if (Key_State.cancel == 1)
		{
			Key_State.cancel = 0;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_CANCEL);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);
			
			//开机
			inf_power_set(ON);
		}
	}
	
	//判断下键是否按下
	if (inf_key_detect_hold(KEY_DOWN))
	{
		if (Key_State.down == 0)
		{
			Key_State.down = 1;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_DOWN);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);
			
			//发送按键信号
			WM_NotifyParent(hItem,WM_NOTIFICATION_CLICKED);
		}
	}
	else
	{
		if (Key_State.down == 1)
		{
			Key_State.down = 0;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_DOWN);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);
		}
	}
	
	//判断上键是否按下
	if (inf_key_detect_hold(KEY_UP))
	{
		if (Key_State.up == 0)
		{
			Key_State.up = 1;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_UP);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);
			
			//发送按键信号
			WM_NotifyParent(hItem,WM_NOTIFICATION_CLICKED);
		}
	}
	else
	{
		if (Key_State.up == 1)
		{
			Key_State.up = 0;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_UP);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);
		}
	}
	
	//判断测试键是否按下
	if (inf_key_detect_hold(KEY_OK))
	{
		if (Key_State.ok == 0)
		{
			Key_State.ok = 1;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_OK);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);
			
			//发送按键信号
			WM_NotifyParent(hItem,WM_NOTIFICATION_CLICKED);
		}
	}
	else
	{
		if (Key_State.ok == 1)
		{
			Key_State.ok = 0;
			
			//初始化按键
			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_OK);
			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);
		}
	}
}

/*********************************************************************
*							回调函数
**********************************************************************/

static void _cbDialog(WM_MESSAGE * pMsg) 
{
	WM_HWIN hItem;
	int     NCode;
	int     Id;
	// USER START (Optionally insert additional variables)
	// USER END
	char str[20] = {0};

	switch (pMsg->MsgId) 
	{
	case WM_INIT_DIALOG:
		{
			//初始化窗体
			//增加小按键
			FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);
			FRAMEWIN_AddMaxButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 1);
			FRAMEWIN_AddMinButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 2);
			FRAMEWIN_SetFont(pMsg->hWin, &GUI_FontHZ12);
			sprintf(str,"脚镣测试系统Ver%d by jdh",VERSION_SOFT);
			FRAMEWIN_SetText(pMsg->hWin,str);
			
			//初始化列表框
			hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_FUNC);
			//设置为焦点
			WM_SetFocus(hItem);
			//设置内容
			LISTBOX_SetFont(hItem, &GUI_FontHZ12);
			LISTBOX_AddString(hItem, "对码绑定");
			LISTBOX_AddString(hItem, "频点选择");
			LISTBOX_AddString(hItem, "通话测试");
			LISTBOX_AddString(hItem, "GPRS测试");
			LISTBOX_AddString(hItem, "GPS测试");
			LISTBOX_AddString(hItem, "125K测试");
			SCROLLBAR_CreateAttached(hItem, SCROLLBAR_CF_VERTICAL);
			
			//初始化按键
			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_OK);
			BUTTON_SetFont(hItem, &GUI_FontHZ12);
			BUTTON_SetText(hItem,"测试");
			
			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_CANCEL);
			BUTTON_SetFont(hItem, &GUI_FontHZ12);
			BUTTON_SetText(hItem,"关机");
			
			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_UP);
			BUTTON_SetFont(hItem, &GUI_FontHZ12);
			BUTTON_SetText(hItem,"上");
			
			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_DOWN);
			BUTTON_SetFont(hItem, &GUI_FontHZ12);
			BUTTON_SetText(hItem,"下");
			
			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_LEFT);
			BUTTON_SetFont(hItem, &GUI_FontHZ12);
			BUTTON_SetText(hItem,"");
			
			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_RIGHT);
			BUTTON_SetFont(hItem, &GUI_FontHZ12);
			BUTTON_SetText(hItem,"");
			
			//初始化文本
			hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_MATCH);
			TEXT_SetFont(hItem, &GUI_FontHZ12);
			TEXT_SetText(hItem,"未绑定脚镣");
			
			hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_RSSI);
			TEXT_SetFont(hItem, &GUI_FontHZ12);
			TEXT_SetText(hItem,"");
			
			break;
		}
	case WM_NOTIFY_PARENT:
		{
			Id = WM_GetId(pMsg->hWinSrc);
			NCode = pMsg->Data.v;
			switch(Id) 
			{
			case ID_BUTTON_OK: 
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							//获得当前列表数目
							hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_FUNC);
							int a = LISTBOX_GetSel(hItem);
							sprintf(str,"%d",a);
							
							hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_RSSI);
							TEXT_SetText(hItem,str);
							
							
							hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_FUNC);
							LISTBOX_GetItemText(hItem,a,str,20);
							
							hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_MATCH);
							TEXT_SetText(hItem,str);
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					
					break;
				}
			case ID_BUTTON_DOWN:
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							//发送按键信号
							GUI_SendKeyMsg(GUI_KEY_DOWN, 1);
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					break;
				}
			case ID_BUTTON_UP: 
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							//发送按键信号
							GUI_SendKeyMsg(GUI_KEY_UP, 1);
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					break;
				}
			case ID_BUTTON_CANCEL:
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					break;
				}
			case ID_BUTTON_RIGHT:
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					break;
				}
			case ID_BUTTON_LEFT:
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					break;
				}
			case ID_LISTBOX_FUNC:
				{
					switch(NCode) 
					{
					case WM_NOTIFICATION_CLICKED:
						{
							break;
						}
					case WM_NOTIFICATION_RELEASED:
						{
							break;
						}
					}
					break;
				}
			}
			break;
		}
	default:
		{
			WM_DefaultProc(pMsg);
			break;
		}
	}
}


你可能感兴趣的:(ucgui界面设计&实体按键驱动)