EWWIM控件

1.GUIBuilder工具的使用
用来可视化开发界面

使用步骤:
(1)选择父小工具 (创建框架窗口)
每个对话框都需要一个有效的父小工具。因此,必须从能够充当父小工具的小工具开始
首先点击 GUIBuilder 控件选择栏中的 FrameWin 控件,创建一个框架窗口

(2)修改框架窗口尺寸
在控件属性框中,修改 FrameWin 控件的尺寸为 800*480(显示屏幕对应尺寸)

注:可以在这两个界面修改控件的属性
在这里插入图片描述

在这里插入图片描述

(3)保存并生成 C 文件
GUIBuilder 会自动生成对应的 C 文件。不过无法选择保存路径,生成的 C 文件会保存在 GUIBuilder 所在的文件夹中,

(4)将生成的c文件修改并添加到工程中
注:一旦关闭了工具,将无法修改,只能通过程序修改
生成的主要代码:

//资源管理表 控件的相关信息
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {}; 

//控件的回调函数
static void _cbDialog(WM_MESSAGE * pMsg)

//生产控件
WM_HWIN CreateFramewin(void)

生成的仅仅是一个框架,控件的功能要我们自己去写。

更换皮肤:

//更换皮肤
	BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX); 
	CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
	DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
	FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
	HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
	MENU_SetDefaultSkin(MENU_SKIN_FLEX);
	MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
	PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
	RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
	SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
	SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
	SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);

修改:建立与之相对应的头文件,然后在emwin任务函数里面调用
CreateFramewin()就行了,在调用之前要把皮肤更改函数加上(美)

2.对话框
对话框是包含一个或多个控件的窗口,通常这种窗口是为了响应用户输入请求而构建的。它可能包含多种控件,处理用户的各种请求信息,也可能只有提示信息,告知用户一些错误或警告

1)输入焦点
窗口管理器通过触摸屏、鼠标、键盘或其他方式记住用户最后选中的对话框、窗口或控件,并跟踪输入焦点。只有具有输入焦点的窗口才会接收键盘等外设的输入事件

2)阻塞式和非阻塞式对话框
阻塞式是会阻塞当前执行的线程或任务的对话框,且默认情况下具有
输入焦点,直到用户把它关掉,才能继续执行当前线程。
非阻塞式对话框则与阻塞式对话框相反,它不会阻塞当前调用的线程

3)对话框回调函数和消息
对话框本质上是一个窗口,大部分消息由对话框的窗口回调函数自动处理,剩下的则传递给创建对话框时指定的回调函数

对话框回调函数可以接收 WM_INIT_DIALOG 和 WM_NOTIFY_PARENT 两种消息。其中WM_INIT_DIALOG 消息对话框专用的,在显示对话框之前立刻发送到对话框回调函数。通常使用此消息来初始化对话框的外观和其中的各种控件,

WM_NOTIFY_PARENT 消息在有事件发生时,由对话框中的子窗口或控件发送到对话框,用来通知父窗口,子窗口或控件发生了某些事情,以使这些子窗口或控件有机会对事件做出反应。只要对话框内的任何控件以子窗口的形式存在并且发生了某些事件,对话框都会收到这个消息。

4)创建对话框
创建对话框需要两个基本条件:资源表和对话框回调函数

**资源表包含需要创建的控件的各种属性定义,对话框回调函数用来处理各种对话框相关的消息。**只要有这两个条件,就只需要一个函数来正式创建对话框。 GUI_CreateDialogBox() 函数用来创建非阻塞式对话框, GUI_ExecDialogBox()函数用于创建阻塞式对话框。

资源表

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = 
{
	{ FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0x64, 0 },
	{ EDIT_CreateIndirect, "Edit", ID_EDIT_0, 410, 20, 350, 250, 0, 0x64, 0 },
	{ LISTVIEW_CreateIndirect, "Listview", ID_LISTVIEW_0, 20, 20, 350, 250, 0, 0x0, 0 },
	{ BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 93, 290, 150, 45, 0, 0x0, 0 },
	{ BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 506, 290, 150, 45, 0, 0x0, 0 },
	{ SCROLLBAR_CreateIndirect, "Scrollbar", ID_SCROLLBAR_0, 9, 373, 772, 49, 0, 0x0, 0 },
	// USER START (Optionally insert additional widgets)
	// USER END
};

所有对话框用到的控件都是通过 _CreateIndirect() 函数间接创
建的。资源表对于对话框来说非常重要而且使用频繁, GUIBuilder 的界面代码就是以对话框的形式生成的。
任何小工具都可使用适宜的前缀间接创建。例如:BUTTON_CreateIndirect()可间接创建一个按钮小工具,CHECKBOX_CreateIndirect()可间接创建一个复选框小工具
仅在小工具要被包含在对话框中时,才需要间接创建它。否则,可使用_Create()函数直接创建它。

资源部类型的结构体(很重要!!!)
GUI_WIDGET_CREATE_INFO结构体:

struct GUI_WIDGET_CREATE_INFO_struct 
{
  GUI_WIDGET_CREATE_FUNC * pfCreateIndirect;
  const char             * pName;            // Text ... Not used on all widgets
  I16                      Id;               // ID ... should be unique in a dialog
  I16                      x0;               // x position
  I16                      y0;               // y position
  I16                      xSize;            // x size
  I16                      ySize;            // y size
  U16                      Flags;            // Widget specific create flags (opt.)
  I32                      Para;             // Widget specific parameter (opt.)
  U32                      NumExtraBytes;    // Number of extra bytes usable with <WIDGET>_SetUserData & <WIDGET>_GetUserData
};
1) pfCreateIndirect:指向控件创建函数的指针;
2) pName:控件名称;
3) Id:控件 ID;
4)x0,yo,size 左上角坐标和高度,宽度
5) Flags:控件的创建标志,默认为 06) para:控件的参数,默认为 07) NumExtraBytes:控件的额外字节。
对于上述资源表结构,不是所有的控件都会用到所有的资源表参数,不同控件用到的资
源表参数会有所变化。

<WIDGET>_Handle <WIDGET>_CreateIndirect(
const GUI_WIDGET_CREATE_INFO * pCreateInfo,
WM_HWIN                        hParent,
int                            x0,
int                            y0,
WM_CALLBACK                  * cb
);
pCreateInfo 指向GUI_WIDGET_CREATE_INFO结构的指针
hParent父窗口的句柄。	
x0,y0  坐标
cb  指向回调函数的指针。



注:在创建资源表时,表中的第一个控件必须是 Window 控件或者 FrameWin控件,不能是其他任何种类的控件,否则程序出错

对话框回调函数

对话框回调函数
static void _cbCallback(WM_MESSAGE * pMsg)
{
	switch (pMsg->MsgId) 
	{
		case:
		case:
		default:
			WM_DefaultProc(pMsg);
	}
}

回调函数其实跟普通窗口的回调几乎是一样的,唯一不同的是对话框回调
函数需要接收两种专有消息。

有了资源表和回调函数以后就可以创建对话框了

WM_HWIN CreateFramewin(void) 
{
	WM_HWIN hWin;
	
	hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
	return hWin;
}

现在的对话框并没有实质性的功能,因为对话框回调函数中还不包含各个控件的初始化代码。控件的初始状态、控件自身的行为逻辑以及控件之间的通信等等都需要在对话框回调函数中定义。

对话框API
在这里插入图片描述

WM_HWIN GUI_CreateDialogBox (const GUI_WIDGET_CREATE_INFO * paWidget,
						 int NumWidgets, WM_CALLBACK * cb, 
						 WM_HWINhParent, 
						 int x0, int y0);
创建一个非阻塞式对话框  从资源表里面
1) paWidget:指向对话框资源表的指针;
2) NumWidgets:对话框中包含的控件总数;
3) cb:指向对话框回调函数的指针;
4) hParent:父窗口的句柄,为 0 时没有父窗口;
5) x0:对话框相对于父窗口的 X 位置;
6) y0:对话框相对于父窗口的 Y 位置。
返回值:资源表中第一个控件的句柄。


int GUI_ExecCreatedDialog(WM_HWIN hDialog);
执行已创建的对话框。阻塞函数
创建一个非阻塞式对话框

int GUI_ExecDialogBox (const GUI_WIDGET_CREATE_INFO * paWidget, 
int NumWidgets, 
WM_CALLBACK * cb, WM_HWIN hParent,
int x0, int y0);
创建并执行对话框 阻塞函数
1) paWidget:指向对话框资源表的指针;
2) NumWidgets:对话框中包含的控件总数;
3) cb:指向对话框回调函数的指针;
4) hParent:父窗口的句柄,为 0 时没有父窗口;
5) x0:对话框相对于父窗口的 X 位置;
6) y0:对话框相对于父窗口的 Y 位置。
返回传递给 GUI_EndDialog() 的值


void GUI_EndDialog(WM_HWIN hDialog, int r);
结束并关闭对话框,对话框及其子窗口将从内存中删除
1) hDialog:对话框句柄;
2) 该值由 GUI_ExecDialogBox() 函数返回。如果关闭非阻塞对话框,则忽略此值

调用此函数关闭对话框,在下一次执行 WM_Exec()GUI_Dela() 后,对话框句柄 
hDialog 将不再有效。如果关闭的是非阻塞式对话框,那么此函数等效于WM_DeleteWindow() 函数。



注意WM_GetDialogItem与WM_GetId
一个返回窗口句柄一个返回窗口的ID

WM_HWIN WM_GetDialogItem(WM_HWIN hDialog, int Id);
返回对话框项目(小工具)的窗口句柄。
hDialog  对话框的句柄
Id   小工具的窗口

int WM_GetId(WM_HWIN hObj);
返回指定小工具窗口的ID。
hObj 小工具的句柄。

框架窗口控件

框架窗口控件和Window控件都是emWin整个对话框功能的核心承载体,几乎所有使用对话框形式创建的界面,都是以这两种控件为基础的

框架窗口控件实际上是由主窗口和子窗口两个部分组成。其中子窗口被称为客户窗口(Clientwindow)。
在这里插入图片描述
在使用框架窗口控件的时候请一定注意:框架窗口控件是有两个回调函数的,主窗口有一个,客户窗口也有一个。主窗口回调负责绘制边框、标题栏等外观以及处理边框上按钮的消息,客户窗口回调负责绘制控件的客户区以及处理子控件的消息,因为在框架窗口控件中创建的子控件,会以客户窗口作为他们的父窗口。

API:
在这里插入图片描述

注:FRAMEWIN_CreateEx()和FRAMEWIN_CreateIndirect()区别
前者以直接方式在指定位置创建具有指定大小的框架窗口控件。
后者使用对话框方式间接创建一个框架窗口。一般使用后者

3.按钮控件(Button)
emWin 提供了三种按键式的控件,分别是:按钮(Button)、复选框(Checkbox)和单选按钮(Radio button)。

按钮控件支持三种通知代码,以区分不同的按钮动作
在这里插入图片描述
这三种通知代码是作为 WM_NOTIFY_PARENT 消息的一部分发送到其父窗口的。当用户点击按钮后,窗口管理器向父窗口发送 WM_NOTIFY_PARENT 消息时,会在消息结构的 Data.v 成员中附加相应的通知代码,用户程序可以读取此成员来检测不同的按钮动作以及实现各种功能

按钮API
在这里插入图片描述

BUTTON_Handle BUTTON_CreateEx(int x0, int y0, int xSize, int ySize,
							WM_HWIN hParent, 
							int WinFlags,
							int ExFlags, 
							int Id);
1) x0:按钮控件在父坐标中的最左侧像素;
2) y0:按钮控件在父坐标中的最顶侧像素;
3) xSize:按钮的水平尺寸,以像素为单位;
4) ySize:按钮的垂直尺寸,以像素为单位;
5) hParent:父窗口句柄。如果为 0,则将桌面窗口作为其父窗口;
6) WinFlags:窗口创建标志。由于控件本质上是窗口,所以按钮控件在创建时可以使用几乎所有
的窗口创建标志。这些标志中按钮最常用的是 WM_CF_SHOW。全部创建标志请参考 emWin 手
册的窗口管理器章节;
7) ExFlags:预留,未使用;
8) 控件 ID 号。


BUTTON_Handle BUTTON_CreateIndirect(
const GUI_WIDGET_CREATE_INFO  *pCreateInfo,
			WM_HWIN hWinParent,
			 int x0, int y0, 
			 WM_CALLBACK * cb);
1) pCreateInfo:指向 GUI_WIDGET_CREATE_INFO 结构的指针;
2) hParent:父窗口的句柄;
3) x0:按钮控件在父坐标中的最左边像素;
4) y0:按钮控件在父坐标中的最顶部像素;
5) cb:回调函数指针


void BUTTON_SetBitmapEx(BUTTON_Handle      hObj,
						unsigned int       Index,
						const GUI_BITMAP * pBitmap,
						int                x,
						int                y);
设置显示指定按钮时要使用的位图。

hObj   按钮的句柄。
Index  位图的索引
pBitmap  位图结构的指针
x,y    坐标

void BUTTON_SetBitmap(BUTTON_Handle      hObj,
unsigned int       Index,
const GUI_BITMAP * pBitmap)
设置显示指定按钮时要使用的位图
hObj   按钮的句柄。
Index  位图的索引
pBitmap  位图结构的指针

索引:
BUTTON_BI_DISABLED   用于禁用状态的位图。
BUTTON_BI_PRESSED    用于按下状态的位图。
BUTTON_BI_UNPRESSED  用于未按下状态的位图。

4.复选框(Checkbox)
复选框是一种经常用于选择多种选项的控件。用户可以选中或者取消选中复选框,并且可以一次选中任意数量的复选框。被禁用的复选框会显示为灰色
三种状态:
在这里插入图片描述
复选框控件支持 4 种通知代码和一种键盘消息
四种通知代码是作为 WM_NOTIFY_PARENT 消息的一部分发送到其父窗口的。当用户点击按钮后,窗口管理器向父窗口发送WM_NOTIFY_PARENT 消息时,会在消息结构的 Data.v 成员中附加相应的通知代码,用户程序可以读取此成员来检测不同的复选框动作以及实现各种功能
在这里插入图片描述

控件相关API
在这里插入图片描述
原型:

CHECKBOX_Handle  CHECKBOX_CreateEx(int x0,int y0,
								int xSize,int ySize,
						        WM_HWIN       hParent,
								int WinFlags,
								int ExFlags,
								int Id);

在指定位置创建具有指定大小的复选框控件

x0:复选框控件在父坐标中的最左侧像素;
y0:复选框控件在父坐标中的最顶侧像素;
xSize:复选框的水平尺寸,以像素为单位;
ySize:复选框的垂直尺寸,以像素为单位,此参数可用来修改选框区域的大小;
hParent:父窗口句柄。如果为0,则将桌面窗口作为其父窗口;
WinFlags:窗口创建标志。由于控件本质上是窗口,所以复选框控件在创建时可以使用
几乎所有的窗口创建标志。这些标志中按钮最常用的是WM_CF_SHOW。
ExFlags:预留,未使用;
Id:控件ID号。
返回值:创建成功后返回已创建的复选框控件句柄,创建失败则返回0。
如果此函数的xSize或ySize参数为0,则使用默认复选标记位图的大小(11x11像素)加上效果大小作为复选框的默认大小。完整的显示整个复选框控件包含选框区域、文本和框与文本之间的间距,想要完整显示整个复选框,那么xSize就必须足够大。

CHECKBOX_Handle CHECKBOX_CreateIndirect(
const GUI_WIDGET_CREATE_INFO␣  pCreateInfo,
WM_HWIN hWinParent,
int x0, int y0,
WM_CALLBACK * cb);
从对话框资源表中创建复选框控件
1) pCreateInfo:指向 GUI_WIDGET_CREATE_INFO 结构的指针;
2) hParent:父窗口的句柄;
3) x0:复选框控件在父坐标中的最左边像素;
4) y0:复选框控件在父坐标中的最顶部像素;
5) cb:回调函数指针。


void CHECKBOX_SetNumStates(CHECKBOX_Handle hObj, unsigned NumStates);
此函数设置给定复选框的可能状态的数量。
hObj 句柄
NumStates:
给定复选框的当前状态的数量。当前支持23种状态,默认情况下,复选框支持2种状
态:选中(1)和未选中(0)。如果复选框要支持第三种状态,可将可能状态增加到3种。


void CHECKBOX_SetState(CHECKBOX_Handle hObj, unsigned State);
设置给定复选框小工具的新状态。
State 
0  取消选中
1  选中
2  第三种状态

void CHECKBOX_SetImage(CHECKBOX_Handle    hObj,
const GUI_BITMAP * pBitmap,
unsigned int       Index);
设置复选框被选中后显示的图像。


index:
在这里插入图片描述

5.下拉框(Dropdown)
下拉框控件是一种用于在列表中选择一个或多个元素的控件
通知代码:
在这里插入图片描述
如果控件还具有输入焦点,还支持键盘反应
在这里插入图片描述

API:
在这里插入图片描述
在这里插入图片描述

void DROPDOWN_SetAutoScroll(DROPDOWN_Handle hObj, int OnOff);
启用在下拉列表中自动使用垂直滚动条。
OnOff 0禁止  1启用

void DROPDOWN_AddString(DROPDOWN_Handle hObj, const char * s);
给下拉列表添加新元素


6.编辑框(EDIT)

4 种通知代码是作为 WM_NOTIFY_PARENT 消息的一部分发送到其父窗口的。当用户点击编辑框后,窗口管理器向父窗口发送 WM_NOTIFY_PARENT 消息时,会在消息结构的 Data.v 成员中附加相应的通知代码,用户程序可以读取此成员来检测不同的按钮动作以及实现各种功能。
在这里插入图片描述
编辑框控件支持输入焦点,支持键盘或其他类似键盘的外部输入设备对编辑框的控制。如果编辑框控件已被聚焦,那它可以接收表格编辑框支持的按键消息 中的按键消息
在这里插入图片描述
API:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.窗口定时器
WM_CreateTimer()创建定时器,其功能是经过指定周期后,向指定窗口发送消息。该定时器与指定窗口相关联。

WM_HTIMER WM_CreateTimer(WM_HWIN hWin, int UserId, int Period, int Mode);
UserId  用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零
Period 周期,此周期过后指定窗口应收到消息。
Mode  (留待将来使用,应为0)
返回值定时器的句柄

该函数建立了一个“单次定时器”,向指定窗口发送WM_TIMER消息。该定时器的周期过
后,定时器对象仍然有效,可使用WM_RestartTimer()函数重启,或者使用
WM_DeleteTimer()函数删除它。请注意,窗口管理器在删除窗口时会自动连带删除与
其相关的定时器。

void WM_DeleteTimer(WM_HTIMER hTimer);
删除指定定时器。

还要许多小工具就不一一列举
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Super.Bear

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

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

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

打赏作者

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

抵扣说明:

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

余额充值