




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/8/5,Email to: ,Page1,基于Hello China V1.6 By Garry.Xin 2009-04-10,嵌入式操作系统:Hello China V1.6 图形用户接口模块开发指南,基于Hello China V1.6 By Garry.Xin 2009-04-10,2019/8/5,Email to: ,Page2,Hello China Since I was a boy, I want to be a huge hero, to save human beings. When I was a teenage, I want to be a mathematician, to solve most complicated questions. When I was twenties, I want to be a good husband, with beautiful wife and lovely baby.,Now I am thirties, not a hero, not a mathematician, only a husband. But I am very confused, what I want to be, and how to be?,2019/8/5,Email to: ,Page3,目录,Hello China GUI模块的最新进展 Hello China V1.6的组成模块 辅助处理工具介绍 Hello China GUI模块开发指南 GUI模块的内部机制简介 GUI应用程序开发指南,2019/8/5,Email to: ,Page4,Hello China GUI模块的初始启动界面,2019/8/5,Email to: ,Page5,Hello China GUI模块的消息框和按钮控件,2019/8/5,Email to: ,Page6,Hello China GUI模块的内嵌程序-日历,2019/8/5,Email to: ,Page7,目录,Hello China GUI模块的最新进展 Hello China V1.6的组成模块 辅助处理工具介绍 Hello China GUI模块开发指南 GUI模块的内部机制简介 GUI应用程序开发指南,2019/8/5,Email to: ,Page8,Hello China V1.6的组成模块,1、BOOTSECT.BIN和REALINIT.BIN为系统初始化模块,运行在实模式下。一旦系统转换到保护模式,这两个模块就不再起作用; 2、1M物理内存预留,用作BIOS代码和数据、字符界面显存等; 3、MINIKER.BIN为一个字符界面驱动程序,后续将逐步淘汰; 4、MASTER.BIN是操作系统核心代码模块,占据128K内存; 5、HCGUI.BIN是图形用户界面代码模块,当前尚未开发完毕,占据64K内存。后续可能会进一步增大,这时候,其它模块需要顺延调整; 6、点阵汉字库和图标库,是HCGUI模块使用的资源库,没有任何代码,只是存储了点阵汉字、系统常用的显示图标等资源; 7、其它模块,比如网络模块等,放在图标库之后。,2019/8/5,Email to: ,Page9,目录,Hello China GUI模块的最新进展 Hello China V1.6的组成模块 辅助处理工具介绍 Hello China GUI模块开发指南 GUI模块的内部机制简介 GUI应用程序开发指南,2019/8/5,Email to: ,Page10,Hello China V1.6开发辅助工具,2019/8/5,Email to: ,Page11,目录,Hello China GUI模块的最新进展 Hello China V1.6的组成模块 辅助处理工具介绍 Hello China GUI模块开发指南 GUI模块的内部机制简介 GUI应用程序开发指南,2019/8/5,Email to: ,Page12,Hello China V1.6 GUI模块开发指南,步骤一:采用VC 6.0,打开HCNGUI.DSW项目,在其中编写功能代码。这个过程跟开发Windows程序一样。完毕后,编译为Release版本,形成HCNGUI.DLL库。此过程后面会做进一步介绍; 步骤二:把上述HCNGUI.DLL文件,拷贝到一个工作目录下(也可以直接以Release目录为工作目录,这样就可避免拷贝操作),运行PROC.BAT批处理命令,即可生成VFLOPPY.VFD文件; 步骤三:用上述生成的VFD文件,启动虚拟机即可。建议采用Virtual PC做试验,VMWare在支持图形模式方面存在一定问题(或许需要安装一些额外的插件),因此没有在VMWare上调试过。,PROC.BAT批处理文件内容: del master.bin /删除掉旧的MASTER.BIN文件。 del hcngui.bin /删除掉旧的HCNGUI.BIN文件。 process -i master.dll -o master.bin /处理MASTER.DLL文件,输出为MASTER.BIN模块。 process -i hcngui.dll -o hcngui.bin /处理HCNGUI.DLL文件,输出为HCNGUI.BIN模块。 append -s master.bin -a hcngui.bin /把HCNGUI.BIN模块跟MASTER.BIN模块合并,输出合并后的MASTER.BIN模块。 Vfmaker /创建虚拟软盘影像文件。,2019/8/5,Email to: ,Page13,Hello China V1.6 GUI模块开发注意事项,主意事项: 1、确保BOOTSECT.BIN/REALINIT.BIN/MINIKER.BIN/MASTER.BIN等四个文件,都位于工作目录下。VFMaker程序读取这四个文件,以生成可启动虚拟软盘文件(VFLOPPY.VFD); 2、当前工作目录下的MASTER.DLL文件,是最新版本的Hello China内核模块,不要删除。若需要更新内核模块,则需按照跟HCNGUI.DLL同样的操作顺序,编译生成release的MASTER.DLL后,重新拷贝到工作目录; 3、PROC.BAT文件,实际上就是执行了APPEND.EXE和PROCESS等程序,把各个二进制模块进行统一处理,并直接执行VFMaker,生成可用的虚拟软盘影像。若对这些工具的使用方法比较熟悉,可一步一步的执行生成VFLOPPY.VFD文件,以进一步熟悉其中的过程。,2019/8/5,Email to: ,Page14,Hello China V1.6 GUI模块二进制影像和工具包,Hello China V1.6二进制影像文件,包含工作目录中的所有二进制模块和开发支持工具。可直接拷贝到工作目录下使用。 PROC.BAT是批处理文件,对于GUI模块的开发,只需要采用最新编译的RELEASE版本HCNGUI.DLL,替代该目录下的相同文件,然后运行PROC.BAT,即可生成VFLOPPY.VFD。,2019/8/5,Email to: ,Page15,Hello China V1.6 GUI模块当前源代码结构,2019/8/5,Email to: ,Page16,Hello China V1.6 GUI模块加载和初始化过程,GUI模块的加载过程: 第一步:操作系统核心加载到内存中,完成初始化后,会初始化静态模块(GUI模块作为静态模块实现),目前只有GUI一个静态模块; 第二步:GUI模块的入口例程被调用,这时候,GUI模块应该执行初始化代码,完成必要的初始化任务,以准备后续执行; 第三步:GUI模块初始化后,操作系统核心会创建系统支持线程,比如系统空闲线程(IDLE线程)、CPU统计线程和shell线程等; 第四步:核心支撑线程创建完毕后,整个操作系统初始化完毕,此时系统控制权转移到shell线程,可执行用户输入操作。 注意:操作系统核心对象的初始化和驱动程序的加载和初始化,是在GUI模块初始化之前完成的。,2019/8/5,Email to: ,Page17,Hello China V1.6 GUI模块的初始化,GUI模块的初始化代码: extern “C“ BOOL _init() if(!Video.Initialize( ,初始化代码完成的任务: 1、初始化显示器对象(Video对象),以支持图形输出。当前版本中,显示器被初始化为1024*768*32模式,flat显存模式; 2、初始化全局参数对象,比如系统颜色、窗口标题栏高度等全局参数; 3、初始化窗口管理对象,以实现窗口机制的支撑; 4、替换缺省的shell为RAWIT(RAW input thread)。缺省的SHELL是基于字符界面的shell,在MASTER.BIN模块中实现; 5、返回TRUE,以指示系统模块初始化成功。 注: 1、初始化代码在GUIENTRY.CPP文件中; 2、RAWIT代码,在KTHREAD目录下的RAWIT文件中实现。,2019/8/5,Email to: ,Page18,Hello China V1.6 GUI模块的单一功能开发,所谓单一功能开发,指的是完成显示汉字、显示BMP/JPG图形、显示光标/鼠标、3D/光照效果等GUI支撑功能的开发。这些功能重点在图形编程和算法上,无须涉及到用户交互,因此可按照下列步骤进行: 第一步:把RAWIT入口函数(RAWIT函数)中所有代码删除,添加上单一功能代码,重新编译即可。实际上,在RAWIT函数被调用前,系统所有功能都已经初始化完毕了; 第二步:在开发中,可直接调用DrawPixel、DrawLine、DrawRectangle等图形输出函数。这些函数的第一个参数,是Video对象(一个全局对象)指针,另外的参数含义十分明了; 第三步:对于常用的系统颜色,比如窗口标题、控件表面等,可直接引用GlobalParams全局对象中定义的颜色值(可参考INCLUDE目录中的GLOBAL.H头文件和VIDEO目录下的GLOBAL.CPP源文件); 第四步:开发功能完成后,可编译连接,通过PROC.BAT批处理文件生成VFLOPPY.VFD文件,直接引导Virtual PC。,2019/8/5,Email to: ,Page19,目录,Hello China GUI模块的最新进展 Hello China V1.6的组成模块 辅助处理工具介绍 Hello China GUI模块开发指南 GUI模块的内部机制简介 GUI应用程序开发指南,2019/8/5,Email to: ,Page20,GUI模块的消息传递机制,对于鼠标消息,传递过程如下: 1、用户移动鼠标,引发鼠标中断。鼠标驱动程序的中断服务例程读取鼠标的状态数据,并创建一个内核消息,把该消息发送给当前输入焦点线程; 2、在GUI模块初始化的时候,采用RAWIT线程替换了字符界面的shell。这样RAWIT就成为GUI模式的当前输入焦点线程,于是鼠标消息会首先被RAWIT得到; 3、 RAWIT线程根据鼠标消息发生的位置(相对于屏幕),查询窗口树,得到该消息所落入的窗口对象; 4、进一步检索到上述窗口对象所属的核心线程,然后创建一个窗口消息,把该窗口消息发送到对应的核心线程。这时候鼠标消息进入到核心线程消息队列; 5、每个GUI线程的消息循环代码,会从本地线程消息队列中得到鼠标消息,并分发到对应的窗口(实际上是调用了窗口的窗口函数),于是消息得到处理。,2019/8/5,Email to: ,Page21,GUI模块窗口对象的组织,First child,Ancestor,Last child,Second child,First child,Last child,Second child,First child,Last child,Second child,1) 每个窗口对象维持四个指针:父窗口对象指针、第一个孩子窗口对象指针、下一个兄弟对象指针、上一个兄弟对象指针; 2) 系统创建的第一个窗口,作为所有窗口的父窗口,称为祖先窗口; 3) 系统中的所有窗口组成了一个窗口树,作为所有消息分发的基础。,2019/8/5,Email to: ,Page22,窗口鼠标消息的归属窗口判断过程,static HANDLE GetFallWindowFromTree(HANDLE hWnd,int x,int y) _WINDOW* pWindow = (_WINDOW*)hWnd; _WINDOW* pChild = NULL; HANDLE hResult = NULL; if(NULL = pWindow) return NULL; /Check children first. pChild = pWindow-pChild; do if(NULL = pChild) break; hResult = GetFallWindowFromTree(HANDLE)pChild,x,y); if(hResult) return hResult; pChild = pChild-pNextSibling; while(pChild != pWindow-pChild);,/If reach here,it means not any child contain the specified point. if(PtInRegion(pWindow-pRegion,x,y) return (HANDLE)pWindow; return NULL; ,上述代码位于KTHREADRAWIT.CPP文件中,在RAWIT线程处理鼠标输入消息的时候调用。 该函数根据鼠标输入消息的位置(X,Y),找到一个落入的窗口对象。 该函数采用递归调用的方式,实现了窗口树的深度优先搜索。 按照目前的实现,该函数不可能返回NULL(虽然理论上是可以的)。因为祖先窗口实际上覆盖了整个屏幕,任何鼠标点击消息,最终都会被窗口祖先处理。,2019/8/5,Email to: ,Page23,键盘消息的归属窗口判断过程,键盘消息被送达窗口的过程如下: 1、用户通过键盘输入,引发键盘中断; 2、键盘中断处理程序读取用于输入和键盘状态,形成键盘消息; 3、键盘中断处理程序把上述键盘消息发送给RAWIT; 4、RAWIT进一步把消息转换为窗口消息,然后发送给当前焦点窗口所在线程; 5、当前焦点窗口所在线程处理该消息。 在WindowManager中,维持了当前焦点窗口和对应的核心线程: struct _WINDOW_MANAGER _WINDOW* pWndAncestor; /The first window of the system,it is all other windows ancestor. HANDLE hCurrThread; /Current focus thread. _WINDOW* pCurrWindow; /Current focus window. 窗口焦点改变的过程,同时也会更新当前焦点线程和焦点窗口。需要注意: 1、当前获得CPU运行的线程,不一定是当前焦点线程; 2、当前焦点线程的状态,不一定是运行,可以是任何状态; 3、当前焦点窗口即是屏幕焦点窗口。,2019/8/5,Email to: ,Page24,线程的消息循环,DWORD GuiShellEntry(LPVOID) MSG Msg; if(!InitGuiShell() return 0; while(TRUE) if(GetMessage( ,线程的消息循环完成下列动作: 1、循环检测消息队列,处理每个消息; 2、对于窗口消息,则调用DispatchWindowMessage,把消息分发给指定窗口(消息的归属窗口,由RAWIT线程指定); 3、对于其它消息,则直接在消息循环中处理。但针对GUI应用,绝大部分消息是窗口消息。,2019/8/5,Email to: ,Page25,窗口的创建,HANDLE CreateWindow( DWORD dwWndStyle, /窗口风格,控制窗口外观。 TCHAR* pszWndTitle, /窗口标题字符串,最大64字节 int x, /窗口左上角的x坐标,相对于屏幕; int y, /窗口左上角的y坐标,相对于屏幕; int cx, /窗口宽度; int cy, /窗口高度; _WINDOW_PROC WndProc, /窗口过程指针; HANDLE hParent, /窗口的父窗口句柄; HANDLE hMenu, /窗口菜单句柄; _COLOR clrbackground, /窗口的背景颜色,将采用该颜色刷新窗口客户区; LPVOID lpReserved); /保留未来使用。,2019/8/5,Email to: ,Page26,窗口的外观风格(dwWndStyle),2019/8/5,Email to: ,Page27,窗口消息和消息机制,在Hello China的实现中,有两种类型的消息: 内核消息:该消息定义如下,通过SendMessage和GetMessage两个函数进行发送和接收: typedef struct _MSG WORD wCommand; WORD wParam; DWORD dwParam; MSG; 内核消息是一种通用消息,在没有窗口(或GUI)的情况下,也是适用的。 窗口消息:在Hello China的窗口机制中被引入,是整个窗口体系中最核心的数据交换机制。该消息通过SendWindowMessage函数来发送,通过窗口过程进行处理。消息定义如下: struct _WINDOW_MESSAGE HANDLE hWnd; /消息的目标窗口句柄 UINT message; /消息类型,比如WM_CREATE,WM_DRAW等 WORD wParam; /16位消息参数,一般用于WM_NOTIFY消息中,标识控件ID WORD wReserved; /保留 DWORD lParam; /32位消息参数,不同的消息类型有不同的使用方式。 ;,2019/8/5,Email to: ,Page28,窗口过程和窗口消息处理,窗口过程定义如下: typedef DWORD (*_WINDOW_PROC)(HANDLE hWnd,UINT msg,WORD wParam,DWORD lParam); 窗口过程是所有窗口消息的实际处理函数。任何一个窗口消息,都会被发送到对应的窗口过程进行处理。 下面是窗口过程的一个具体实例: DWORD HelloWndProc(HANDLE hWnd,UINT message,WORD wParam,DWORD lParam) HANDLE hDC = GetClientDC(hWnd); switch(message) case WM_DRAW: TextOut(hDC,0,0,”Hello,World!”); /Text out Hello World in windows client area. break; default: break; return DefWindowProc(hWnd,message,wParam,lParam); 任何一个窗口过程,都必须在消息处理的最后,调用缺省窗口过程DefWindowProc。,2019/8/5,Email to: ,Page29,窗口消息的发送-SendWindowMessage函数,利用SendWindowMessage函数向一个特定窗口发送消息,比如: _WINDOW_MESSAGE msg; msg.hWnd = GetParentWindow(hWnd); msg.message = WM_NOTIFY; msg.wParam = dwButtonId; msg.lParam = (DWORD)hWnd; SendWindowMessage(msg.hWnd, 上述代码示例了一个窗口空间,向其父窗口发送通知消息的过程。 SendWindowMessage函数直接调用了目标窗口的窗口过程,来处理消息。,2019/8/5,Email to: ,Page30,窗口相关的函数调用(API接口),2019/8/5,Email to: ,Page31,窗口相关的函数调用(API接口)Cont.,2019/8/5,Email to: ,Page32,图形设备接口(GDI)对象,设备上下文(Device Context,DC)是最重要的图形设备接口对象,所有绘图操作,都以DC对象句柄作为输入参数。在当前版本的实现中,DC定义如下: struct _DC DWORD dwDCType; /DC type. _PEN* pPen; /Current drawing pen. _BRUSH* pBrush; /Current drawing brush. _FONT* pFont; /Current drawing font. _POINT Point; /Current position to draw. _VIDEO* pVideo; /Video device this DC based on. HANDLE hOther; /Other device this DC based on,such as PRINTER. HANDLE hWindow; /Window object of this DC. _REGION* pRegion; /Clip zone object of the home window of this DC. ;,2019/8/5,Email to: ,Page33,图形设备接口(GDI)对象,其它相关的GDI对象: Brush,在绘制矩形等封闭对象的时候,采用Brush来填充封闭对象; Pen,画笔对象,在进行图形或文字输出的时候,采用Pen定义的属性来进行输出; Font,字体对象,用于指定文字输出的字型和大小等字体属性。 上述对象都跟DC对象关联,可以通过SelectXXX函数调用来改变这些GDI对象与DC的关联关系。,2019/8/5,Email to: ,Page34,GDI对象的使用,通过调用SelectXXX函数,来修改特定DC的GDI对象属性。DC对象被创建的时候,会以缺省设置创建这些GDI对象。 下列代码,以紫罗兰颜色绘制一个矩形: HANDLE hBrush,hOldBrush; HANDLE hDC = GetClientDC(hWnd); hBrush = CreateBrush(FALSE,COLOR_VIOLET); if(NULL = hBrush) /Can not create new brush. return; hOldBrush = SelectBrush(hDC,hBrush); /Replace old brush use new one. DrawRectangle(hDC,2019/8/5,Email to: ,Page35,GDI相关的系统调用,2019/8/5,Email to: ,Page36,GDI相关的系统调用,2019/8/5,Email to: ,Page37,Hello China文件系统接口,通过CreateFile接口函数,可完成文件的创建、打开等操作。该函数还可打开一个硬件设备,比如IDE硬盘设备、COM串口设备等。 下面的代码,示例了如何创建一个新的文件对象: HANDLE hFile = NULL; TCHAR* pszFileName = “C:HELLOCN.TXT”; hFile = CreateFile(pszFileName, FILE_ACCESS_WRITE | FILE_OPEN_ALWAYS, /If existing then open it,else create a new one. 0, NULL); if(NULL = hFile) MessageBox(hWnd,”Can not create the specified file.”,”Error”,MB_OK); else /Access the newly created file here. CloseFile(hFile);,2019/8/5,Email to: ,Page38,Hello China文件系统接口,通过CreateFile接口函数,可完成文件的创建、打开等操作。该函数还可打开一个硬件设备,比如IDE硬盘设备、COM串口设备等。 下面的代码,示例了如何打开一个已经存在的文件: HANDLE hFile = NULL; TCHAR* pszFileName = “C:HELLOCN.TXT”; hFile = CreateFile(pszFileName, FILE_OPEN_EXISTING, /If existing then open it,else create a new one. 0, NULL); if(NULL = hFile) MessageBox(hWnd,”Can not open the specified file.”,”Error”,MB_OK); else /Access the newly created file here. CloseFile(hFile);,2019/8/5,Email to: ,Page39,Hello China文件系统接口,ReadFile和WriteFile两个函数,完成文件的读写操作。下面的代码实现了一个文件的拷贝操作: HANDLE hSrcFile = NULL; HANDLE hTargetFile = NULL; CHAR buffer128; DWORD dwRead,dwWritten; /Open the source file and create the target file. while(ReadFile(hSrcFile,128,buffer,2019/8/5,Email to: ,Page40,目录,Hello China GUI模块的最新进展 Hello China V1.6的组成模块 辅助处理工具介绍 Hello China GUI模块开发指南 GUI模块的内部机制简介 GUI应用程序开发指南,2019/8/5,Email to: ,Page41,GUI应用程序开发步骤,GUI应用程序开发步骤之一:在HCNGUI工程中的APP目录下,添加应用程序代码文件和头文件。 以“Hello,World!”为例,添加下列两个文件到APP目录,并添加到HCNGUI的工程工作区中的APP目录下:,Hellow.h 代码只声明了Hello World程序的入口点: /The example of GUI application. /Hello world application entry point. DWORD HelloWorld(LPVOID);,2019/8/5,Email to: ,Page42,GUI应用程序开发步骤,GUI应用程序开发步骤之二:编辑Hellow.CPP文件,输入源代码,GUI应用程序开发步骤之三:把Hellow.H文件包含在KTHREADAPPBAND.CPP文件中,如下: /Header files for applications. #include “APPCLENDAR.H“ #include “APPHELL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训运营中心知识要求课件
- 2021年学校预防网络诈骗
- 培训课件开发原则
- 口才课胖小猪课件
- 2025年上市公司年度审计与内部控制评估合同范本
- 2025年老年养护机构卫生消毒及绿化管理服务合同
- 《2025年度员工薪酬保密及全面竞业禁止合作协议样本》
- 2025型医疗设备试用期间专项维护及售后无忧服务合同
- 2025年度国家级知识产权数据库研发与应用合作协议
- 中外历史纲要(下)世界史全册复习课件
- 青岛版科学 二年级《天气与动植物》
- 《养老护理员》-课件:协助老年人穿脱简易矫形器
- 影视艺术欣赏课程(教案)
- 动物的行为发育与行为遗传
- 风光储储能项目PCS舱、电池舱吊装方案
- 重庆医科大学附属第一医院改建PET-CT、PET-MR项目环评报告
- 政务服务大厅管理规范:安全与应急处置
- 双重预防机制构建-隐患排查治理(中石化中原油田天然气厂)
- 五牌一图(完整版)
- 二年级下册音乐《每天》教案
- 音乐美学.课件
评论
0/150
提交评论