1 建立UCGUI主菜单
用户通过利用UCGUI中WM_CreateWindow函数建立一个指定大小的窗口。
窗口对话框建立函数
GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent, int x0, int y0)
paWidge,对话框信息结构体,包含了对话框所有的信息,对话框中的各个部件都在该信息结构体中被设置好。
NumWidgets,对话框中所有部件的个数。
cb,窗口回调函数。
hParent,窗口父窗口的句柄。
x0,y0,窗口建立时起始位置。
扩展型窗口对话框建立函数:
GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets, WM_CALLBACK* WM_HWIN hParent, int x0, int y0)
paWidget,窗口信息。
NumWidgets,窗口部件数目。
cb,,窗口回调函数。
hParent,父窗口句柄。
x0,y0,窗口建立时起始位置。
1.2 回调函数
一般来说,每一个窗口的建立都会附带有一个属于该窗口的回调函数,利用回调函数来实时更新窗口的内容。
UCGUI中为窗口和窗口对象(控件)提供的回调机制实质上是一个事件驱动系统。正如在大多数视窗系统中一样,原则是控制流程不只是从用户程序到图形系统(用户程序调用图形系统函数来更新窗口),而且可以从用户程序到图形系统,同时也可以从图形系统回到用户程序,意思是图形系统也可以调用用户程序提供的回调函数来达到更新窗口的目的。这种机制常常表现好莱坞法则的特点(“不要打电话给我们,我们会打电话给你”)---主要是视窗管理器为了启动窗口重绘的需要。与传统程序比较有差异,但它使对视窗管理器的无效逻辑开发成为可能。
回调函数的执行行为依赖于它收到的消息类型。上面的函数原型通常带有一个开关声明,用于定义了对于不同的使用一个或者更多的事件声明的消息所采用的不同的处理方式(典型的至少有对WM_PAINT()的处理)。
回调函数需要获得的信息包括有:目标窗口、目标窗口的消息、源窗口、源窗口下部件的ID等信息。
回调函数中可以通过获取目标窗口,然后在获取目标窗口下的各个部件的ID,这时可以根据窗口的消息类型来初始化各个部件,如消息是WM_INIT_DIALOG时,可以直接对窗口进行初始化设置,例如设置按钮按下之后的背景色、设置窗口的字体大小等。如果要使用回调函数实时更新各个窗口,必须要运行GUI_Exec()或WM_Exec函数。
1.3 常用窗口初始化函数解析
窗口初始化方式有两种,一种是在新建窗口时初始化,第二种则是利用回调函数初始化窗口。使用在新建窗口时初始化的方法与回调函数中初始化窗口差不多,在新建窗口时给窗口一个指定的句柄,在利用常用的窗口初始化函数对窗口句柄进行初始化即可。
在回调函数中对窗口初始化应该注意,进入回调函数就立即获取窗口句柄,同时必须要用缓存保存从窗口中获取的各个部件的ID。
获取窗口部件函数如下:
WM_HWIN _GetDialogItem(WM_HWIN hWin, int Id)函数从窗口中获取各个部件的ID。
hWin,为部件所在窗体的源窗口句柄,Id为建立控件时为控件设置的ID。在窗体回调函数中必须要注意WM_HWIN _GetDialogItem函数调用的位置,在WN_INIT_DIALOG前调用还是在其后调用所得到的结果不同。通过调整该函数在回调函数中所在的位置来确定程序能否正常运行。
对于窗口名的设置用FRAMEWIN的相关函数。常用的函数原型如下有:
设置窗口标题的字体大小函数:
FRAMEWIN_SetFont(FRAMEWIN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont)。
FRAMEWIN_Handle,为所建立的窗口的句柄,不需要调用窗口部件获取函数去获取其部件ID,只需要在进入回调函数时调用获取源窗口句柄函数(pMsg->hWin)即可实现。
* pFont为窗口标题的字体,一般用GUI.H中UCGUI自带的字体即可,用户也可自定义GUI支持的字体,GUI自带的字体只支持英文的,不支持中文字体,如果需要显示中文字体,用户要用GUI字库生成软件生成,在添加进工程才行。
设置窗口标题字体显示的对齐方式函数:
FRAMEWIN_SetTextAlign(FRAMEWIN_Handle hObj, int Align)
hObj为源窗口句柄,Align为窗体标题显示对齐方式,其取值一般有:左对齐,右对齐,居中等,这些参数在GUI.H函数中已经被定义为宏,用户根据需要直接使用即可。
设置窗口标题的显示颜色:
FRAMEWIN_SetTextColor (FRAMEWIN_Handle hObj, GUI_COLOR Color)
hObj为源窗口句柄,Color为标题颜色,参数在GUI.H中被定义为宏。
设置窗口标题栏高度:
FRAMEWIN_SetTitleHeight (FRAMEWIN_Handle hObj, int Height)
hObj为窗口句柄,Height为标题栏高度
为窗口中添加关闭窗口按钮:
FRAMEWIN_AddCloseButton(FRAMEWIN_Handle hObj, int Flags, int Off)。
hObj为要添加按钮的窗口句柄。Flags为添加的按钮的显示方式,基本参数为FRAMEWIN_BUTTON_RIGHT或FRAMEWIN_BUTTON_LEFT,即将该关闭窗口按钮显示在窗口的最左端或是最右端。
为窗口添加最大化显示按钮:
FRAMEWIN_AddMaxButton(FRAMEWIN_Handle hObj, int Flags, int Off)与上述添加关闭窗口按钮原理相同。
为窗口添加最小化按钮:
FRAMEWIN_AddMinButton(FRAMEWIN_Handle hObj, int Flags, int Off),如上同理。一般情况下,这三个函数在窗体初始化时同时使用。
窗口BUTTON部件常用设置函数如下:
设置按钮显示的字体
BUTTON_SetFont(BUTTON_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont)
hObj为BUTTON部件句柄,在设置之前应该从窗口中获取,pfont按钮显示字体,GUI默认只能支持英文。
设置按钮按下或没有按下时的背景色
BUTTON_SetBkColor(BUTTON_Handle hObj,unsigned int Index, GUI_COLOR Color)
hObj为BUTTON部件句柄,Index为索引,0表示按钮没有按下,1表示按钮按下,Color为BUTTON的背景色。
设置按钮按下或是没有按下时,按钮上的文字的颜色:
BUTTON_SetTextColor(BUTTON_Handle hObj,unsigned int Index, GUI_COLOR Color)
hObj为BUTTON部件句柄,Index为索引,0表示按钮没有按下,1表示按钮按下,Color为文字颜色。
常用LISTBOX设置函数如下。
设置LISTBOX显示内容的字体:
LISTBOX_SetFont(LISTBOX_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont)
hObj为LISTBOX部件句柄,pFont为在LISTBOX中显示内容的字体,GUI默认只支持英文,中文字体需要用户自己添加。
往LISTBOX中添加内容:
LISTBOX_AddString (LISTBOX_Handle hObj, const char* s)
hObj为LISTBOX部件句柄,*s为要添加的内容,一般为字符串。
高亮LISTBOX中的上一个目录:
LISTBOX_DecSel (LISTBOX_Handle hObj)
高亮LISTBOX中的下一个目录:
LISTBOX_IncSel (LISTBOX_Handle hObj)
hObj为LISTBOX部件句柄。
获取LISTBOX中高亮目录:
LISTBOX_GetSel (LISTBOX_Handle hObj)
hObj,LISTBOX部件句柄,返回的是该目录在LISTBOX中的序号。获取LISTBOX中高亮目录的内容
LISTBOX_GetItemText (LISTBOX_Handle hObj, unsigned Index, char * pBuffer, int MaxSize)
hObj为LISTBOX部件句柄,Index为高亮目录在LISTBOX中的序号,* pBuffer为该目录内容的缓存区,MaxSize为高亮目录最大字节数。
设置LISTBOX的水平自动滚动步进:
LISTBOX_SetAutoScrollH (LISTBOX_Handle hObj, int OnOff)
hObj为LISTBOX部件句柄,OnOff为点击LISTBOX滑动条时,窗口目录自动水平滚动步进的大小。
设置LISTBOX的垂直自动滚动步进:
LISTBOX_SetAutoScrollV (LISTBOX_Handle hObj, int OnOff)
hObj为LISTBOX部件句柄,OnOff为点击LISTBOX滑动条时,窗口目录自动垂直滚动步进的大小。
设置LISTBOX目录水平卷动步进:
LISTBOX_SetScrollStepH (LISTBOX_Handle hObj, int Value)
hObj为LISTBOX部件句柄,Value为步进大小。
在执行回调函数中响应源窗口下的各个部件动作的时候,一般是在WM_NOTIFY_PARENT消息下来进行。在WM_NOTIFY_PARENT消息下,获取源窗口各个部件的ID以及窗口部件的数值。
如图所示,先判断目标窗口返回的消息是否是WM_NOTIFY_PARENT,如果是则获取源窗口返回的Id和消息的数值。根据消息的数值再去判断Id属于哪个部件,然后根据部件的动作,实现不同的 *** 作。
2 主菜单下子菜单的添加与功能设置
2.1建立菜单
MENU_CreateEx(int x0, int y0, int xSize, int ySize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id)
x0,y0,菜单起始坐标;
xSize,ySize,菜单框的宽度与高度;
hParent,菜单所在父窗口句柄;
WinFlags,菜单显示属性;
ExFlags,菜单框属性;
Id,菜单框ID;
先利用直接建立菜单函数建立一个空菜单框,然后再往空菜单框中添加子菜单,来实现一个菜单栏下有多级子菜单的效果。
在主菜单栏下添加子菜单实现方法
先建立一个菜单栏结构体(MENU_ITEM_DATA 为菜单结构体),然后对结构体内的各个成员初始化赋值即可。
hMenu, 为主菜单句柄,即该子菜单所在的菜单栏的句柄。
hSubmenu,为该子菜单的句柄。
*pText, 为子菜单名称。
Id, 为当前子菜单的ID。
Flags,为当前子菜单的附加属性。
常用建立添加有子菜单栏的菜单栏方法
先建立一个主菜单,然后在该主菜单栏下添加子菜单即可实现。添加完子菜单之后,用户只需要点击相应的菜单该菜单下的子菜单会自动d出,无需用户自己写d出函数。
在前一子菜单与后一子菜单之间加一条分隔线:
_AddTaskMenuItem(hMenuStart,0,0,0,MENU_IF_SEPARATOR)
将已经准备好的菜单粘贴到指定的窗口上:
MENU_Attach(MENU_Handle hObj, WM_HWIN hDestWin, int x, int y, int xSize, int ySize, int Flags)
hObj,菜单句柄。
hDestWin,窗口句柄。
x,y,xSize,ySize,为菜单在窗口中的位置及菜单的高度与宽度。
Flags,菜单显示属性。
2.2 菜单回调函数
菜单回调函数通常写法
菜单建立之后返回的消息
MENU_ON_ITEMSELECT,当该菜单被选择时所收到的消息。
MENU_ON_INITMENU,对建立的菜单初始化。
MENU_ON_ITEMSELECT,当前菜单被选择时所收到的消息,根据该消息再来判断该菜单下子菜单的ID。
4.3.1简介
uC/GUI的窗口管理是个单独的软件,不是uC/GUI的基本组成部分。周详代码见\uCGUI\GUI\WM。
当使用uC/GUI窗口管理时,任何能显示在显示终端上的内容都包含在一个窗口里面,这个窗口是LCD屏幕上的一个给用户画图或显示目标的区域。窗口能够是任何尺寸的,能够一次在屏幕上显示多个窗口,也能够在其他窗口当中或之前显示窗口。
窗口管理的几个名词:
活动窗口:
当前正在用来画图或是显示 *** 作的窗口。回调函数
回调函数是由用户定义的,当特定事件发生时,指示图像系统调用特定函数的函数。通常当窗口的内容发生改变时,他们用
来自动重绘窗口。例如,窗口内显示一幅位图,当窗口移动时,位图并不会自动移动,此时,就需要调用回调函数对窗口进行重绘,即,从观众的角度来看,移动窗
口和窗口内容。子/父窗口
子窗口是相对于父窗口定义的窗口。无论何时,只要父窗口移动,则子窗口们都要相应移动。子窗口被父窗口完全包含。拥有同一个父窗口的子窗口们互相间称为兄弟。客户区
窗口的客户区就是窗口的可用区。假如窗口包含方框或标题栏,则客户区就是方框或标题栏的内部区域。句柄
当一个新的窗口被创建时,WM分配一个唯一的标识符,称为句柄。句柄用在后续对该窗口 *** 作的任何函数中,而且能够利用该句柄唯一标识该窗口。有效窗口/无效窗口
有效窗口是个已完全更新,无需重绘的窗口。不管是完全重绘还是局部重绘。当窗口内容发生改变时,WM则标识窗口无效。下一次重绘之后(调用回调函数),窗口又变为有效。
4.3.2回调机制
uC/GUI提供给窗口和窗口控件的回调机制的背后,是一
个事件驱动标志。在大多数的窗口系统中,流控不但仅时从用户程序到图像系统,而且还要能够从用户程序到图像系统,并且能够通过用户程序提供的回调函数,返
回到用户程序。这个机制,就称为回调机制。在uC/GUI中,回到机制用来在窗口管理中出控制窗口的重绘 *** 作,这使得窗口管理的有效性成为可能。
4.3.3回调函数的使用
使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型:
void callback (WM_MESSAGE *pMsg)。其中pMsg为指向消息的指针。
回调函数执行的功能依赖于所接收到的消息。以上原型后一般跟着switch表达式,表达式定义不同的case表达式下不同的信息对应的不同行为,至少要有一个重绘函数:WM_PAINT()。如程序清单4.1,建立一个自动更新窗口的回调函数
程序清单 4.1 建立一个自动更新窗口的回调函数
void WinHandler (WM_MESSAGE * pMsg)
{
switch (pMsg->MsgId)
{
case: WM_PAINT GUI_SetBkColor(0xff00)
GUI_Clear()
GUI_DispStringAt(“hello world”,0,0)
Break
}
}
使用回调函数,更为周详的示例如程序清单4.2所示:
程序清单4.2 回调函数
#include GUI.H
/* 背景窗的回调函数*/
static void cbBackgroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_Clear()
default: WM_DefaultProc(pMsg)
}
}
/* 前景窗的回调函数*/
static void cbForegroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_SetBkColor(GUI_GREEN)
GUI_Clear()
GUI_DispString(Foreground window)
default: WM_DefaultProc(pMsg)
}
}
/* 回调机制 */
static void DemoRedraw(void)
{
GUI_HWIN hWnd
while(1)
{
/*创建一个前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100, WM_CF_SHOW, cbForegroundWin, 0)
/*显示前景窗*/
GUI_Delay(1000)
/* 删除前景窗 */
WM_DeleteWindow(hWnd)
GUI_DispStringAt(Background of window has not been redrawn,10, 10)
/* 等待,显示并不重绘 */
GUI_Delay(1000)
GUI_Clear()
/* 配置背景窗的回调功能 */
WM_SetCallback(WM_HBKWIN, cbBackgroundWin)
/*创建一个前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100,WM_CF_SHOW, cbForegroundWin, 0)
/* 显示前景窗*/
GUI_Delay(1000)
/*删除前景窗 */
WM_DeleteWindow(hWnd)
/* 等待,显示将重绘*/
GUI_Delay(1000)
/* 删除回调函数*/
WM_SetCallback(WM_HBKWIN, 0)
}
}
void main(void)
{
GUI_Init()
DemoRedraw()
}
4.3.4 消息传递机制
程序清单4.2中,回调函数执行的功能依赖于所接收到的消息。Switch语句中根据消息的类型,分别执行不同的功能。
WM_MESSAGE的成员如下:
MsgId:消息类型
HWin: 目的窗口
HWinSrc: 源窗口
Data.p : 数据指针
Data.v: 数据值
其中MsgId的类型如下:
WM_PAINT: 窗口重绘
WM_CREATE: 窗口一建立就发送
WM_DELETE: 窗口一删除就发送
WM_SIZE : 窗口尺寸发生改变就发送
WM_MOVE : 窗口移动就发送
WM_SHOW : 接收到show命令就发送
WM_HIDE : 接收到hide命令就发送
WM_TOUCH: 触摸屏信息
应用程序还能够为自己定义额外的消息。为确保他们不用到uC/GUI的消息ID,用户定义的消息从WM_USER后面开始,如:
#define MY_MESSAGE_AAA WM_USER +0
#defineMY_MESSAGE_BBB WM_USER +1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)