您好:用法就是这么用:
void main(void)
{
GUI_Init();
FRAME_Initialize(); //CreateDialog啥的
while(1)
{
GUI_TOUCH_Exec();
//GUI_TIMER_Exec();
GUI_Exec();
GUI_Delay(50);
}
}
复制代码
没必要再开一个线程再开一个线程会非常非常的麻烦
因为GUI_Exec()的时候绘制一次屏幕一次绘制获取一次触摸屏就可以了
触摸屏原理很简单0-4096的值映射到屏幕分辨率大约是
RectA {500, 500, 3300, 3300} RectB {0 , 0, 320, 240}
也就是点 1000,1000 时落在 RectA中映射到RectB中也就求出坐标了。
当点在 100,100时 没有落在RectA和RectB中折合到RectB中大约是 (-50,-50)的样子也不在RectB内。
也就是每次都取点判断是否PointInRect在区域内为1 不在区域内为0。
记录前一次状态为A当前状态为B。
A B
0 0 什么事都没发生。
0 1 按下
1 1 按住或拖动
1 0 松开
这个就是ucGUI的触摸屏按下松开的原理和中断没有一点关系这也是主流GUI的处理方法。
不过ucGUI的触摸屏部分做的并不好非常简单的过程写的异常麻烦尤其是校准部分。
UCGUI多级菜单设计
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,窗口建立时起始位置。
12 回调函数
一般来说,每一个窗口的建立都会附带有一个属于该窗口的回调函数,利用回调函数来实时更新窗口的内容。
UCGUI中为窗口和窗口对象(控件)提供的回调机制实质上是一个事件驱动系统。正如在大多数视窗系统中一样,原则是控制流程不只是从用户程序到图形系统(用户程序调用图形系统函数来更新窗口),而且可以从用户程序到图形系统,同时也可以从图形系统回到用户程序,意思是图形系统也可以调用用户程序提供的回调函数来达到更新窗口的目的。这种机制常常表现好莱坞法则的特点(“不要打电话给我们,我们会打电话给你”)---主要是视窗管理器为了启动窗口重绘的需要。与传统程序比较有差异,但它使对视窗管理器的无效逻辑开发成为可能。
回调函数的执行行为依赖于它收到的消息类型。上面的函数原型通常带有一个开关声明,用于定义了对于不同的使用一个或者更多的事件声明的消息所采用的不同的处理方式(典型的至少有对WM_PAINT()的处理)。
回调函数需要获得的信息包括有:目标窗口、目标窗口的消息、源窗口、源窗口下部件的ID等信息。
回调函数中可以通过获取目标窗口,然后在获取目标窗口下的各个部件的ID,这时可以根据窗口的消息类型来初始化各个部件,如消息是WM_INIT_DIALOG时,可以直接对窗口进行初始化设置,例如设置按钮按下之后的背景色、设置窗口的字体大小等。如果要使用回调函数实时更新各个窗口,必须要运行GUI_Exec()或WM_Exec函数。
13 常用窗口初始化函数解析
窗口初始化方式有两种,一种是在新建窗口时初始化,第二种则是利用回调函数初始化窗口。使用在新建窗口时初始化的方法与回调函数中初始化窗口差不多,在新建窗口时给窗口一个指定的句柄,在利用常用的窗口初始化函数对窗口句柄进行初始化即可。
在回调函数中对窗口初始化应该注意,进入回调函数就立即获取窗口句柄,同时必须要用缓存保存从窗口中获取的各个部件的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为窗口标题的字体,一般用GUIH中UCGUI自带的字体即可,用户也可自定义GUI支持的字体,GUI自带的字体只支持英文的,不支持中文字体,如果需要显示中文字体,用户要用GUI字库生成软件生成,在添加进工程才行。
设置窗口标题字体显示的对齐方式函数:
FRAMEWIN_SetTextAlign(FRAMEWIN_Handle hObj, int Align)
hObj为源窗口句柄,Align为窗体标题显示对齐方式,其取值一般有:左对齐,右对齐,居中等,这些参数在GUIH函数中已经被定义为宏,用户根据需要直接使用即可。
设置窗口标题的显示颜色:
FRAMEWIN_SetTextColor (FRAMEWIN_Handle hObj, GUI_COLOR Color);
hObj为源窗口句柄,Color为标题颜色,参数在GUIH中被定义为宏。
设置窗口标题栏高度:
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 主菜单下子菜单的添加与功能设置
21建立菜单
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,菜单显示属性。
22 菜单回调函数
菜单回调函数通常写法
菜单建立之后返回的消息
MENU_ON_ITEMSELECT,当该菜单被选择时所收到的消息。
MENU_ON_INITMENU,对建立的菜单初始化。
MENU_ON_ITEMSELECT,当前菜单被选择时所收到的消息,根据该消息再来判断该菜单下子菜单的ID。
101度开水继 手把手教你在stm32上移植ucgui之后又推出了首套UCGUI的视频教程,从源码开始讲起,分析了ucgui的初始化 内存管理 底层调用 消息机制 回调函数 剪切算法 ,配合相应的例程可以帮助ucgui爱好者更好的学习ucgui。最后101度开水在ucgui基础上创作了多个控件使ucgui更加实用。
百度搜索 首套UCGUI视频教程 即可获取更加详细的信息
SendMessage(hEdit, WM_SETTEXT, 0, "123") 另个进程的也一样。获取到hEdit句柄即可。 获取edit: p->GetDlgItem(nid); 编辑框的id是啥?不知道就猜吧,或用一个for循环试出来。 当然,这样也行:你用SPY++指向那个控件,点确定。然后在
首先在WM_exec1中调用了WM_pfHandlePID即 WM_HandlePID
这个函数首先根据当前的坐标判断出当前的窗口句柄,之后会发WM_TOUCH消息
此消息在按钮回调函数中被 _OnTouch进行处理
当按钮被释放后 在OnTouch中会调用
_ButtonReleased(hObj, pObj, WM_NOTIFICATION_RELEASED);
在_ButtonReleased中调用了GUI_StoreKey(pObj->WidgetId);将其值赋给_Key全局变量
第二个问题 我不是很懂,我个人的 理解就是 ,ucgui是支持外部键盘输入的,也就是说,当你的应用中加入了一个外部键盘输入,那么你就要自己写按键处理,通过调用GUI_StoreKeyMsg这个函数,来被ucgui处理。
ucgui刚接触没多久,不知道是不是这样。
以上就是关于ucGUI中如何用GUI_TOUCH_Exec()来做一个Button触摸响应全部的内容,包括:ucGUI中如何用GUI_TOUCH_Exec()来做一个Button触摸响应、UCGUI如何设置菜单系统、如何学习ucgui等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)