第49章emWin(ucgui)MESSAGEBOX-消息框控件

合集下载

C#winform中MessageBox用法大全(附效果图)

C#winform中MessageBox用法大全(附效果图)

C#winform中MessageBox用法大全(附效果图)C# winform 中MessageBox用法大全(附效果图)2012-11-22 09:34 33648人阅读评论(0) 收藏举报分类:Winform(25)我们在程序中经常会用到MessageBox。

MessageBox.Show()共有21中重载方法。

现将其常见用法总结如下:1.MessageBox.Show(“Hello~~~~”);最简单的,只显示提示信息。

2.MessageBox.Show(“There are something wrong!”,“ERROR”);可以给消息框加上标题。

3.if(MessageBox.Show(“Delete this user?”, “Confirm Message”, MessageBoxButtons.OKCancel) == DialogResult.OK) {//delete}询问是否删除时会用到这个。

4.if(MessageBox.Show(“Delete this user?”, “Confirm Message”,MessageBoxButtons.OKCancel,MessageBoxIcon.Question) ==DialogResult.OK){//delete}可以给MessageBox加上一个Icon,.net提供常见的Icon共选择。

5.if(MessageBox.Show(“Delete this user?”, “Confirm Message”, MessageBoxButtons.OKCancel, MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) == DialogResult.OK){//delete}可以改变MessageBox的默认焦点,如下:6.if(MessageBox.Show(“Delete this user?”, “Confirm Message”, MessageBoxButtons.OKCancel, MessageBoxIcon.Question,MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading) == DialogResult.OK) {//delete}反向显示:7.if(MessageBox.Show(“Delete this user?”, “Confirm Message”, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign,true) == DialogResult.OK) {//delete}添加Help按钮:8.if(MessageBox.Show(“Delete this user?”, “Confirm Message”, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading, @”/folder/file.htm”) == DialogResult.OK){//delete}指定帮助文件的路径,点击即可打开该路径下的帮助文件。

emWin(UCGUI)STemWin外语支持(精品)

emWin(UCGUI)STemWin外语支持(精品)

第17章STemWin外语支持本期教程的主要内容来自官方的用户手册,我这里专门的把这里的内容整理出一章主要是通过一些实例来帮助大家理解。

阿拉伯语、泰语或汉语等外语文本一般含有emWin标准字体以外的字符。

本章将介绍一些基本知识,比如定义全球所有可用字符的Unicode标准,以及UTF-8编码方案,emWin 使用该方案来解码以Unicode字符编写的文本。

同时还将说明如何启用阿拉伯语支持,以及如何采用Shift-JIS(日本工业标准)编码方案来显示文本。

17. 1 Unicode17. 2 阿拉伯语支持17. 3 泰语支持17. 4 Shift JIS支持17. 5 总结17.1Unicode关于unicode的编码方面的知识在百度百科或者wiki百科上面有详尽的介绍,初学的一定要认真的看一下,了解这方面的知识对于以后学习大有裨益。

这里我们主要的介绍一下UTF-8。

17.1.1UTF-8 编码方案Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。

Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。

码位就是可以分配给字符的数字。

UTF-8,UTF-16,UTF-32都是将数字转换到程序数据的编码方案。

ISO/IEC 10646-1定义了一种称为通用字符集(UCS)的多八位字符集,收入了全球大多数文字系统。

然而,多八位字符并不兼容许多现有的应用程序和协议,因此就扩展出了一些各有特色的UCS转换格式(UTF)。

举个例子帮助大家理解,在Unicode中,汉字“字”对应的数字是23383(十进制),十六进制表示为0x5B57。

在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8,UTF-16,UTF-32。

UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。

emwin快速设计界面的方法 -回复

emwin快速设计界面的方法 -回复

emwin快速设计界面的方法-回复如何使用emwin快速设计界面。

emwin(Embedded Wizard)是一种用于嵌入式系统开发的图形用户界面(GUI)设计工具,它提供了丰富的组件库和定制化选项,使开发人员能够快速设计和开发高质量的用户界面。

本文将分为以下几个步骤,介绍如何使用emwin快速设计界面。

第一步:准备开发环境在使用emwin之前,需要先准备好开发环境。

首先,确保你的嵌入式系统支持emwin,并已经安装了emwin的开发软件包。

然后,根据开发系统的要求,配置好编译器和调试工具。

最后,在你的开发板上连接显示屏,并确保能够正确驱动显示。

第二步:创建新工程在emwin的开发环境中,创建一个新的工程是开始设计界面的第一步。

打开emwin的开发软件包,并选择“新工程”选项。

根据你的项目需求,设置工程的名称和路径。

然后,选择一个适当的目标设备和显示分辨率,并设置其他工程属性。

点击“确定”按钮,创建一个新的emwin 工程。

第三步:设计界面在emwin的工程中,设计界面是一个非常重要的任务。

emwin提供了一个方便的可视化界面设计器,可以让你通过拖放组件来快速创建用户界面。

首先,选择一个适当的窗口尺寸,并在界面设计器中创建一个新窗口。

然后,在工具箱中选择你需要的组件(如按钮、文本框、图像等),并将它们拖放到窗口中。

接下来,通过调整组件的大小和位置,以及设置组件的属性,来定制化界面。

emwin的界面设计器支持多种属性设置,例如背景颜色、文字字体、按钮样式等。

通过设置这些属性,你可以根据你的项目需求来设计出一个高效美观的界面。

第四步:添加交互逻辑设计一个界面只是第一步,为了使界面具有实际的功能,还需要添加一些交互逻辑。

emwin提供了一种基于事件的编程模型,可以让你很方便地添加交互逻辑。

通过选择一个组件,并在属性面板中设置事件回调函数,你可以将该组件与一个自定义的处理函数进行关联。

在处理函数中,你可以针对不同的事件类型(如按钮点击、滑动等)编写相应的逻辑。

emwin消息机制

emwin消息机制

emwin消息机制
emWin的消息机制是其核心部分,负责处理所有在触控界面上的操作。

例如,当用户触摸一个按钮、滚动条或编辑框等控件时,都会触发窗口管理器去处理这些消息。

处理完消息后,会跳转到窗口回调函数的相应部分,在这些部分中添加所需的功能。

emWin的窗体管理基本框架也是基于窗体消息处理机制,即对窗体内的事务处理都是将各个事件作为窗体消息来响应执行。

例如,当程序首次启动或者窗口被移动时,系统就会触发WM_PAINT消息以重绘页面。

emWin的消息机制不仅包括了消息结构与类型的概念,还涉及到窗口回调机制的应用。

通过这样的机制,可以高效地处理各种用户交互事件,并实现相应的功能。

uCGUI使用

uCGUI使用

uCGUI使⽤最好多参考⼏篇⽂章,⽐如UC/GUI中⽂⼿册与emWin5_UM_SC0:画图函数GUI_DrawRect:在当前窗⼝中的指定位置绘制矩形(不填充,画线颜⾊为前景⾊)void GUI_DrawRect(int x0, int y0, int x1, int y1);在当前窗⼝中的指定位置绘制填充的矩形区域(填充前景⾊)(填充前景⾊)GUI_FillRect:在当前窗⼝中的指定位置绘制填充的矩形区域:清除矩形区域(为矩形区域填充背景颜⾊,图形界⾯⽤填充背景⾊达到清除屏幕的矩形区域填充背景颜⾊,图形界⾯⽤填充背景⾊达到清除屏幕的GUI_ClearRect:清除矩形区域(为)效果)效果1:存储设备不使⽤存储设备时,绘制操作直接写⼊显⽰器。

屏幕在执⾏绘制操作时随时更新,从⽽在进⾏各种更新时使屏幕闪烁。

如果在此过程中使⽤存储设备,则所有绘制操作都在存储器中执⾏。

仅在所有操作都完成后才将最终结果显⽰在屏幕上,其优点是没有闪烁。

如果不使⽤存储设备,则可以看到⼀步步的绘制操作效果,缺点是会出现显⽰器闪烁。

使⽤存储设备时,⼀次可见到所有例程的效果,就象单次操作⼀样,不能实际看见中间步骤。

以下例程是在使⽤存储设备时通常会调⽤的,基本⽤法⾮常简单:1. 创建存储设备(使⽤GUI_MEMDEV_Create() )。

2. 激活它(使⽤GUI_MEMDEV_Select() )。

3. 执⾏绘制操作。

4. 将结果复制到显⽰器中(使⽤GUI_MEMDEV_CopyToLCD() )。

5. 不再需要它时,删除该存储设备(使⽤ GUI_MEMDEV_Delete() )。

2:WM窗⼝管理器回调例程:回调例程由⽤户程序定义,指⽰在特定事件出现时图形系统调⽤特定的函数。

它们通常⽤于在窗⼝内容更改时⾃动重绘窗⼝。

窗⼝管理器的默认特性是向每个需要重绘的窗⼝发送⼀条 WM_PAINT 。

当⽤户对窗⼝有操作时,WM会发送相应的消息给该窗⼝,窗⼝可通过回调函数根据消息直接对屏(没有⽤存储设备时)或对窗⼝的存储设备进⾏操作再拷贝到屏幕上,具体的消息说明可以参考emWin的中⽂⼿册。

messageboxex的用法

messageboxex的用法

messageboxex的用法1.简介在编程领域中,`mes s ag eb ox ex`是一种常用的对话框窗口控件,用于在用户界面中显示信息、警告或错误消息。

它通常用于与用户进行简单的交互,如询问是否继续执行某个操作,或者提醒用户某些重要信息。

本文将介绍`m es sa ge bo x ex`的相关用法和常见选项。

2.基本语法使用`m es sa ge bo xex`函数,通常需要提供以下参数:```p yt ho nM e ss ag eB ox Ex(h wnd,te xt,c ap ti on,ty p e)```-`hw nd`:可选参数,指定消息框父窗口的句柄(如果有)。

-`te xt`:必需参数,指定消息框中显示的文本内容。

-`ca pt io n`:可选参数,指定消息框的标题。

-`ty pe`:必需参数,指定消息框的类型,如消息图标、按钮等。

3.消息框类型3.1.消息图标`t yp e`参数可以选择不同的消息图标,常见的选项包括:-`MB_I CO NE RR OR`:显示错误图标。

-`MB_I CO NW AR NI NG`:显示警告图标。

-`MB_I CO NI NF OR MAT I ON`:显示信息图标。

-`MB_I CO NQ UE ST ION`:显示询问图标。

3.2.按钮类型`t yp e`参数还可以选择不同的按钮类型,常见的选项包括:-`MB_O K`:只显示一个确定按钮。

-`MB_O KC AN CE L`:显示一个确定按钮和一个取消按钮。

-`MB_Y ES NO`:显示一个是按钮和一个否按钮。

-`MB_Y ES NO CA NC EL`:显示一个是按钮、一个否按钮和一个取消按钮。

4.示例代码以下是一个使用`mes s ag eb ox ex`的示例代码:```p yt ho ni m po rt ct yp esd e fm ai n():u s er32=c ty pe s.win d ll.u se r32m e ss ag eb ox=u se r32.Me ss ag eB ox Ex Wt e xt="这是一个示例消息框!"c a pt io n="消息框示例"显示信息图标和确定按钮r e su lt=m es sa ge box(No ne,t ex t,ca pti o n,ty pe)i f re su lt==1:p r in t("用户点击了确定按钮。

uCGUI(emWin)的应用与移植

uCGUI(emWin)的应用与移植

uCGUI(emWin)的应用与移植uC/GUI(emWin)的应用与移植 2006-11-19 01:38当你开始使用emWin进行编程时,通常遵循以下的步骤:第1步:配置emWin第一步通常是通过修改头文件LCDConf.h来配置emWin。

LCDConf.h中的宏定义描述了LCD显示部分硬件特性;根据你的具体情况修改这些宏定义(例如显示屏的长、宽,每像素点用几位表示,LCD控制器的类型等参数)。

第2步:定义LCD的底层驱动函数底层函数包括对LCD(控制器)的初始化函数,LCD显示缓冲区的读写函数等,完成对LCD显示硬件的直接操作。

对于映射在系统存储器上的LCD,对显示缓冲区的操作仅需要在LCDConf.h中进行定义就可以了。

但对于采用I/O端口/缓冲区操作的LCD,就必须定义相应的接口函数了。

第3步:编译,链接和测试例子代码emWin对于单任务和多任务环境下的应用都提供了例子代码。

在编程之前,对这些例子代码进行编译、链接和测试,使你能够初步了解这些代码的使用。

第4步:修改例子程序对例子代码作少量的修改。

逐步添加一些额外的指令,例如显示不同大小的文字,显示多行等等,从而进一步理解代码的应用。

第5步:emWin的多任务应用,加入到你的操作系统中如果你的系统有可能多个任务同时对显示进行操作,这时就要用到GUITask.C文件中的GUI_MAXTASK和GUI_OS宏。

第6步:采用emWin编写你自己的应用到这一步你应该对怎样使用emWin有一个清楚的了解了。

考虑如何采用emWin提供的函数来构建你的应用,并通过阅读手册来获得各函数更详细的功能和使用上的信息。

emWin的移植移植是指对emWin进行配置和修改,使它能够在你的目标系统上运行。

参考第3.4节中的第一步和第二步,移植工作主要是针对配置头文件中的宏定义进行修改。

这些宏包括:1. LCD宏,定义了显示的尺寸和一些可选择的特性(例如镜像,等等)2.LCD控制器宏,定义了怎样对控制器进行操作。

第47章emWin(ucgui)LISTBOX-列表框控件

第47章emWin(ucgui)LISTBOX-列表框控件

/* 设置输入焦点 */ GUI_DispStringAtCEOL("WM_SetFocus", 5, 55); GUI_Delay(SPEED * 0.9); WM_SetFocus(hListBox); GUI_Delay(SPEED * 0.7);
/* 设置字体 */ GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55); GUI_Delay(SPEED * 0.9); LISTBOX_SetFont(hListBox, &GUI_Font13B_1); GUI_Delay(SPEED * 0.7);
/* 设置相应的项目禁能 注意 0 是第一个项目 */ GUI_DispStringAtCEOL("LISTBOX_SetItemDisabled", 5, 55); GUI_Delay(SPEED); LISTBOX_SetItemDisabled(hListBox, 4, 1); GUI_Delay(SPEED * 0.75);
列表框已被点击,且指针已从列表框处移开,没有释放。
WM_NOTIFICATION_SCROLL_CHANGED 可选滚动条的滚动位置已更改。
WM_NOTIFICATION_SEL_CHANGED
列表框的选择内容已更改。
第1页 共8页
47.2官方 WIDGET_ListBox 实例
STM32-V5 开发板 STemWin 教程
/* 增加选项 */ GUI_DispStringAtCEOL("LISTBOX_IncSel", 5, 55); GUI_Delay(SPEED); NumEntries = LISTBOX_GetNumItems(hListBox); for (i = 0; i < NumEntries - 1; i++) {

实验1 创建对话框应用程序及控件使用

实验1 创建对话框应用程序及控件使用

实验1 创建对话框应用程序及控件使用一.实验目的1.掌握使用“MFC应用程序向导”创建对话框应用程序框架的方法2.掌握给对话框添加控件的方法,以及使用“MFC类向导”为控件通知消息映射消息处理函数的方法3.掌握使用“MFC类向导”为控件添加控件变量的方法4.掌握控件变量与控件的数据交换机制以及使用控件变量访问和控制控件的方法5.掌握对话框中添加自定义消息的方法二.实验内容1.创建一个Windows对话框应用程序,其界面要求实现以下功能:在下部的文本编辑框(Edit Control )中输入内容后,单击“添加”按钮,文本编辑框的内容被作为一个条目添加到上部的列表框(List Box)中2.为上一步创建的程序添加一条自定义消息,消息名为WM_MYMESSAGE,也可自己命名。

单击“添加”按钮时,将发送盖消息,该消息的处理函数将删除编辑框中已输入的所有内容。

三.实验步骤1.使用“MFC应用程序向导”创建一个对话框应用程序,项目名称编程者自己确定。

2.将主动生成的对话框中的静态文本控件和“取消”命令按钮删除,在窗口上部添加一个列表框(List Box)控件,在列表框中的静态文本控件和“取消命令按钮删除,在窗口上部添加一按钮左侧添加一个命令按钮(Button)控件.3.将“确定”按钮的caption属性修改为“退出”,新添加的命令按钮的caption属性修改为“添加”,修改对话框窗口的caption属性为“实验1”,调整各控件的大小和布局如上图所示。

4.为列表框控件添加一个控制变量,类别为control,变量名编程者自己确定,这里取名为m_list,为编辑框控件添加一个控制变量,类别为value,类型Cstring,变量名为m_Edit,也可由编程者自己确定。

5.为“添加”按钮添加并编写BN_CLICKED消息的消息处理函数,该函数代码如下:Void CShiyanDlg : : OnBnclickedButton1( ){//TODO:在此添加控件通知处理程序代码UpdateData(true); //将控件中的数据交换至控件变量If(!m_Edit . ISEmpty()) //如果编辑框内容不空,则将内容添加至列表框M_List . Addstring(m_Edit);}6.编译运行程序,在文本编辑框中输入内容并单击“按钮”,观察执行结果。

第49章emWin(ucgui)MESSAGEBOX-消息框控件

第49章emWin(ucgui)MESSAGEBOX-消息框控件

第49章MESSAGEBOX-消息框控件本期教程讲解STemWin支持的消息框控件。

49. 1 消息框控件介绍49. 2 官方DIALOG_MessageBox实例49. 3官方DIALOG_MessageBoxUser实例49. 4 总结49.1消息框控件介绍使用MESSAGEBOX控件可在带有标题栏和 “确定”按钮 (必须按下才能关闭窗口)的框架窗口中显示消息。

创建消息框或者创建并执行消息框仅需一行代码。

下表显示MESSAGEBOX小工具的外观:消息控件的使用比较简单,仅有两个相关的API:GUI_MessageBox()和MESSAGEBOX_Create()。

49.2官方DIALOG_MessageBox实例官方的这个实例很好的演示了MessageBox的使用,这个例子在模拟器中的位置:源码如下(程序中进行了详细的注释):---------------------------------------------------------------------- File : DIALOG_MessageBox.cPurpose : Example demonstrating GUI_MessageBoxRequirements: WindowManager - (x)MemoryDevices - (x)AntiAliasing - ( )VNC-Server - ( )PNG-Library - ( )TrueTypeFonts - ( )---------------------------------------------------------------------- */#include "GUI.h"#include "WM.h"/******************************************************************* ** Static code********************************************************************* *//********************************************************************* ** _cbBkWindow* 桌面窗口的回调函数*/static void _cbBkWindow(WM_MESSAGE* pMsg) {switch (pMsg->MsgId) {case WM_PAINT:GUI_SetBkColor(GUI_RED);GUI_Clear();GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font24_ASCII);GUI_DispStringHCenterAt("DIALOG_MessageBox - Sample", 160, 5);break;default:WM_DefaultProc(pMsg);}}/********************************************************************* ** Public code*********************************************************************** *//********************************************************************* ** MainTask*/void MainTask(void) {GUI_Init();/* 开启窗口使用内存设备 */#if GUI_SUPPORT_MEMDEVWM_SetCreateFlags(WM_CF_MEMDEV);#endif/* 设置桌面窗口的回调函数 */WM_SetCallback(WM_HBKWIN, &_cbBkWindow);//// 创建消息框,等待直到他被关闭//while (1) {GUI_MessageBox("This text is shown\nin a message box","Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE);GUI_Delay(750); // 延迟一段时间GUI_MessageBox("New message !","Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE);GUI_Delay(750);}}实际显示效果如下:49.3官方DIALOG_MessageBoxUser实例官方的这个实例很好的演示了MessageBox的使用,这个例子在模拟器中的位置:源码如下(程序中进行了详细的注释):/*********************************************************************** Static code************************************************************************//*********************************************************************** _CreateMessageBox*/static WM_HWIN _CreateMessageBox(const char * sMessage, const char * sCaption, int Flags, const GUI_FONT * pFont) {WM_HWIN hWin;WM_HWIN hItem;GUI_RECT Rect;hWin = MESSAGEBOX_Create(sMessage, sCaption, Flags);//// 设置消息框中标题的字体,消息框本质上也是框架窗口,所以这里可以直接的调用修改//FRAMEWIN_SetFont(hWin, pFont);//// 调整大小//WM_GetWindowRectEx(hWin, &Rect);WM_SetWindowPos(hWin, Rect.x0 - 15,Rect.y0 - 15,Rect.x1 - Rect.x0 + 1 + 30,Rect.y1 - Rect.y0 + 1 + 30);//// 设置按钮控件的字体//hItem = WM_GetDialogItem(hWin, GUI_ID_OK);BUTTON_SetFont(hItem, pFont);//// 调节按钮控件的大小//WM_GetWindowRectEx(hItem, &Rect);WM_SetWindowPos(hItem, Rect.x0,Rect.y0 + 10,Rect.x1 - Rect.x0 + 1 + 30,Rect.y1 - Rect.y0 + 1 + 5);//// 设置文本控件的字体//hItem = WM_GetDialogItem(hWin, GUI_ID_TEXT0);TEXT_SetFont(hItem, pFont);//// 调节文本控件的大小//WM_GetWindowRectEx(hItem, &Rect);WM_SetWindowPos(hItem, Rect.x0,Rect.y0,Rect.x1 - Rect.x0 + 1 + 30,Rect.y1 - Rect.y0 + 1 + 12);return hWin;}/*********************************************************************** _EnableSkinning*/static void _EnableSkinning(void) {FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);BUTTON_SetDefaultSkin (BUTTON_SKIN_FLEX);}/*********************************************************************** Public code************************************************************************//*********************************************************************** MainTask*/void MainTask(void) {GUI_Init();/* 使能皮肤 */_EnableSkinning();while (1) {GUI_SetFont(&GUI_Font20B_ASCII);GUI_DispStringHCenterAt("Applicatoin defined MESSAGEBOX", 160, 5);/* 执行已经创建的对话框 */GUI_ExecCreatedDialog(_CreateMessageBox("Message", "Caption", 0, &GUI_Font24));GUI_Clear();GUI_Delay(1000);}}实际显示效果如下:49.4总结本期教程主要是跟大家讲解了消息框的两种创建方法,一种是系统自带的,直接调用即可显示,也就是本期教程中的第一个例子。

UCGUI的模拟器UCGUISim详解

UCGUI的模拟器UCGUISim详解

UCGUI的模拟器UCGUISim详解本文转自感谢原作者(最近发现该网站已经撤销,不知道作者近况如何.想当初,他对我理解ucgui提供了很多支持和帮助呢!)。

联系方式: @一、问题的由来-----模拟器完成了什么在官方发布的UCGUI的源码包当中,附有很多的示例,源码与示例都打包成一个VC工程,在这个工程中我们可以编译和运行UCGUI的示例,进行UCGUI的图形编程,非常方便,这个工程结构下:Application-------UCGUI应用程序目录。

Config-------------UCGUI配制文件目录。

GUI----------------UCGUI源码文件。

Simulation--------模拟器库文件、模拟器头文件目录,主要有GUISim.lib这个提供模拟器的库文件。

System-------------应用程序的接口调用主文件,即调用用户的MainTask函数的m ain函数。

在这个官方提供的包中,我们进行UCGUI的图形编程时,大多都是将要写的程序源文件放加到Application目录中,其中应用程序中必不可少要提供的一个函数是MainTask(),好奇的朋友会发觉,我们程序并没创建窗口,为什么一运行就有窗口界面并有一个LCD 显示屏显示出自己的UCGUI程序的运行效果出来,其实这些我们看不到的代码都是写在GUISim.lib这个库文件当中的,为了了解模拟器具体做了些什么,我通过反编译,还原了官方模拟器的源码,下面详细介绍模拟器的构成[以下均为官方模拟器采用的方法]。

GUISim.lib主要完成以下几件事,具体的模块划分将在文中后面描述:1. 创建模拟器主窗口,这个窗体包括一些模拟器控制菜单,如打开LOG记录/打开调色板显示窗体/新建LCD模拟器窗体,以及暂停/继续模拟器。

2. 创建一个LCD模拟显示窗口并初始化其显示所需的各种数据结构,LCD窗口的大小由UCGUI中LCDConf.h中配制时指定(LCD_XSIZE/LCD_YSIZE),及其它的诸如每个象素占用多少位(LCD_BITSPERPIXEL),首先分配一块足够大的显存(4M)并初始化这块数据为0,每个象素占用不大于8位时模拟显示屏幕需要用到8位图,还必须初始化要用到的调色板。

UCGUI窗体管理及消息处理机制分析

UCGUI窗体管理及消息处理机制分析

1 UCGUI 窗体管理及消息处理机制分析----多对话框/模态窗体/透明窗体支持分析作者:ucgui日期: 2005-09-08[v1.0.0.0 2005-06-30完成]来源: 版本: v1.0.0.1问题的提出:[求助]关于对话框处理程序中,想在OK 按钮按下后想弹出一个消息框,该怎么做?直接加在程序中好像不行,如何让消息框弹出后成为模态窗体呢?请版主帮帮忙。

[解析]在UCGUI 中,对话框只支持单个对话框窗体,不支持多个独立的对话框,现在我们从其源码来分析一下它为什么支持单个对话框窗体以及如何改进它以支持多个独立对话框,要讲解这个问题我们必须首先理解UCGUI 中的窗体消息LOOP ,没有消息LOOP 窗体就是死水一潭,不能接受任何外界的输入,只是一个画在那里的图画而已。

[声明]本文中提到的源码均为UCGUI3.24版源码,新版UCGUI 源码会有改动,请下载本文示例代码来结合阅读本文。

摘要: 本文主要介绍了UCGUI 中的对话框的消息处理机制,并指出在现有UCGUI 上如何增加多窗体支持,并在分析解决问题时着重介绍了其输入设备消息WM_TOUTCH 及WM_KEY 两类消息处理方法,并同时初步指出一种在UCGUI 中实现模2 态对话框以及透明窗体的原理说明,不还有窗体重画消息WM_PAINT 消息处理原理。

一、各种基本消息介绍及处理流程----对话框内部消息流转及外部消息LOOP 分析.UCGUI 是采用的消息驱动的,它专门有对外的一套收集消息的接口, 我在模似器中, 就是通过LCD 模拟显示屏窗口的MOUSE 消息,将MOUSE 消息传入到这个接口中, 以驱动UCGUI 中的窗体的。

UCGUI 中的消息驱动其实与WINDOWS 的是类似的,几种基本的消息与WINDOWS 是一样的,但UCGUI 的更简单且消息更少,对于一些消息的处理得也很简化,没有WINDOWS 那么多的消息种类及复杂处理。

Delphi中MessageBox使用详解

Delphi中MessageBox使用详解

Delphi中MessageBox使用详解在Delphi中,MessageBox是一个用于显示消息框的函数。

消息框是一个常见的交互式对话框,用于向用户显示信息并等待用户响应。

MessageBox函数可以用于显示不同类型的消息框,包括警告、确认、错误等类型。

MessageBox函数有多个参数,包括消息文本、标题、按钮和图标等。

下面我们将详细介绍这些参数的使用。

1.消息文本:MessageBox函数的第一个参数是消息文本,即要显示给用户的消息内容。

消息文本可以是一个字符串常量或变量。

例如:```DelphiMessageBox(0, 'Hello world', 'Message', MB_OK);```这个示例代码将在消息框中显示"Hello world"。

2.标题:MessageBox函数的第二个参数是消息框的标题。

标题是可选的,如果不提供标题,默认为"Message"。

标题可以是一个字符串常量或变量。

3.按钮:MessageBox函数的第三个参数用于指定要显示的按钮。

有多种按钮类型可供选择,包括OK、Cancel、Yes、No等。

可以使用按位或运算符(,)将多个按钮组合在一起。

例如:```DelphiMessageBox(0, 'Are you sure?', 'Confirmation', MB_YESNO);```这个示例代码将显示一个带有"Yes"和"No"两个按钮的确认消息框。

4.图标:MessageBox函数的第四个参数用于指定要显示的图标。

有多种图标类型可供选择,包括信息、警告、错误等。

可以使用按位或运算符(,)将多个图标组合在一起。

例如:```DelphiMessageBox(0, 'Error occurred!', 'Error', MB_ICONERROR);```这个示例代码将显示一个带有错误图标的错误消息框。

Wincc中弹出对话框函数MessageBox参数以及应用

Wincc中弹出对话框函数MessageBox参数以及应用

Wincc中对话框弹出函数MessageBox参数以及应用按键显示://MessageBox(NULL,"这是一个默认的只有确定的消息框!","标题", MB_OK );//MessageBox(NULL,"这是一个确定取消的消息框!","标题", MB_OKCANCEL );//MessageBox(NULL,"这是一个是或否的消息框!","标题", MB_YESNO );//MessageBox(NULL,"这是一个是或否或取消的消息框!","标题", MB_YESNOCANCEL );//MessageBox(NULL,"这是一个重试或取消的消息框!","标题",MB_RETRYCANCEL );//MessageBox(NULL,"这是一个中止, 重试和忽略的消息框!","标题",MB_ABORTRETRYIGNORE ); 在消息框内显示的图标是以下值之一。

//MessageBox(NULL,"这是一个错误的消息框!","标题", MB_ICONHAND );//MessageBox(NULL,"这是一个错误的消息框!","标题", MB_ICONSTOP );//MessageBox(NULL,"这是一个错误的消息框!","标题", MB_ICONERROR );//MessageBox(NULL,"这是一个询问的消息框!","标题", MB_ICONQUESTION);//MessageBox(NULL,"这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );//MessageBox(NULL,"这是一个警告的消息框!","标题", MB_ICONWARNING);//MessageBox(NULL,"这是一个信息的消息框!","标题", MB_ICONASTERISK );//MessageBox(NULL,"这是一个信息的消息框!","标题", MB_ICONINFORMATION );//MessageBox(NULL,"这是一个两种属性的消息框!","标题", MB_ICONEXCLAMATION|MB_OKCANCEL ); 对话框弹出时默认选中的按钮://MessageBox(NULL,"这是一个多种属性的消息框!默认选中第三个按钮","标题", MB_ICONEXCLAMA TION|MB_YESNOCANCEL|MB_DEFBUTTON3 );返回值://if(MessageBox(NULL,"这是一个判断选择了哪个按钮的消息框!","标题", MB_ICONEXCLAMA TION|MB_OKCANCEL )==IDCANCEL)//return;。

第48章emWin(ucgui)MENU-菜单控件

第48章emWin(ucgui)MENU-菜单控件

口。对于已禁用的菜单项,也将发送此消息
MENU_ON_ITEMSELECT 选择菜单项之后将立即发送此消息给菜单的所有
者。ItemId 元素包含已按下的菜单项的 Id。
U16
ItemId 菜单项的 Id。
下面是一个 WM_MENU 的简单示例:
void Callback(WM_MESSAGE * pMsg) { MENU_MSG_DATA * pData; WM_HWIN hWin = pMsg->hWin; switch (pMsg->MsgId) { case WM_MENU: pData = (MENU_MSG_DATA *)pMsg->Data.p; switch (pData->MsgType) { case MENU_ON_ITEMACTIVATE: _UpdateStatusbar(pData->ItemId); break; case MENU_ON_INITMENU: _OnInitMenu(); break; case MENU_ON_ITEMSELECT: switch (pData->ItemId) { case ID_MENU_ITEM0: ... /* React on selection of menu item 0 */ break; case ID_MENU_ITEM1: ... /* React on selection of menu item 1 */
*/
#define ID_MENU
(GUI_ID_USER + 0)
#define ID_MENU_FILE_NEW (GUI_ID_USER + 1)
#define ID_MENU_FILE_OPEN (GUI_ID_USER + 2)

uCGUI中的窗口管理机制以及解决独立窗口并存的方法

uCGUI中的窗口管理机制以及解决独立窗口并存的方法

修改UCGUI源代码以支持多个独立窗体的说明发布时间: 2008-11-17 来源: 来自网络作者:匿名浏览: 2868问题的提出:关于对话框对话框处理程序中,ok按钮按下后想出现一个消息框。

但直接加在程序中好像不行,该怎么办?[独立窗体]------指该窗体的父窗体不是用户创建窗体,在UCGUI中其父窗体为句柄为1.一,消息处理的流程.ucgui是采用的消息驱动的. 它专门有对外的一套采集消息的接口, 我在模似器中, 就是通过LCD窗口的MOUSE消息,将MOUSE移动, 点击消息传入到这个接口中, 以驱动UCGUI中的事件的..UCGUI中的消息驱动, 其实与WINDOWS的是类似的, 几种基本的消息与WINDOWS是一样的, 但UCGUI的更简单, 消息更少, 没有WINDOWS那么多的消息种类. 在WINDOWS中, 我们最简单处理按钮事件的是在WM_COMMAND消息中, 通过按钮的标志ID来处理不同的按钮, 所以, 我们的按钮的标志ID都是不同的. 要不然无*区别开的.要处理点击OK这个按钮的事件, UCGUI的处理方*有些不同, 是在WM_NOTIFY_PARENT消息中处理: case WM_NOTIFY_PARENT:Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */NCode = pMsg->Data.v; /* Notification code */switch (NCode) {case WM_NOTIFICATION_RELEASED: /* React only if released */if (Id == GUI_ID_OK) { /* OK Button */GUI_EndDialog(hWin, 0);}if (Id == GUI_ID_CANCEL) { /* Cancel Button */GUI_EndDialog(hWin, 1);}break;}break;ucgui中的消息非常的少, 只有差不多不到二十种, 其实这对于嵌入式系统来说, 已经完全足够了, 用户可以自定义消息, WM_NOTIFY_PARENT这个消息是由你窗体传送过来的, 是由函数WM_NotifyParent(hObj, Notification)实现的.void WM_NotifyParent(WM_HWIN hWin, int Notification) {WM_MESSAGE Msg;Msg.MsgId = WM_NOTIFY_PARENT;Msg.Data.v = Notification;WM_SendToParent(hWin, &Msg);}这个函数相当简单, 其主要还是WM_SendToParent这个函数的调用, 这个函数又调用voidWM_SendMessage(WM_HWIN hWin, WM_MESSAGE* pMsg), 这个函数是最基本的一个消息处理函数, 它的第一个参数指定了接受这个要处理的消息的句柄, 第二个指定了是什么消息.这个函数的主要作是, 是调用相就窗口的消息处理函数来处理消息.比如说, 在这里,我们这个消息的处理过程是这样的, 首先, 你左键点击OK按钮, 那么在GUI_Exec()这个窗体消息LOOP处理当中, 首先将此消息(WM_TOUCH)传给OK按钮(注意这也是一个窗体), 然后, OK按钮的消息处理函数将此消息再以WM_NOTIFY_PARENT传送到你窗体---对话框当中, 这样, 对话框就可以处理到点击OK按扭这个事件了...其实这个消息处理的流程与WINDOWS也是类似的. 原理一样..理解了这个过程, 那么, 我们就可以这个消息中处理很多东西了, 只要是在对话框中的子控件, 一般的消息都可以如此处理.二,发现存在的问题----两个独立的窗口并立时, 当关闭其中一个, 另外一个不再有响应.在如下代码中处理弹出消息框, 点击对话框的OK后弹出消息框, 会出现当按对话框的Cancel关闭对话框后, 弹出的消息框就没有任何响应的情况. 或者是关闭掉弹出的消息框, 对话框就没有任何响应的情形. case WM_NOTIFY_PARENT:Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */NCode = pMsg->Data.v; /* Notification code */switch (NCode) {case WM_NOTIFICATION_RELEASED: /* React only if released */if (Id == GUI_ID_OK) { /* OK Button *//弹出消息框...GUI_MessageBox("This text is shown\nin a message box","Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE);GUI_EndDialog(hWin, 0);}if (Id == GUI_ID_CANCEL) {GUI_EndDialog(hWin, 1);}break;}经分析, 粗步的原因是, 调用MainTask的主线程已经退出了, 这个主线程是在模拟器中开启的, 它的主线程函数是Thread(), Thread函数里调用main, main再调用MainTask; 所以主线程退出后, 消息框再也没有任何反应了.这是从模拟器的角度来分析, 现在我们分析一下, 为什么MainTask的主线程会这么早退出呢? 深入UCGUI的源码, 可以知道, 对话框的消息处理函数是在如下的函数中调用的.int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets,WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0) //建立阻塞式对话框{_cb = cb;GUI_CreateDialogBox(paWidget, NumWidgets, _cbDialog, hParent, x0, y0);//建立非阻塞式对话框while (_cb) {if (!GUI_Exec())GUI_X_ExecIdle();//出现HardFaultException()中断的原因}return _r;}在如上的代码中我们可以看到, 当UCGUI中有一个独立的窗体退出后, _cb会被清为0, 此时退出GUI窗口LOOP. 即结束了UCGUI窗口消息处理.其实, GUI_MessageBox弹出的消息框其实也是一种对话框, 在这里我们就可以发觉UCGUI的窗口支持系统还不是非常的完备, 我们期待的结果是, 点击对话框的OK, 弹出消息框, GUI_EndDialog关闭掉对话框,消息框继续有反应, 如果没有在OK按钮中调用GUI_EndDialog关闭对话框, 则对话框与消息框都要能够正常反应.关于这个问题的解决, 我想还要进一步了解UCGUI窗口处理的细节.三.寻找问题的解决办法.在我们发现这个问题, 我们已经粗步分析了, 问题不是出在我们编写程序上, 而是UCGUI的内部, 那么要解决这个问题, 我们就要进一步了解UCGUI的窗口体系.其实换一句话说, 在嵌入式应用中, 窗口的强大直接决定到GUI系统的体积大小, 并不是所有的情况都要有这种支持, 也不一定说是UCGUI的BUG, 当然我们希望在下一版本不再有这个问题.下面是详细分析:1. 对话框void MainTask(void) {GUI_Init();WM_SetDesktopColor(GUI_RED); /* Automacally update desktop window */WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to **oid flicker */GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);}上面是我们创建对话框的程序, 是我们编写的代码, 具体看GUI_ExecDialogBox()这个函数代码如下, 它主要有以下两个作用:[1].创建对话框中的所有子窗体.[2].进入消息LOOP, 收集并转发消息到对应窗体进行处理. 消息如WM_TOUCH及WM_KEY, 这些消息被分发到对话框中各子窗体中去处理,父窗体(对话框)之所以能够处理其上子控件的消息,全都是因为子控件在传递消息, 父窗体中对子窗体的消息进行处理, 也可以不处理, 我们编程者要处理时, 则要清楚哪些消息是可以处理的, 不然无*编写程序, 所以子窗体中的消息一直都在往父窗体中发送, 与父窗体有无处理无关系.int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets,WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0){_cb = cb;GUI_CreateDialogBox(paWidget, NumWidgets, _cbDialog, hParent, x0, y0);while (_cb) {if (!GUI_Exec())GUI_X_ExecIdle();}return _r;}2. 消息框其实消息框本身就是一个只含静态文框及OK按钮的对话框, 在对话框的WM_NOTIFY_PARENT消息中弹出消息框:case WM_NOTIFY_PARENT:Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */NCode = pMsg->Data.v; /* Notification code */switch (NCode) {case WM_NOTIFICATION_RELEASED: /* React only if released */if (Id == GUI_ID_OK) { /* OK Button */GUI_EndDialog(hWin, 0);}if (Id == GUI_ID_CANCEL) { /* Cancel Button */GUI_EndDialog(hWin, 1);}break;}break;在关闭对话框之前弹出一个消息框, 当我们都不点击消息框与对话框的OK按钮来结束时, 他们都有反应也可以前后台切换, 不存在什么问题. 问题就出在关闭其中一个后, 其它的任何一个也无反应.这个原因, 在上面有过过粗步的分析, 但没有进入到UCGUI的实现机制内, 现在我们来看一下._cb = cb;while (_cb) {if (!GUI_Exec())GUI_X_ExecIdle();}这个LOOP, 其实它就是类似我们非常熟悉的WIN下面的消息LOOP, 其原理是一致的. _cb是什么东西呢? 这里我们可以看到, 它其实就是对话框的窗口消息处理函数, 这里面有一个判断, 就是_cb非空时, 才进行消息LOOP, _cb在Dialog.c中的定义如下:static WM_CALLBACK* _cb;_cb是一个全局变量! 我们程序中创建对话框与弹出消息框时两次调用了GUI_ExecDialogBox, 后一次的_cb将会把前面的值冲掉,我们程序中, 可以知道它是消息框的窗口消息处理函数地址. 由此可知道谁在后面调用, 则另外一个对话框的窗口消息处理函数根本就是无用的, 它的消息其实是被后来创建的对话框消息处理函数所处理的.在while中有判断, 那么证明_cb是在GUI_Exec所产生的调用中有使用的.进一步看, 可以看到, 调用的其实是如下面的箭头方向所指, 一步一步深入的, 其中最明显的一点就是, 窗口消息处理函数是在WM_SendMessage中通过函数指针的调用中, 注意[]内部的就是真正被调用来处理消息的函数, 它是将消息一步一步的传到真正要处理此消息的窗体中, 在这里其实就是后面弹出的消息框窗体.GUI_Exec--->GUI_Exec1-->WM_Exec--->WM_Exec1-->WM_HandlePID-->WM_SendMessage-->(*pWin->cb)(pMsg)[_FRAMEWIN_Callback]-->_OnTouch()--->(*cb)(pMsg)[_cbDialog]--(*_cb)(pMsg)[_MESSA GEBOX_cbCallback]WM_HandlePID()----------专门处理MOUSE消息的函数.WM_SendMessage()--------基层的分派消息的函数, 决定谁应该被调来来处理消息.这里面有些人会提出一个问题, 为什么消息框与对话框的消息都在后来创建的消息处理函数里面处理而不会引发什么问题呢?是的, 表面上看去, 消息框与对话框都好好的, 没什么异常, 但其实如果你在对话框中进行过消息的处理,那么你就可以很清楚的看到这些消息是从来不会发生的, 即使你在它的消息处理函数里下断点它也不会有任何中断.至于其它的一些常用的消息的处理, 对话框与消息没有什么区别, 最重要的消息就是重画, 重画的时候, 比如消息框与对话框有重叠的话, 当进行窗口前后切换将其中一个切换到前面来时, 会产生重画消息. 这样就会重新计算一次该画到屏慕上的东西, 不光要发重画消息到各窗口, 还会将整个屏慕的东西都重新计算一次, 并画出来. 这一点还是很复杂的, 须要进一步学习.是GUI图形的一个难点和重点. 以后再详细分析.进行到这里, 我们就可以比较明白的知道, 在点击OK后, 无论是消息框还是对话框, 哪一个先被关掉, 都会调用下面的GUI_EndDialog. 这里, _cb被清为零, 也就意味着消息LOOP到此结束了. 所以后面另外一个未被关掉的当然不会再有任何响应了.void GUI_EndDialog(WM_HWIN hWin, int r) {_cb = NULL;_r = r;WM_DeleteWindow(hWin);}原因我们分析出来了. 现在我们要解决这个问题, 那还差一大步, 还有很多问题要进一步弄清, 为什么UCGUI是这样的机制.要如何解决. 将会在下一步仔细学习分析.楼主再仔细读一下我的分析, 结合实际自己也来分析一下, 问题虽然小, 但其实隐藏着的问题不小. 你的所言其实还是没有理解清楚问题, 因为你所说的HIDE对话框. 其实没有点着问题实际, 我们现在所讲的是UCGUI对于多个独立窗体的消息处理支持. UCGUI不完善.对这个目前没有支持. 你要深入到这一点来理解问题.再仔细看下我的分析. 有什么问题再提, 结合实际, 进行源码调试, 对于问题会有更多的了解....四. 进一步分析找到解决办*.点击对话框的OK按钮后, 其实这个时候, 由于消息框是对话框后弹出来的,那么这个消息框的消息处理函数_MESSAGEBOX_cbCallback则成为_cb的值了, 那么以后对话框与消息框的消息处理都是在消息框的_MESSAGEBOX_cbCallback里面处理的, 如果你是在点击对话框的OK按扭之后弹出消息框.如下: case WM_NOTIFY_PARENT:Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */NCode = pMsg->Data.v; /* Notification code */switch (NCode) {case WM_NOTIFICATION_RELEASED: /* React only if released */if (Id == GUI_ID_OK) { /* OK Button */GUI_MessageBox("This text is shown\nin a message box","Caption/Title",GUI_MESSAGEBOX_CF_MOVEABLE);GUI_EndDialog(hWin, 0);}if (Id == GUI_ID_CANCEL) {GUI_EndDialog(hWin, 1);}那么, 程序执行到弹出消息框之前, 消息WM_NOTIFY_PARENT 都是由对话框的消息处理函数_cbCallback处理的, 在弹出消息框之后, 如我们在(二)上面的分析, 就知道以后的消息都是由消息框的_MESSAGEBOX_cbCallback来处理的, 此时, 在消息LOOP中马上又会发现上一次的MOUSE消息, 因为这个点击OK产生的消息还在, 并没有产生新的消息, [说来其实UCGUI中的消息是没有什么队列的, 是接收一个处理一个, 即时处理那种, 这样就简单了很多,] 那么又一次进行WM_NOTIFY_PARENT的GUI_ID_OK按钮的处理, 只不过这个处理是在消息框的_MESSAGEBOX_cbCallback函数中进行的, 在这个函数里面默认的对于GUI_ID_OK的处理就是调用GUI_EndDialog(hWin, 1); 一旦调用这个函数, 那么产生的结果就如同先前分析的,会导致WM_DeleteWindow的调用, 而将_cb的值清为空, 并清除hWin 及其所有了窗体. 从而结束了LOOP消息处理.所以, 我们可以看到, 在点击对话框的OK后, 弹出消息框, 之后即使我们不调用清除对话框的函数, 什么也不做. 也会导到消息LOOP结束, 退出所有窗口消息的处理.其实, 须要进一步说明的是, 在UCGUI中, 似乎在设计时只是支持单窗口的消息处理, 如果要多窗口的支持, 可以如同示例中一样, 启用多任务支持, 不然, 在单任务下, 一个MainTask中只能支持一个独立窗体, 但是, 显然我们如果只是为了要弹出一个消息框而启动一个任务, 这未免太不实际.解决的办*, 还是有的, 那就是了解UCGUI, 自己来修改. 可以如下做-------[如上创建一对话框及消息框, 对话框与消息框即为如下所讲的外部独立窗体]1. 经过详细的分析, 认识到在消息处理中, 创建一个独立窗体, 则其窗口消息处理函数就会成为整个UCGUI中的消息的外部接收口, 用户所能处理到所有消息均在此处接收到.2. 如果在后来在创建独立窗体, 则后来的窗口的消息处理函数代替了先前创建的窗口的消息处理. 那么, 如果不使它替代, 而是用一个数组将所有消息处理函数都存放起来, 然后在内部将消息往外传的地方(即外部独立窗口消息函数被调用处)修改成调用所有非空的外部独立窗口消息处量函数(而不是单个).这样就可以达到每个独立窗口消息处理函数都被调用, 各自独立运行. 但要注意和解决的问题是, 消息该如何分配到各独立窗口.3.在清除独立窗体时, 只是将此独立窗体对应的消息处理函数清零, 并清除该窗体及其的所有子窗体. 使其不再处理消息.那么. 我们在点击OK关闭对话框, 也就是清除对话框并让其退出消息接收. 对于弹出的消息框, 我们希望它作为一个新的独立窗体而进入窗体消息接收与处理. 就达到了我们的目的.这是理论上的分析. 我将把实际修改后的东东也发上来, 做一示例.五. 对UCGUI源码做出部分修改以实现多独立窗口支持.[2005-6-30 2:30]在第三节当中, 我们通过进一步的分析源码, 大致找到了解决问题的办*, 但那只是理论上的指导, 实际上的修改其实还会带来其它的很多问题, 因为在UCGUI体系中, 对其源码作出改动, 一定都会影响到其它的地方, 现在我们就实际的源码修改说明几点要注意的问题:1、将原来的_cb一个变量, 修改成一个结构为new_cb的结构数组,有10个元素,/static WM_CALLBACK* _cb;typedef struct win_cb{WM_CALLBACK* _cb;WM_HWIN hwin; /_cb消息函数对应的窗口..WM_HWIN hclient;/_cb消息函数对应的窗体窗户区...}new_cb,*lpnew_cb;static int dialog_pos = 0;/在数组中当前可用作存窗体消息函数的元素.static int MAX_DIALOG = 10;/最多可支持打开的独立窗口数, 其实可以改成支持无数个,但这里作简单处理int checkHasDialog(); /检查是否还有独立窗体存在, 以决定是否退出消息LOOP...int getDialogIndex(lpnew_cb lp_cb);/获取当前可用于存放独立窗体的位置索引, 创建新独立窗体时调用. static new_cb _cb[10]; /独立窗口数组创建一个新的独立窗体, 将此窗体加入到独立窗体数组当/中时, 必须注意几个问题,在如下的新旧代码对比中说明:/新修改后的创建对话框的函数...int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0){/ _cb = cb;dialog_pos = getDialogIndex(_cb);if(dialog_pos != -1) _cb[dialog_pos]._cb = cb;else return _r;GUI_CreateDialogBox(paWidget, NumWidgets, _cbDialog, hParent, x0, y0);/ while (_cb) {/* 2005-6-30 0:20:16while (checkHasDialog()) {if (!GUI_Exec())GUI_X_ExecIdle();}*/return _r;}/旧的创建对话框的函数...int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget,int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0){_cb = cb;GUI_CreateDialogBox(paWidget, NumWidgets, _cbDialog, hParent, x0, y0);while (_cb) {if (!GUI_Exec())GUI_X_ExecIdle();}return _r;}WM_HWIN GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,int x0, int y0){WM_HWIN hDialog = paWidget->pfCreateIndirect(paWidget, hParent, x0, y0, cb); /* Create parent window */WM_HWIN hDialogClient = WM_GetClientWindow(hDialog);_cb[dialog_pos].hwin = hDialog;_cb[dialog_pos ].hclient = hDialogClient; /加到GUI_CreateDialogBox中的,其余不变...WIDGET_OrState(hDialog, paWidget->Flags);........}[1]、getDialogIndex(_cb),创建新的独立窗体前,首先就要在独立窗体数组中查找空位置,如果独立窗体已达最大数,则不可再加入独立窗体,这里我做的是简单处理,没有用到动态内存分配,将独立窗体数组扩大,主要是因为是演示,读者自己可以试度支持无限独立窗体。

深入理解ucGUI消息处理机制如何实现

深入理解ucGUI消息处理机制如何实现

FRAMEWIN_Handle FRAMEWIN_CreateAsChild( int x0, int y0, int xsize, int ysize, WM_HWIN hParent, const char* pText, WM_CALLBACK* cb,j; /* Create the window */
问这个特殊的节点才能进入我们用户定义的回调函数, 我们才能利用 GUI 干我们自己想做的 事情。好了注意到这一点之后,我们再来分析这主窗口和客服窗口的回调函数。
WM_HWIN WM_CreateWindowAsChild( int x0, int y0, int width, int height ,WM_HWIN hParent, U16 Style, WM_CALLBACK* cb ,int NumExtraBytes) { ; WM_Obj* pWin pWin; WM_HWIN hWin; WM_LOCK(); Style |= WM__CreateFlags; /* Get Parent info */ if (!hParent) { if (WM__NumWindows) { hParent = WM_HBKWIN; } } if (hParent) { GUI_RECT Rect; // Rect = WM_H2P(hParent)->Rect; WM_GetInsideRect(hParent, &Rect); WM__Client2Screen(WM_H2P(hParent), &Rect); x0 += Rect.x0; y0 += Rect.y0; if (width==0) width = Rect.x1-Rect.x0+1; if (height==0) height = Rect.y1-Rect.y0+1; } if ((hWin = (WM_HWIN) WM_ALLOC(NumExtraBytes+sizeof(WM_Obj))) == 0) { GUI_DEBUG_ERROROUT("WM_CreateWindow: No memory to create window"); } else { WM__NumWindows++; pWin = WM_H2P(hWin); memset (pWin, 0, sizeof(WM_Obj)); /* erase this data structure The explicit zero-init is no longer needed since the entire data structure is already zeroed. The advantage is that it reduces program size. */ pWin->Rect.x0 = x0; pWin->Rect.y0 = y0; pWin->Rect.x1 = x0+width-1;

emWin使用文档

emWin使用文档

目录一、emWin介绍------------------------------------------------------------------------------------------------ 11.1 emWin简介 ------------------------------------------------------------------------------------------- 11.2 emWin应用的软件架构--------------------------------------------------------------------------- 2二、《emWin用户手册》介绍及使用------------------------------------------------------------------- 22.1 《emWin用户手册》简介----------------------------------------------------------------------- 22.2 根据函数名查找库函数说明 -------------------------------------------------------------------- 32.3 根据功能查找库函数 ------------------------------------------------------------------------------ 3三、emWin开发过程中调用API及功能---------------------------------------------------------------- 43.1 通用小工具API -------------------------------------------------------------------------------------- 43.2 BUTTON API -------------------------------------------------------------------------------------------- 53.3 EDIT API ------------------------------------------------------------------------------------------------- 6四、搭建emWin的Windows仿真环境----------------------------------------------------------------- 74.1 仿真版本emWin文件介绍---------------------------------------------------------------------- 74.2 使用VS2010 仿真emWin ---------------------------------------------------------------------- 84.3 emWin仿真工程概览 ------------------------------------------------------------------------------ 9五、GUI_Builder --------------------------------------------------------------------------------------------- 185.1 简介--------------------------------------------------------------------------------------------------- 185.2 创建对话框----------------------------------------------------------------------------------------- 195.3 GUI_Builder的输出 ------------------------------------------------------------------------------- 205.4 如何使用C文件 -------------------------------------------------------- 错误!未定义书签。

Windows系统的消息机制

Windows系统的消息机制

第1章 Windows系统的消息机制对诸如PowerBuilder(后文简写为PB)、Visual Basic和Dephi等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows系统本身而言,却是以消息处理为其控制机制。

Windows把系统中的对象都作为窗口来对待,每个窗口都有一个用来标识其身份的句柄。

Windows通过向窗口发送消息,在开发语言中转化为对象的事件,然后驱动对象,响应用户的动作。

在许多面向对象的可视化程序设计语言中,Windows的众多消息已经演变成了对象的属性或方法。

本章内容包括Windows系统的消息机制、消息的发送、消息的应用实例等。

1.1 Windows的工作机制1.1.1 Windows 的工作方式——窗口、事件和消息全面地讨论Windows的内部工作机制需要很大的篇幅,对于一般的PB用户当然没有必要深入了解所有的技术细节。

Windows系统的工作机制,简单地说就是3个关键的概念:窗口、事件和消息。

不妨简单地将窗口看做带有边界的矩形区域。

读者也许已经了解多种不同类型的窗口,如Windows系统的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的消息对话框窗口等。

除了这些最普通的窗口外,实际上还有许多其他类型的窗口。

命令按钮是一个窗口,图标、文本框、选项按钮和菜单条也都是窗口。

Windows 操作系统通过给每一个窗口指定一个惟一的标识号(窗口句柄,常用hWnd表示)来管理所有的窗口。

操作系统连续地监视每一个窗口的活动或事件的信号。

事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。

每发生一次事件,将引发一条消息发送至操作系统。

操作系统处理该消息并广播给其他窗口。

然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其他窗口的覆盖时,重新绘制自身窗口)。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第49章MESSAGEBOX-消息框控件本期教程讲解STemWin支持的消息框控件。

49. 1 消息框控件介绍49. 2 官方DIALOG_MessageBox实例49. 3官方DIALOG_MessageBoxUser实例49. 4 总结49.1消息框控件介绍使用MESSAGEBOX控件可在带有标题栏和 “确定”按钮 (必须按下才能关闭窗口)的框架窗口中显示消息。

创建消息框或者创建并执行消息框仅需一行代码。

下表显示MESSAGEBOX小工具的外观:消息控件的使用比较简单,仅有两个相关的API:GUI_MessageBox()和MESSAGEBOX_Create()。

49.2官方DIALOG_MessageBox实例官方的这个实例很好的演示了MessageBox的使用,这个例子在模拟器中的位置:源码如下(程序中进行了详细的注释):---------------------------------------------------------------------- File : DIALOG_MessageBox.cPurpose : Example demonstrating GUI_MessageBoxRequirements: WindowManager - (x)MemoryDevices - (x)AntiAliasing - ( )VNC-Server - ( )PNG-Library - ( )TrueTypeFonts - ( )---------------------------------------------------------------------- */#include "GUI.h"#include "WM.h"/******************************************************************* ** Static code********************************************************************* *//********************************************************************* ** _cbBkWindow* 桌面窗口的回调函数*/static void _cbBkWindow(WM_MESSAGE* pMsg) {switch (pMsg->MsgId) {case WM_PAINT:GUI_SetBkColor(GUI_RED);GUI_Clear();GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font24_ASCII);GUI_DispStringHCenterAt("DIALOG_MessageBox - Sample", 160, 5);break;default:WM_DefaultProc(pMsg);}}/********************************************************************* ** Public code*********************************************************************** *//********************************************************************* ** MainTask*/void MainTask(void) {GUI_Init();/* 开启窗口使用内存设备 */#if GUI_SUPPORT_MEMDEVWM_SetCreateFlags(WM_CF_MEMDEV);#endif/* 设置桌面窗口的回调函数 */WM_SetCallback(WM_HBKWIN, &_cbBkWindow);//// 创建消息框,等待直到他被关闭//while (1) {GUI_MessageBox("This text is shown\nin a message box","Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE);GUI_Delay(750); // 延迟一段时间GUI_MessageBox("New message !","Caption/Title", GUI_MESSAGEBOX_CF_MOVEABLE);GUI_Delay(750);}}实际显示效果如下:49.3官方DIALOG_MessageBoxUser实例官方的这个实例很好的演示了MessageBox的使用,这个例子在模拟器中的位置:源码如下(程序中进行了详细的注释):/*********************************************************************** Static code************************************************************************//*********************************************************************** _CreateMessageBox*/static WM_HWIN _CreateMessageBox(const char * sMessage, const char * sCaption, int Flags, const GUI_FONT * pFont) {WM_HWIN hWin;WM_HWIN hItem;GUI_RECT Rect;hWin = MESSAGEBOX_Create(sMessage, sCaption, Flags);//// 设置消息框中标题的字体,消息框本质上也是框架窗口,所以这里可以直接的调用修改//FRAMEWIN_SetFont(hWin, pFont);//// 调整大小//WM_GetWindowRectEx(hWin, &Rect);WM_SetWindowPos(hWin, Rect.x0 - 15,Rect.y0 - 15,Rect.x1 - Rect.x0 + 1 + 30,Rect.y1 - Rect.y0 + 1 + 30);//// 设置按钮控件的字体//hItem = WM_GetDialogItem(hWin, GUI_ID_OK);BUTTON_SetFont(hItem, pFont);//// 调节按钮控件的大小//WM_GetWindowRectEx(hItem, &Rect);WM_SetWindowPos(hItem, Rect.x0,Rect.y0 + 10,Rect.x1 - Rect.x0 + 1 + 30,Rect.y1 - Rect.y0 + 1 + 5);//// 设置文本控件的字体//hItem = WM_GetDialogItem(hWin, GUI_ID_TEXT0);TEXT_SetFont(hItem, pFont);//// 调节文本控件的大小//WM_GetWindowRectEx(hItem, &Rect);WM_SetWindowPos(hItem, Rect.x0,Rect.y0,Rect.x1 - Rect.x0 + 1 + 30,Rect.y1 - Rect.y0 + 1 + 12);return hWin;}/*********************************************************************** _EnableSkinning*/static void _EnableSkinning(void) {FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);BUTTON_SetDefaultSkin (BUTTON_SKIN_FLEX);}/*********************************************************************** Public code************************************************************************//*********************************************************************** MainTask*/void MainTask(void) {GUI_Init();/* 使能皮肤 */_EnableSkinning();while (1) {GUI_SetFont(&GUI_Font20B_ASCII);GUI_DispStringHCenterAt("Applicatoin defined MESSAGEBOX", 160, 5);/* 执行已经创建的对话框 */GUI_ExecCreatedDialog(_CreateMessageBox("Message", "Caption", 0, &GUI_Font24));GUI_Clear();GUI_Delay(1000);}}实际显示效果如下:49.4总结本期教程主要是跟大家讲解了消息框的两种创建方法,一种是系统自带的,直接调用即可显示,也就是本期教程中的第一个例子。

另一种是用户的创建方式,这种模式下用户可以自定义在消息框中要显示的内容。

相关文档
最新文档