一、NC 消息

Similar documents
PowerPoint 演示文稿

CC213

C 1

Guava学习之Resources

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

untitled

手册 doc

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

新・明解C言語入門編『索引』

mfc.doc

概述

ebook50-11

FY.DOC

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

untitled

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

MGEffV1dot0ProgrammingGuide < Main < TWiki Page 2 of 版本日期

技 术 文 件

1. 注册自己的控件类 我把控件类名称定义为 "HyperLinkCtrl", 还要为窗口额外分配空间, 这样才能迚行更多的控制 // 注册控件类 ATOM WINAPI RegisterHyperLinkCtrl(HINSTANCE hins) WNDCLASSEX wndclass; ZeroM

chap07.key

<4D F736F F D20BBF9D3DA F344C696E7578B5C C9E3CFF1CDB7CDBCCFF1B2C9BCAFCAB5CFD62E646F63>

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

哈尔滨应用职业技术学院2012年教育教学质量报告

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

Microsoft PowerPoint - gp3.ppt

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

新版 明解C++入門編

Microsoft Word - 01.DOC

Microsoft Word - 消息机制.doc

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y

C/C++语言 - C/C++数据

第1章 µC/GUI的介绍

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

Microsoft Word - 新1-12.doc

F515_CS_Book.book

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

untitled

PTR89 应用程序编程接口 V1.00

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

_汪_文前新ok[3.1].doc

概述

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

Microsoft Word - 第5章.doc

《C语言程序设计》第2版教材习题参考答案

untitled

本实验需要用到两个特征值, 两个特征值的属性各不相同, 我们同样在 SimpleGATTProfile 中新建即可, 接下来就开始吧 新建特征值表 : 表 3.3 串口透传特征值属性 长度 属性 UUID 功能 (byte) SIMPLEPROFILE_CHA R6 15 可读可写 FFF6 服务器

ebook 86-15

51 C 51 isp 10 C PCB C C C C KEIL

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

《C语言程序设计》教材习题参考答案

专题一.ppt

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

计算机网络与通讯作业 学号 : 姓名 : 张士广

untitled


Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

图形学 Project 2 要求 任意两个多边形, 求出其相交的区域 使用说明 例 1 第一步, 与 Project 1 画多边形的方法相同, 画一个多边形 ; 第二步, 单击 INTERSECT WITH, 随后画出第二个多边形 ; 第三步, 单击 FILL 进行填充

INTRODUCTION TO COM.DOC

d2.doc

提问袁小兵:


3.1 num = 3 ch = 'C' 2

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

科 技 与 法 律 Science Technology and Law Vol.89, No.1, 2011 作 品 若 将 打 字 机 也 算 作 字 体 工 具, 那 么 打 字 机 不 是 美 术 作 品, 只 是 一 种 工 业 产 品 字 帖 是 美 术 作 品 么? 笔 者 认 为,

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

PowerPoint 演示文稿

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

untitled

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作

华恒家庭网关方案

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

穨complete.PDF

X713_CS_Book.book

untitled

版权所有 (C) 2008~2010, 北京飞漫软件技术有限公司, 保留所有权利 无论您以何种方式获得该指南的全部或部分文字或图片资料, 无论是普通印刷品还是电子文档, 北京飞漫软件技术有限公司仅仅授权您阅读的权利, 任何形式的格式转换 再次发布 传播以及复制其内容的全部或部分, 或将其中的文字和图

Microsoft Word - Broker.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

ebook

中北大学常规事项财务报销操作指南

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

<4D F736F F D E67696E652B ECFE0B9D8C8FDCEACB9A6C4DCC4A3BFE9BDE9C9DC5FC8FD5F2E646F63>

文件

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

javaexample-02.pdf

TwinCAT 1. TwinCAT TwinCAT PLC PLC IEC TwinCAT TwinCAT Masc

C语言的应用.PDF

Microsoft Word - ch04三校.doc

untitled

Transcription:

MiniGUI 特性说明书 本文档说明 MiniGUI 所支持的功能特性 一 概述 MiniGUI 是 Linux 控制台上运行的, 基于 SVGALib 和 LinuxThread 库的多窗口图形用户界面支持系统 MiniGUI 采用了类 Win32 的 API 接口, 实现了简化的类 Windows 98 风格的图形用户界面 图形用户界面在许多情况下都优于字符界面, 其最大的优点是使应用程序的操作简单易学 在 MiniGUI 中, 图形用户界面包括如下基本元素 : ----- 主窗口 ------------- 窗口非客户区 ------------- 窗口标题 ------------- 窗口边框 ------------- 菜单栏 ------------- 窗口客户区 ------------- 子窗口 ( 窗片或控件 ) ------------- 对话框 ----------- 对话框控件 图 1.1 图形用户界面的基本元素 1.1 窗口 MiniGUI 中的窗口基本分四类, 分别为主窗口 对话框 控件和主窗口中的窗片 MiniGUI 中的主窗口和 Windows 应用程序的主窗口概念类似, 但略微有些不同, MiniGUI 中的每个主窗口对应于一个单独的线程, 通过函数调用可建立主窗口以及对应的线程 每个线程有一个消息队列, 主窗口从这一消息队列中获取消息并由窗口过程 ( 回调函数 ) 进行处理 MiniGUI 中的对话框是一种特殊的窗口, 对话框一般和控件一起使用, 这两个概念和 Windows 的相关概念是类似的 MiniGUI 支持的控件类型有 : 静态框 : 文本 图标或矩形框等 这种控件的属性一般不会在运行时发生变化 文本框 : 单行或多行的文本编辑框 按钮 : 单选钮 复选框和一般按钮等 其他特殊控件 窗片是 MiniGUI 所特有的, 窗片实际是主窗口的子窗口, 只存在于主窗口中 为了

处理上的方便, 主窗口的子窗口只以平铺的形式出现, 因此我们将这种子窗口称为 窗片 或 窗格 窗片可以是私有的控件类型, 也可以是标准的控件类型 1.2 消息和消息循环 在 Windows 系列操作系统中, 广泛使用了消息驱动的概念 在 MiniGUI 中, 我们也 使用了消息驱动作为应用程序的创建构架 在消息驱动的应用程序中, 计算机外设发生的事件, 例如键盘键的敲击 鼠标键的按 击等, 都由支持系统收集, 将其以事先的约定格式翻译为特定的消息 应用程序一般包含 有自己的消息队列, 系统将消息发送到应用程序的消息队列中 应用程序可以建立一个循 环, 在这个循环中读取消息并处理消息, 一直处理到特定的消息传来为止 这样的循环称 为消息循环 一般地, 消息由代表消息的一个整型数和消息的附加参数组成 例如, 鼠标 左键的按下消息, 可能由 133 这个数来表示, 其附加参数可能包含按下时的鼠标所在位置 信息 例如,MiniGUI 中如下定义消息 : typedef struct { HWND hwnd; int message; WPARAM wparam; LPARAM lparam;... MSG; message 指定了特定的消息类型,wParam 是以 unsigned int 类型定义的消息的短参数, lparam 是以 long 类型定义的消息长参数 应用程序一般要提供一个处理消息的标准函数 在消息循环中, 系统可以调用此函数, 应用程序在此函数中处理相应消息 图 1.2 是一个消息驱动的应用程序的简单构架示意 外设事件 主窗口线程消息队列 消息 循环 窗口过程 窗口管理器 主窗口线程消息队列 主窗口线程消息队列 图 1.2 消息驱动的应用程序的简单构架 在 MiniGUI 中, 消息分为如下几种类型 : 系统消息, 为系统内部管理使用 鼠标消息, 鼠标的点击 移动等产生的消息 键盘消息, 键盘的按键消息 窗口消息, 窗口管理消息 菜单消息, 菜单管理消息

命令消息等 1.3 窗口过程和窗口类 窗口过程是用来处理窗口消息的函数过程 对于同一类型的控件, 其窗口过程一般是一样的 因此, 系统一般利用窗口的窗口类名来区分不同的窗口类并调用不同的窗口过程 由于几乎每一个主窗口均和其他窗口有着不同的窗口过程, 因此, 在 MiniGUI 中, 窗口类的概念只存在于控件和窗片中 对于主窗口来说, 其窗口过程在建立主窗口时指定, 而对控件和窗片来说, 则在注册窗口类时指定, 而在建立窗片或控件时指定所属窗口类 1.4 句柄 句柄是 MiniGUI 用来标识对象的标识符 句柄和指针概念类似, 但它不一定是指针值 利用句柄,MiniGUI 将系统变量从应用项目中分离了出来, 因为程序员只能通过句柄访问对象, 因而就没有利用指针是可能发生的因非法访问而导致的数据不一致问题 在 MiniGUI 中, 窗口 控件 设备环境 菜单 图标等均使用句柄访问 二 窗口 2.1 应用程序和主窗口 我们将基于 MiniGUI 的一个会话 (session) 称为一个应用项目, 而其中每个单独的 线程或线程组称为应用 每个应用项目可建立多个应用 主窗口是建立在 MiniGUI 基础 上的应用的主界面 MiniGUI 为每个主窗口建立单独的消息队列, 在该主窗口基础上派生 出的窗片 对话框及其控件均使用同一消息队列 在 MiniGUI 中, 每个应用对应于一个 线程 理论上讲, 每个应用可以具备多个主窗口, 但在 MiniGUI 中, 主窗口均以单独的 线程实现 但多个主窗口对应单一线程的情况也是可以在 MiniGUI 中实现的 每个应用项目有一个 MiniGUIMain 函数, 在这个函数中, 可建立初始的应用线程 在调用 MiniGUIMain 之前, MiniGUI 启动自己的桌面窗口 ( Desktop) 桌面窗口作为 MiniGUI 的窗口管理器而存在 下面的代码段在 MiniGUIMain 中启动了三个主窗口线程 : int MiniGUIMain(int args, char* arg[]) { pthread_t thread, thread2, thread3; CreateThreadForMainWindow(&thread, NULL, TestWindowMain, 0); CreateThreadForMainWindow(&thread2, NULL, TestWindowMain2, 0); CreateThreadForMainWindow(&thread3, NULL, TestWindowMain3, 0); return 0; CreateThreadForMainWindow 函数为主窗口建立线程, 并返回线程标识符 其中的第三个参数是线程的入口函数地址 如下的代码段定义了上述代码中第一个主 窗口线程的入口函数 :

void InitCreateInfo(PMAINWINCREATE pcreateinfo) { pcreateinfo->dwstyle = WS_THICKFRAME; pcreateinfo->spcaption = "The first main window" ; pcreateinfo->hmenu = 0; pcreateinfo->hcursor = GetSystemCursor(2); pcreateinfo->hicon = LoadIconFromFile("res/table.ico"); pcreateinfo->mainwindowproc = TestMainWinProc; pcreateinfo->lx = 50; pcreateinfo->ty = 50; pcreateinfo->rx = 300; pcreateinfo->by = 480; pcreateinfo->ibkcolor = COLOR_lightwhite; pcreateinfo->dwadddata1 = 0; pcreateinfo->dwadddata2 = 0; void* TestWindowMain(void* { MSG Msg; data) MAINWINCREATE CreateInfo; HWND hmainwnd; InitCreateInfo(&CreateInfo); if(!(hmainwnd = CreateMainWindow(&CreateInfo)) ) return NULL; ShowWindow(hMainWnd, SW_SHOWNORMAL); while( GetMessage(&Msg, hmainwnd) ) { DispatchMessage(&Msg); MainWindowThreadCleanup(hMainWnd); return NULL; 在上面的代码段中, 该线程首先调用 CreateMainWindow 建立了主窗口, 然后调用 ShowWindow 显示了主窗口, 最后启动了消息循环 当消息循环因为接收到 MSG_QUIT 消息而终止时, 该函数调用了 MainWindowThreadCleanup 清除了相关的线程数据 从上述代码中可看出主函数不支持窗口类, 在调用 CreateMainWindow 函数时直接指 定主窗口的窗口过程地址 我们也可以从中看到主窗口所支持的其他属性 : 1. 窗口风格 表 2.1 给出了所支持的窗口风格 表 2.1 MiniGUI 支持的主窗口风格 风格 WS_BORDER WS_THICKFRAME WS_THINFRAME WS_CAPTION WS_HSCROLL WS_MAXMIZEBOX WS_MINIMIZEBOX WS_SYSMENU WS_VSCROLL 描述创建一个具有单线边框的窗口创建一个具有宽边框的窗口创建一个具有细边框的窗口创建一个具有标题栏的窗口创建一个具有水平滚动条的窗口创建一个具有最大化框的窗口创建一个具有最小化框的窗口创建一个具有系统菜单的窗口创建一个具有垂直滚动条的窗口

WS_DISABLED WS_MAXIMIZE WS_MINIMIZE WS_VISIBLE WS_EX_TOPMOST 2. 窗口标题 3. 窗口菜单 4. 窗口图标 5. 窗口背景色 创建一个初始为禁止的窗口创建一个初始最大化的窗口创建一个初始最小化的窗口创建一个初始可见的窗口创建一个顶层窗口, 这是一个 Win32 的扩展风格 2.2 主窗口过程 主窗口过程实际是一个回调函数, 一般由 DispatchMessage 函数调用, 用来处理应 用的消息 主窗口过程一般如下定义 : int TestMainWinProc(HWND hwnd, int message, WPARAM wparam, LPARAM lparam) { HDC hdc; int x, y; RECT client; static BITMAP bitmap; static BOOL fvalid = FALSE; static int paintcount = 0; switch (message) { case MSG_CREATE: SetTimer (hwnd, 100, 20); if(loadbitmap(&bitmap, "res/mnls.bmp") < 0) fprintf (stderr, "Test Main Win: Loading bitmap failure!\n"); else fvalid = TRUE; case MSG_PAINT: hdc = BeginPaint (hwnd); testdc (hdc, fvalid?&bitmap:null); EndPaint (hwnd, hdc); case MSG_LBUTTONDBLCLK: hdc = GetClientDC (hwnd); TextOut(hdc, 0, 0, "Left button double clicked"); ReleaseDC (hdc); PostMessage (hwnd, MSG_CLOSE, 0, 0); return 0; case MSG_TIMER: if (ISINBACKGROUND) paintcount++; if (paintcount % 10!= 0) { hdc = GetClientDC (hwnd); GetClientRect (hwnd, &client); x = random() % (RECTW (client)); y = random() % (RECTH (client)); SetBrushColor(hdc, RGB2Index (hdc, random() % 256, random() % 256, random() % 256)); FillBox(hdc, x, y, random() % RECTW (client), random() % RECTH (client));

ReleaseDC (hdc); else InvalidateRect (hwnd, NULL, FALSE); case MSG_CLOSE: KillTimer (hwnd, 100); UnloadBitmap (&bitmap); DestroyMainWindow (hwnd); PostQuitMessage (hwnd); return 0; return DefaultMainWinProc(hWnd, message, wparam, lparam); 主窗口有四个入口参数, 分别是消息的目标窗口句柄 消息 消息的 WPARAM ( 即 unsigned int) 型参数和 LPARAM ( 即 long int) 型参数 在 32 位系统中, 消息的两个参数实际是等长度的 主窗口的窗口过程处理应用感兴趣的消息, 将其他消息传递给 DefaultMainWindProc 函数处理 2.3 桌面的应用项目接口 当用户在桌面上单击鼠标右键时可弹出浮动式菜单, 应用项目可通过桌面提供的接口在该菜单中添加菜单项, 从而提供一定的灵活性 要利用桌面的应用项目接口, 应用项目要实施两个函数 : void Customi ze D e sktopmenu (HMENU hmnu, int ipos); int CustomDesktopCommand (int id); 通过 CustomizeDesktopMenu 函数, 应用项目可在桌面的浮动式菜单中添加菜单及菜单项 当用户选择了定制的菜单项时,MiniGUI 将调用 CustomDesktopCommand 函数, 这时, 应用项目就可以处理该菜单命令 2.4 对话框和控件 对话框实际是一种特殊的主窗口 一般而言, 对话框中包含有许多系统提供的控件 对话框和控件的设计目标是提供和 Win32 在源代码级上的完全兼容 但某些复杂的控件 不打算支持, 对话框页也不支持 MiniGUI 支持的控件有 : 静态控件 按钮控件 编辑控件 列表控件 滚动条控件 组合框控件 同时,MiniGUI 将提供标准的公共对话框 : 文件打开对话框 文件保存对话框

2.6 消息框 MiniGUI 将提供和 Win32 完全兼容的消息框调用接口 2.6 窗片 窗片是主窗口中子窗口的简化支持, 为了避免子窗口之间的互相剪切, 而采用了平铺式的子窗口实现, 不考虑子窗口的互相剪切, 因而也就不提供多文档接口 也因为这个原因, 我们将这种子窗口称为窗片或窗格 窗片的建立和控件的建立方法一致 2.7 滚动支持 将提供和 Win32 完全兼容的主窗口或子窗口的滚动支持 三 对话框 窗片和控件 该部分功能尚未实现, 其目标是提供和 WIN32 的 80% 兼容 需要提供的接口分为如下几类 ( 注, 我们将窗片和控件统称为窗口, 并严格区分 主窗口 和 窗口 这两个名词 ): 窗口类的注册和注销 窗口的创建和销毁 对话框和控件管理 常见控件消息 操作接口等的实现 四 消息及消息队列 在 MiniGUI 中, 基本实现了 Win32 的消息处理函数 消息可通过如下函数发送 : 通过 PostMessage 发送 消息发送到消息队列后立即返回 这种发送方式称为 邮寄 消息 如果消息队列中的邮寄消息缓冲区满, 则该函数返回错误值 通过 PostSyncMessage 发送 该函数用来向不同于调用该函数的线程消息队列邮寄消息, 并且只有该消息被处理之后, 该函数才能返回, 因此这种消息称为 同步消息 通过 SendMessage 发送 该函数可以向任意一个窗口发送消息, 消息处理完成之后, 该函数返回 如果目标窗口所在线程和调用线程是同一个线程, 该函数直接调用窗口过程, 如果处于不同的线程, 则利用 PostSyncMessage 函数发送同步消息 通过 SendNotifyMessage 发送 该函数向指定的窗口发送通知消息, 将消息放入消息队列后立即返回 由于这种消息和邮寄消息不同, 是不允许丢失的, 因此, 系统以链表的形式处理这种消息 通过 SendAsyncMessage 发送 利用该函数发送的消息称为 异步消息, 系统直接调用目标窗口的窗口过程

五 图形设备接口 图形设备接口, 即 GDI, MiniGUI 中用来实现图形输出的模块 5.1 基本概念 5.1.1 图形设备在 MiniGUI 中, 采用了在 Windows 和 X Window 中普遍采用的图形设备概念 每个图形设备定义了计算机显示屏幕上的一个矩形输出区域 在调用图形输出函数时, 均要求指定经初始化, 或经建立的图形设备上下文, 或设备环境 (DC) 每个图形输出均局限在图形设备指定的矩形区域内 在多窗口系统中, 各个图形设备之间的输出互相剪切, 以避免图形输出之间互相影响 5.1.2 剪切域剪切域就是在图形设备上定义的一个区域, 所有在该图形设备上进行的图形输出, 超过剪切域的部分, 均被裁剪 只有在剪切域上的图形输出才是可见的输出 MiniGUI 中的剪切域, 定义为矩形剪切域的集合 5.1.3 映射模式映射模式指定了特定图形输出的坐标值如何映射到图形设备的坐标值 图形设备的坐标系原点定义为图形设备矩形区域的左上角 向右为正 X 坐标轴方向 ; 向下为正 Y 坐标轴方向 这一坐标系称为设备坐标系 通过 GDI 模块的映射模式操作函数, 可定义自己的逻辑坐标系 逻辑坐标系可以是设备坐标系的水平或垂直反转, 缩放, 或者偏移 多数 GDI 输出函数指定的是逻辑坐标系 默认情况下, 逻辑坐标系和设备坐标系是重合的 5.2 GDI 功能特性的分类说明 5.2.1 图形设备能力 通过调用函数 GetGDCapability, 可获得图形设备的如下能力 : 颜色数目 ; 水平和竖直方向的象素点数 ; 设备坐标系中可见点的最大 x 和 y 坐标值 5.2.2 创建 销毁或获取 释放图形设备接口 和 Win32 类似, MiniGUI 中也有一个 DC 的缓冲区, 应用可调用 GetDC 或 GetClientDC 函数从 DC 缓冲区中获取图形设备环境, 在结束使用 DC 之后, 应当调用 ReleaseDC 函数释放 DC 应用也可以建立自己私有的 DC, 这种 DC 可以是全局有效的 DC, 由于免除了获取 和释放以及初始化等工作, 因此, 利用这种 DC 可加速图形显示 当应用不再使用私有 DC

时, 应当利用 DeletePrivateDC 删除私有 DC 下面的代码即利用了这种 DC: int TestMainWinProc2(HWND hwnd, int message, WPARAM wparam, LPARAM lparam) { static HDC hdc; HDC hpaintdc; int x, y; RECT client; static int count = 0; static BITMAP bitmap; static BOOL fvalid = FALSE; static int paintcount = 0; switch (message) { case MSG_CREATE: SetTimer (hwnd, 100, 20); SetTimer (hwnd, 200, 5); if(loadbitmap(&bitmap, "res/j11b.bmp") < 0) fprintf (stderr, "Test Main Win: Loading bitmap failure!\n"); else fvalid = TRUE; case MSG_SHOWWINDOW: if (wparam == SW_SHOWNORMAL) hdc = CreatePrivateClientDC (hwnd); case MSG_PAINT: hpaintdc = BeginPaint (hwnd); testdc (hpaintdc, fvalid?&bitmap:null); EndPaint (hwnd, hpaintdc); case MSG_LBUTTONDBLCLK: return 0; case MSG_TIMER: if (ISINBACKGROUND) if (wparam == 100) { paintcount ++; if (paintcount % 10!= 0) { GetClientRect (hwnd, &client); x = random() % (RECTW (client)); y = random() % (RECTH (client)); SetPenColor(hdc, RGB2Index (hdc, random() % 256, random() % 256, random() % 256)); LineTo(hdc, x, y); else InvalidateRect else if (wparam == 200) { if (count < 5) { Ping (); count ++; else KillTimer (hwnd, 200); (hwnd, NULL, TRUE);

case MSG_CLOSE: KillTimer (hwnd, 100); KillTimer (hwnd, 200); UnloadBitmap (&bitmap); DeletePrivateDC (hdc); DestroyMainWindow (hwnd); PostQuitMessage (hwnd); return 0; return DefaultMainWinProc(hWnd, message, wparam, lparam); 上述代码在应用主窗口建立时创建了私有 DC, 然后在定时器消息中利用私有 DC 进行绘制, 最后在关闭窗口时删除了私有 DC MiniGUI 也支持内存中的虚拟 DC, 可通过 CreateCompatibleDC 建立内存 DC, 利用这种 DC, 可加速绘制过程, 并减少绘制过程中闪烁现象 应用可使用 DeleteCompatibleDC 函数删除内存 DC 上述 DC 的创建或获取与 Win32 API 有较明显的不同 5.2.3 一般绘制属性这类功能用来设置 DC 的绘制属性, 这些属性及其影响的绘图操作在表 5.1 中列出 表 5.1 一般绘图属性 绘制属性所影响的绘图操作备注 背景色 文本输出 GetBkColor, SetBkColor 背景模式 文本输出 GetBkMode, SetBkMode 文本颜色 文本输出 GetTextColor, SetTextColor 画笔类型 线条输出 只支持实型画笔 GetPenType, SetPenType 画笔颜色 线条输出 GetPenColor, SetPenColor 画刷类型 填充操作 只支持实型画刷 GetBrushType, SetBrushType 画刷颜色 填充操作 GetBrushColor, SetBrushColor 5.2.4 一般绘图支持 这类功能用来完成基本的绘图功能, 这些功能包括 : 画点 直线 圆 矩形等 另外 还有一些颜色转换方面的功能, 可以将特定的 RGB 转换为最接近的 256 色调色板中的 颜色索引值 接口函数由表 5.2 给出 表 5.2 一般绘图支持 函数 SetPixel SetPixelRGB GetPixel GetPixelRGB RGB2Index MoveTo, LineTo 功能说明设置指定的象素颜色, 颜色值以调色板索引给出 设置指定的象素颜色, 颜色值以 RGB 值给出 获取指定点的象素颜色, 以调色板索引给出 获取指定点的象素颜色, 以 RGB 值给出 完成 RGB 值到调色板索引值的转换 绘制直线

Circle Rectangle 绘制圆 绘制矩形 5.2.5 文本输出支持这类功能用来利用系统字体输出文本 可实现无格式文本 ( TextOut) 和有格式文本 (TabbedTextOut) 的输出 作为辅助函数, 应用还可以利用 GetTabbedTextExtent 函数来获得格式化文本字符串的输出尺寸 由于系统字体是等宽字体, 无格式文本的输出长度就等于单字节字符串个数乘以单个字符的宽度 利用 GetCharWidth 以及 GetCCharWidth 可获取单字节字符以及双字节字符 ( 汉字 ) 的宽度 ; 利用 GetCharHeight 可获取字符的高度 5.2.6 映射函数支持 MiniGUI 支持的映射方式有两种, 一种和 Win32 的 MM_TEXT 映射方式一样, 即设备坐标系和逻辑坐标系是一致的 ; 一种和 Win32 的 MM_ANISOTROPIC 映射方式一样, 逻辑 x 和 y 轴可以以任意的比例映射到对应的坐标轴上 其他的 Win32 映射方式不被支持 通过函数 SetMapMode 设定映射方式 利用 SetWindowExt 和 SetViewportExt 可设置 MM_ANISOTROPIC 映射方式的坐标轴方向 比例等 利用 SetWindowOrg 和 SetViewPortOrg 可以设定原点位置 和上述函数的对应的 Get 函数组可用来获取设定值 5.2.7 坐标转换这类函数用来实现设备坐标到逻辑坐标的转换 DPtoLP 将设备坐标转换为逻辑坐标, LPtoDP 将逻辑坐标转换为设备坐标 5.2.8 剪切支持这类函数用来实现对 DC 剪切域的操作 和 Win32 不同的是,MiniGUI 的剪切域只支持矩形剪切域 ExcludeClipRect 可用来在当前剪切域中排除指定的矩形区域 IncludeClipRect 可用来在当前剪切域中包含指定的矩形区域 CliprectIntersect 可用来将当前剪切域和指定矩形相交 SelectClipRect 将剪切域设置为指定矩形 GetBoundsRect 获取包含当前剪切域的最大矩形 PtVisible 可判断给定点是否处于剪切域 RectVisible 可判断给定矩形是否和剪切域相交 5.2.9 位图支持这类函数用来实现填充操作 利用 FillBox 可以以当前的画刷类型和颜色填充指定矩形 利用 FillBoxWithBitmap 可以用指定的位图填充指定矩形, 如果有需要, 该函数可进行位图的缩放 利用 BitBlt 函数可在两个 DC 之间复制图象

利用 StretchBlt 函数可两个 DC 之间复制图象, 并完成缩放 利用函数 LoadBitmap 可从 Windows BMP 文件中装入位图信息 UnloadBitmap 则卸载位图信息 5.2.10 图标支持 MiniGUI 的图标支持和 Win32 API 大致相同, 包含如下几种操作 : 创建和销毁图标 :LoadIconFromFile CreateIcon DestroyIcon 图标绘制支持 :DrawIcon 根据需要 MiniGUI 将提供系统图标集, 及相应的操作函数 5.2.11 矩形支持这类函数提供了实现矩形相交, 合并等一般性的操作, 达到 Win32 的 95% 兼容 下面是这些函数的说明 1) SetRect void GUIAPI SetRect(RECT* prc, int left, int top, int right, int bottom); 该函数将矩形 prc 设定为参数 left, top, right, bottom 指定的大小 2) SetRectEmpty void GUIAPI SetRectEmpty(RECT* prc); 该函数将矩形 prc 设置为空矩形. 空矩形就是面积为 0 的矩形. 该函数将矩形的 left, top, right, bottom 值均设置为 0 3) CopyRect void GUIAPI CopyRect(RECT* pdrc, const RECT* psrc); 该函数将矩形 psrc 复制到 pdrc 中 4) IsRectEmpty BOOL GUIAPI IsRectEmpty(const RECT* PRC); 该函数判断指定矩形是否为空矩形 若为空矩形, 则函数返回 TRUE, 否则返回 FALSE 5) EqualRect BOOL GUIAPI EqualRect(const RECT* prc1, const RECT* prc2); 该函数判断指定的两个矩形是否是相等的矩形 相等的矩形其 bottom 值均相等 left, top, right, 6) NormalizeRect void GUIAPI Normali ze R e ct(rect* prect); 该函数将指定的矩形 prect 进行正规化处理 矩形的正规化指满足如下条件的矩形 :

left <= right 并且 top <= bottom 7) IntersectRect BOOL GUIAPI IntersectRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2); 该函数求两个矩形 psrc1 和 psrc2 的相交区域, 并在 pdrc 中返回相交矩形 如果 psrc1 和 psrc2 相交, 函数返回为 TRUE 如果 psrc1 和 psrc2 不相交, 函数返回为 FALSE,pdrc 为空矩形 8) DoesIntersect BOOL GUIAPI DoesIntersect(const RECT* psrc1, const RECT* psrc2); 该函数判断两个矩形是否相交 如果 psrc1 和 psrc2 相交, 函数返回为 TRUE 如果 psrc1 和 psrc2 不相交, 函数返回为 FALSE 9) UnionRect BOOL GUIAPI UnionRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2); 该函数求两个矩形 psrc1 和 psrc2 相并矩形, 并在 pdrc 中返回相并矩形 如果 psrc1 和 psrc2 能够进行相并操作, 函数返回 TRUE 如果 psrc1 和 psrc2 不能进行相并操作, 函数返回 FALSE,pdrc 为空矩形 10) SubtractRect BOOL GUIAPI SubtractREct(RECT* pdrc, const RECT* psrc1, const RECT* psrc2); 该函数求两个矩形 psrc1 和 psrc2 相减的矩形, 并在 pdrc 中返回结果矩形 如果 psrc1 和 psrc2 能够进行相减操作, 函数返回 TRUE 如果 psrc1 和 psrc2 不能进行相减操作, 函数返回 FALSE,pdrc 为空矩形 11) OffsetRect void GUIAPI OffsetRect(RECT* prc, int x, int y); 该函数将矩形 prc 偏移指定的偏移量 x, y 12) InflateRect void GUIAPI InflateRect(RECT* prc, int cx, int cy); 该函数将矩形 prc 的长和宽分别增加 cx 和 cy 13) PtInRect BOOL GUIAPI PtInRect(const RECT* prc, int x, int y); 该函数判断指定点 (x, y) 是否处于矩形 prc 中 如果指定点在矩形中, 函数返回 TRUE; 否则返回 FALSE

六 菜单 MiniGUI 中的菜单接口和 Win32 90% 兼容, 但有少许差别 在外观上,MiniGUI 可 为弹出式菜单定义一个菜单标题, 可支持空的弹出式菜单 ; 在内部结构和概念上也有一些 小的差别 主要区别在于子菜单的定义上, 子菜单即可以是一个完整的弹出式菜单, 也可 以是一个没有弹出式菜单标题的子菜单 从另一个角度讲, 弹出式菜单是由标题以及一系 列子菜单项组成的 MiniGUI 提供用来操作菜单的函数有 : HMENU GUIAPI CreateMenu (); HMENU GUIAPI CreatePopupMenu ( PMENUITEMINFO pmii); HMENU GUIAPI CreateSystemMenu (); int GUIAPI InsertMenuItem (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii); int GUIAPI RemoveMenu (HMENU hmnu, int item, UINT flags); int GUIAPI DeleteMenu (HMENU hmnu, int item, UINT flags); int GUIAPI DestroyMenu (HMENU hmnu); 功能 上述这些函数用来操作菜单数据, 可实现菜单的创建 销毁, 菜单项的添加 删除等 int GUIAPI IsMenu (HMENU hmnu); 该函数可用来判断给定句柄是否为菜单句柄 HMENU GUIAPI SetMenu (HWND hwnd, HMENU hmnu); HMENU GUIAPI GetMenu (HWND hwnd); 上述函数用于获取或设置主窗口的菜单 void GUIAPI DrawMenuBar (HWND hwnd); int GUIAPI TrackMenuBar (HWND hwnd, int pos); int GUIAPI TrackPopupMenu (HMENU hmnu, UINT uflags, int x, int y, HWND hwnd; HMENU GUIAPI GetMenuBarItemRect (HWND hwnd, int pos, RECT* prc); BOOL GUIAPI HiliteMenuBarItem (HWND hwnd, int pos, UINT flag); 上述函数用于显示并跟踪菜单 int GUIAPI GetMenuItemCount (HMENU hmnu); int GUIAPI GetMenuItemID (HMENU hmnu, int pos); int GUIAPI GetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii); int GUIAPI GetMenuItemRect (HWND hwnd, HMENU hmnu, int item, PRECT prc); HMENU GUIAPI GetPopupSubMenu (HMENU hpppmnu); HMENU GUIAPI GetSubMenu (HMENU hmnu, int pos); int GUIAPI GetSystemMenu (HWND hwnd, BOOL flag); UINT GUIAPI EnableMenuItem (HMENU hmnu, int item, UINT flags); int GUIAPI CheckMenuRadioItem (HMENU hmnu, int first, int last, int checkitem, UINT flags); int GUIAPI SetMenuItemBitmaps (HMENU hmnu, int item, UINT flags, PBITMAP hbmpunchecked, PBITMAP hbmpchecked); int GUIAPI SetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii); 上述这些函数用于获取或设置菜单属性

七 定时器 在 MiniGUI 中应用项目可用的定时器总共可有 16 个, 而每个应用最多只能定义 8 个定时器 MiniGUI 中的定时器和 Win32 中使用定时器的方法是一样的, 但不支持定时器回调 函数 MiniGUI 提供来操作定时器的函数有 : BOOL GUIAPI SetTimer (HWND hwnd, int id, int speed); BOOL GUIAPI KillTimer (HWND hwnd, int id); BOOL GUIAPI SetTimerSpeed (HWND hwnd, int id, int speed); 如下的代码段建立了标识号为 100 的定时器 : SetTimer (hwnd, 100, 20); 然后在适当的时候删除了定时器 : KillTimer (hwnd, 100); 注意, 在 Win32 中, 创建定时器时指定定时器的时间间隔, 而在 MiniGUI 中指定的 是速度 八 鼠标光标 MiniGUI 提供了和 Win32 基本兼容的鼠标光标操作, 其中有光标的创建和销毁, 系统光标支持, 光标剪切, 光标位置以及光标的显示和隐藏等 下面的函数可用来创建 销毁鼠标光标, 或获取系统鼠标光标 : HCURSOR GUIAPI LoadCursorFromFile(const char* filename); HCURSOR GUIAPI CreateCursor(int xhotspot, int yhotspot, int w, int h, const BYTE* pandbits, const BYTE* pxorbits, int colornum); BOOL GUIAPI DestroyCursor(HCURSOR hcsr); HCURSOR GUIAPI GetSystemCursor(int csrid); 函数 GetCurrentCursor 则可以返回当前的鼠标光标 : HCURSOR GUIAPI GetCurrentCursor(void); 下面的函数剪切鼠标光标的活动范围 : void GUIAPI ClipCursor(const RECT* prc); void GUIAPI GetClipCursor(RECT* prc); 下面的函数同步获取或设置鼠标光标的位置, 需要给定屏幕坐标 : void GUIAPI GetCursorPos(POINT* ppt); void GUIAPI SetCursorPos(int x, int y); SetCursor 函数可用来设置鼠标光标形状 : HCURSOR GUIAPI SetCursor(HCURSOR hcsr); ShowCursor 可隐藏或显示鼠标光标 : int GUIAPI ShowCursor(BOOL fshow);

九 插入符 MiniGUI 将完全实现 Win32 对插入符的管理功能 包括如下函数 : CreateCaret DestroyCaret 上述函数用来创建和销毁插入符 GetCaretBlinkTime GetCaretPos HideCaret SetCaretBlinkTime SetCaretPos ShowCaret 上述函数用来显示 隐藏或操作插入符属性 十 键盘和鼠标输入 这部分内容应保持和 Win32 的 80% 兼容, 在现有基础上还需要完成如下工作 : 鼠标输入信息中键盘的标志信息, 即 Ctrl Alt Shift 等键的信息 键盘从原始键码到 ASCII 或 GB2312 码的翻译 十一 键盘快捷键 这部分内容将保持和 Win32 的 90% 兼容, 包含如下函数 : CopyAcceleratorTable CreateAcceleratorTable DestroyAcceleratorTable LoadAccelerators * AddAccelerator * RemoveAccelerator * 上述函数用来操作快捷键数据结构 因为没有资源文件, 因此,LoadAccelerators 是 实现从指定文件中装载快捷键的函数,AddAccelerator 和 RemoveAccelerator 函数用来 向已有的快捷键中添加或删除快捷键 TranslateAccelerator 该函数将快捷键翻译为对应的菜单命令