IDL文件详解[转]

IDL详解 - Alex_ - 博客园

Question

什么是IDL和MIDL?

Answer:

IDL是接口定义语言。

MIDL是Microsoft的IDL编译器。

在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。

一个例子:

import “unknown.idl” ///用于将其他IDL文件中的定义包含到当前文件中

///Interface IX

[ ///注意是[ ]不是 {}

object, ///所定义的接口是一个COM接口

uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相应的接口IID

helpstring(“IX Interface”), ///将帮助串放入类型库

pointer_default(unique) ///这类指针可以为空,函数内可以修改它们的值,但不能指定别名

]

interface IX:IUnknown

{

///in关键字告诉MIDL需要将此参数值从客户传递给组件,存根代码不需要送回任何值。

HRESULT FxStringIn([in,string]wchar_t* szIn);

///out关键字告诉MIDL参数仅被用来从组件向客户传回有关的数据,

///代理不需要对输出参数进行列集,也不需要将参数传给组件。

HRESULT FxStringOut([out,string]wchar_t* szout);

///COM对字符串的标准约定是Unicode字符(即wchar_t)

}

IDL文件可以定义C和C++风格的结构,并可用它们作为函数的参数。

当IDL文件中有一个library时,MIDL将生成一个类型库。

MIDL为接口生成相应的代理和存根的C代码。

为得到一个代理/存根DLL,需要编译和链接MIDL生成的C文件。

宏REGISTER_PROXY_DLL将完成代理/存根DLL在注册表中的注册操作。

有了IDL和MIDL我们就可以象调用进程内组件那样进行跨进程边界的函数调用,并对参数进行列集(marshal)。

Question

什么是代理和存根DLL?

Answer:

客户与一个模仿组件的DLL进行通信,这个DLL可以完成参数的列集,此组件被称为代理。

一个代理就是同另一个组件行为相同的组件。

代理必须是DLL形式。

组件还需要一个存根的DLL,以便对从客户传来的数据进行散集。

存根也将对传回给客户的数据进行列集。

接口定义语言(IDL)简介

1.ATL不为实现类创建虚函数表,因此初始化成员放在一个公共的函数中(啥意思?!).
2.IDL(接口定义语言)
3.IDL文件由MIDL编译器编译。
4.IDL基础:
接口定义语言是一种方法,通过这种方法,可以定义COM对象所支持的接口。一个COM对象的IDL文件主要包括两个

主要的元素:接口声明和类型库声明。
5.接口
接口是COM组件的一个关键部分,由关键字interface定义。接口的属性包括:

object, uuid(), helpstring(), pointer_default()。

<1>object
object属性是指定接口是COM接口的方法。没有object属性,接口被认为是DCE RPC(分布式计算环境远程过程调用)微软因此增加了object属性,作为为了支持COM。所有你定义的COM接口将有object标志。即所有的COM接口必须要有object属性。

<2>uuid
这指定了接口的GUID,使接口被唯一的标示。

<3>helpstring
最大长度255字节

<4>pointer_default
服务器程序可以在不同的地址空间或不同的机器上运行。这防止客户端程序直接访问服务器程序的内存,反之亦然。因此,当传递指针参数时,指针的地址需要被转换到服务器程序的地址空间中去。pointer_default属性表明这种转换如何发生,对于指针什么样的值是允许的。当指定参数为一个指针是,几个含糊不清的地方需要解决,以确定指针该如何处理。pointer_default()属性指定了默认怎样处理在接口中所有方法的参数。因此除非在参数中显式的指定,pointer_default()值将被应用于这个接口所有方法和属性中所有的指针参数。pointer_default()可能的值为ref,unique,ptr。默认为unique。ref(引用)属性指定NULL不是一个有效的指针和指针必须是一个有效的值。而且指针值是一个常量;指针必须不能改变成内存中的另一个位置,最后你不能改变指针引用的那块分配内存结构的大小。unique允许空指针,并且它可以从空转到非空,反之依然。这样由于可能为空,就不能用于指定结构的大小,如数组。ptr属性页被作为完全指针引用(full pointer),这是闲置最小的指针选项。

<5>接口声明:(类似于C++)
指令_declspec(uuid(x)),这条指令将使接口被打上GUID的烙印,所以,后来如果你指定_uuidof(interface),与接口相关联的GUID将自动被返回。这样很容易访问GUID,例如声明_declspec(uuid())struct _declspec(uuid("C552B896-F10C-480A-871D-0FD926D1C872" http://www.blogcn.com/images/wink.gif)

Istopwatch : public IUnknown
{
...
}
以后无论那里使用uuidof(IStopwatch)即可,例如
hr = CoCreateInstance(_uuidof(TIMERSlib::Stopwatch,NULL,CLSCTX_INPROC_SERVER,_uuifof(IStopwatch),void**&pStopwatch));
将返回与接口相关联的GUID。宏_declspec(novtable)是微软专用的,用作防止创建虚函数表的优化。

6.方法:
COM方法的一般形式为:[attributes]HRESULT name(param_list)

7.参数
主要分析3个参数in,out,retval。这三个参数中in,out是最重要的,这些属性表示了参数传递数据的方向。retval属性是一种方便的将数据返回给客户端程序的方法。
<1>in,in属性说明了参数是从客户端传递给服务器程序。
<2>out,out属性表明参数京被返回给客户端程序。但是没有任何信息将从客户端程序传递给服务器程序,因此。服务器程序不能期望标有这种属性的参数包含任何有效的信息,相反,应该把它看成是未初始化的变量。注意:in和out可以同时使用。
<3>retval,out参数经常与retval属性一起使用,表明这是一个函数的返回值。
注意:每个函数仅可以有一个返回值,因此每个方法只能有一个retval。而且,IDL语法要求:如果一个函数有多个参数,retval参数(如果有的话)必须总是所有参数的最后一个参数。
8.属性(略)
属性是存储在对象中得值,属性是通过存取函数访问的。
属性所特有的3个IDL标志:propget,propput,proprofref.
<1>porpget:指定了一个读取函数,存取函数必须有一个返回值,某个参数必须设值为out
<2>porpput:设置参数,不许有in属性
<3>proproref http://www.blogcn.com/images/tongue.giforpput与proproref的区别在于:后者传递是指针或引用,而不是值。
9.定义类型库(略)
一旦定义了所有的接口,就是定义类型库和属于这个类型库的组件类的时候了。

OMG 接口定义语言(IDL)

用 RPC / COM /CORBA 技术来编写分布式系统时都需要接口定义语言 (IDL)。

IDL特点:

1、IDL 是一种规范语言。

2、IDL 看上去很像 C 语言。

3、OMG IDL 的目的是定义接口和精简分布对象的过程。

4、IDL分离对象的接口与其实现。

5、IDL剥离了编程语言和硬件的依赖性。

6、使用IDL定义接口的客户机程序员不知道接口背后的实现细节。

7、IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。

本文讲解 OMG IDL 的内置类型和关键字。

OMG 接口定义语言内置类型表:

类型 范围 最小大小(bit) 

short -215 到 215-1 16 

unsigned short 0 到 216-1 16 

long -231 到 231-1 32 

unsigned long 0 到 232-1 32 

long long -263 到 263-1 64 

Unsigned long long 0 到 264-1 64 

float IEEE 单精度 32 

double IEEE 双精度 64 

long double IEEE 双字节扩展浮点数 15 位指数,64 位带符号小数 

char ISO Latin-1 8 

wchar 从任何宽字符集编码宽字符,如 Unicode 依赖于实现 

string ISO Latin-1,除了 ASCII NUL 以外 可变化 

Boolean TRUE 或 FALSE 未指定 

octet 0 到 255 8 

any 自己描述的数据类型,可表示任何 IDL 类型 可变化 

IDL 基本类型

整数类型

OMG IDL 摒弃int 类型在不同平台上取值范围不同带来的多义性的问题。

IDL提供2 字节 (short)、4 字节 (long) 和 8 字节 (long long) 的整数类型。

所有这些整数类型都有相应的无符号数类型。

浮点类型

OMG IDL 浮点数类型 float、double 和 long double。

OMG IDL 遵循 IEEE 754-1985 二进制浮点数算术的标准。

目前,long double 用于巨大数字,有些语言映射还不支持这种类型。

char 和 wchar

IDL标准字符集:词法约定(表示 IDL 文件的关键字、注释和文字的字符记号)规定 ISO 8859.1 字符集表示 IDL 文件中的字符。ISO 464 定义了空字符(null)和其它图形字符。

OMG IDL必须处理从一个计算机系统到另一个计算机系统之间的字符传输。从一个字符代码集到另一个字符代码集的转换,取决于语言绑定。

OMG IDL char 是一个 8 位变量,可以用两种方法表示一个字符。

首先,它可以从面向字节的代码集编码单字节字符。

其次,在数组中使用时,可以从多字节字符集(如 Unicode),编码任何多字节字符。OMG IDL Wchar 只允许大于 8 个字节的代码集。规范不支持特殊的代码集。

OMG IDL Wchar允许每个客户机和服务器使用本机的代码集,然后指定如何转换字符和字符串,以便在使用不同代码集的环境之间进行传输。

Boolean

Boolean 值只能是 TRUE 或 FALSE。

Octet

octet 是 8 位类型,一种非常重要的类型。

octet 在地址空间之间传送时不会有任何表示更改。octet 在发送二进制数据,并且将它打包时,它的形式仍然相同。其它每种 IDL 类型在传输时都有表示变化。例如,根据 IOR代码集信息的指示,char 数组会经历代码集转换。而 octet 数组却不会。

any 类型

IDL any 是一种包含任何数据类型的结构。

IDL any由类型码和值组成。类型码描述 any 的值的内容。

IDL any该类型可以是 char 或 long long 或 string 或另一种 any,或者是已经创建的一种类型,如 Address。

IDL any 类似于C++ 的自我描述数据类型void *,但它更安全。

IDL any 类似于 Visual Basic的用户定义的类型variant。

OMG IDL提供自定义数据类型,可以是枚举、结构和联合,或者用 typedef 创建的新类型。

命名的类型

应该使用 typedef 创建新的类型名称,这将帮助解释接口或保存输入。

例如, typedef float AtmosPressure;

在文体上,应注意不要为现有类型创建别名。CORBA 规范不保证 short 的两种 typedef是兼容的和可互换的。

OMG IDL typedef 关键字具体含义取决于其所映射到的实现语言。在 C++ 中,typedef关键字表示类型定义,实际上别名也许是更为精确的术语。

枚举

OMG IDL 枚举是将名称附加到数字的一种方法,从而了解代码更多的含义。

OMG IDL 版的枚举看上去象 C++ 版本的枚举。

例如, enum CloudCover{cloudy, sunny};

CloudCover 现在就成为可以在 IDL 中使用的一种新类型。

枚举最多有 232 个标识。

规范中没有规定标识的有序数值。

OMG IDL 不允许空的枚举。

结构

struct 关键字提供了将一组变量集中到一个结构的方法。

例如,

struct Date {

               short month;

               short day;

               long year;

};

定义 struct 时,要确保所创建的类型是可读的。

不要在不同的名称空间中创建几个不同的同名结构,会使 IDL 的用户糊涂。

识别联合

联合是 C 联合类型和 switch 语句的混合物。

联合必须有类型标记字段。

一次只能有一个联合成员是活动的,并且可以从其识别名称来确定该成员。

例如,

enum PressureScale{customary,metric};

union BarometricPressure switch (PressureScale)

{

 case customary :

    float Inches;

 case metric :

 default:

    short CCs;

};

在以上示例中,如果识别名称是 metric,或者使用了不能识别的识别名称值,那么 short CCs 就是活动的。如果识别名称是 customary,那么 float 成员 Inches 是活动的。联合成员可以是任何类型,包括用户定义的复杂类型。

识别名称类型必须是整数类型(short、long、long long 等,以及 char、boolean 或enumeraton)。

常数定义

常数可以是整数、字符、浮点数、字符串、Boolean、octet 或枚举型,

 不能是 any 类型或用户定义的类型。

例如,

const float MeanDensityEarth = 5.522;      // g/cm^3

const float knot = 1.1508;                 // miles per hour

const char NUL = '\0';

可以用十进制、十六进制或八进制记数法定义整数常数:

例如,

const long ARRAY_MAX_SIZE = 10000;

const long HEX_NUM = 0xff;

对于指数和小数,浮点字符使用常用的 C++ 约定:

例如,

const double SPEED_OF_LIGHT = 2.997925E8;

const double AVOGADRO = 6.0222E26;

字符和字符串常数支持标准换码序列:

例如,

const char TAB = '\t';

const char NEWLINE = '\n';

只要没有混合的类型表达式,就可以在常数说明中使用算术运算符。

用户异常

异常类似于一个结构,从方法中使用异常。

例如,

exception DIVIDE_BY_ZERO {

 string err;

};

interface someIface {

 long div(in long x, in long y) raises(DIVIDE_BY_ZERO);

};

异常将创建名称空间。

异常中的成员名必须是唯一的。

异常不能当作用户定义类型的数据成员使用。

OMG IDL 中没有异常继承。

数组、序列和字符串

每次只传送一个元素是可以的。

一种语言的数组与另一种语言的数组实现通常是不同的。

OMG IDL数组类型IDL array 和 sequence,可以轻易地被映射到实现语言中。

string 类型是一种特殊的序列,它允许语言使用它们的字符串库和优化。

数组

OMG IDL 有任意元素类型的多维固定大小的数组。

所有数组都是有界的。

数组非常适合于与拥有固定数量元素的列表一起使用,而这些元素通常都是存在的。

例如,

// bounded and unbounded array examples

typedef long shares[1000];

typedef string spreadsheet[100][100];

struct ofArrays {

 long anArray[1000];

};

// unbounded arrays NOT ALLOWED

// typedef long orders[];

必须指定数组维数,并且必须为正的整型常量来表示。

IDL 不支持在 C 和 C++ 中的开放数组。

IDL没有指针支持。

IDL必须出现 typedef 关键字,除非指定的数组是结构的一部分。

IDL不以任何方式、形态或形式指定数组下标编排方法。

一种实现语言到另一种实现语言的数组下标可以是不同的。

不能假定将数组下标从客户机发送到服务器时,服务器会调整并指向正确的数组元素。

某些语言的数组下标从 0 开始,而其它的则是从 1 开始。

序列

序列是变长向量,它有两个特征:元素的最大大小,在编译时确定,可以是无限的;

长度,在运行时确定。

序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。

序列可以是有界的,也可以是无界的。

例如,

// bounded and unbounded sequence examples

typedef sequence<long> Unbounded;

typedef sequence<long, 31> Bounded;

一个无限序列可以拥有任意多个元素,只会受到平台内存大小的限制。

有限序列则有边界限制。

无限序列和有限序列都可以不包含元素、用户定义的类型,但可以包含其它序列。

string 和 wstring

string 等价于 char 的序列,而 wstring 表示 wchar 的序列。

作为 C 和 C++ 的折衷,OMG IDL string 和 wstring 可以包含任何字符,除空字符以外。

char 或 wchar 约定确定了类型为 string 的元素大小由 8 个字节表示。

wstring 类型的元素大小是 16 个字节或更多。

IDL 中的字符串很特殊,OMG 允许语言映射使用特殊优化,这些优化不会与通用序列一起处理。

名称和作用域

 OMG IDL 标识都是区分大小写的。

IDL只有一个全局作用域。

整个 OMG IDL 内容和通过预处理器伪指令传入的所有文件共同组成了命名作用域。

任何未出现在某个作用域中的定义都是全局作用域的一部分。

在全局作用域中,以下定义组成了作用域:module、interface、struct、union、operation 和 exception。

module 关键字唯一目的是创建名称空间。

一个标识可以在一个作用域中定义一次,但可以在嵌套作用域中重新定义。

module States {

 // error: redefinition

 // typedef sequence<string> states;

 module Pennsylvania {

    typedef string river;

    interface Capital {

      void visitGovernor();

    };

   };

 module NewYork {

    interface Capital {

      void visitGovernor();

    };

    interface Pennsylvania {

      void visit();

    };

 };

 module NewJersey {

    typedef Pennsylvania::river NJRiver;

    // Error

    // typedef string Pennsylvania;

    interface Capital {

      void visitGovernor();

    };

 };

};

接口

接口指定了服务实现和使用它的客户机之间的软件约定。

一个回调的例子。

// Thrown by server when the client passes

// an invalid connection id to the server

exception InvalidConnectionIdException

{

 long invalidId;

};

// This is the callback interface that

// the client has to implement in order

// to listen to a talker.

interface Listener

{

 // Called by the server to dispatch messages on the client

 void listen(in string message);

 // Called by the server when the connection

 // with the client is successfully opened

 void engage(in string person);

 // Called by the server when the connection with the client is closed

 void disengage(in string person);

};

// interface on the server side

interface Speaker

{

 // Called by the client to open a new connection

 // Returned long is the connection ID

 long register(in Listener client, in string listenerName);

 // Makes the server broadcast the message to all clients

 void speak(in long connectionId, in string message)

    raises(InvalidConnectionIdException);

 // Called by the client to sever the communication

 void unregister(in long connectionId)

    raises(InvalidConnectionIdException);

};

接口名称变成类型,可以当作参数传送。实际是对象引用。

每个对象引用 (IOR) 仅指向一个接口。

IDL 接口对应于类定义,CORBA 对象对应于类实例。

转载于:https://www.cnblogs.com/Dennis-mi/articles/3468851.html

第一章 起步篇 8 本章概述 8 书写本书的背景 8 运用本书 9 IDL所需的版本 9 IDL运行期间所需颜色的数量 9 本书的风格习惯 10 本书中所用的IDL程序和数据文件 12 获取更多的帮助 14 使用IDL命令 14 IDL命令解析 14 创建变量 17 使用IDL图形窗口 22 第二章 简单的图形显示 25 本章概述 25 IDL中简单的图形显示 25 创建线画图 25 定制线画图 28 改变线条的线型和粗细 28 用符号代替线条显示数据 29 用不同的颜色绘制线画图 31 限定线画图的范围 31 改变线画图的风格 32 在线画图上绘出多种数据集 34 在多个轴的图上显示数据 35 创建曲面图 36 定制曲面图 38 旋曲面图 38 为曲面赋色 39 修改曲面图外观 40 创建阴影曲面图 41 改变阴影处理参数 41 用其它数据集为阴影处理提供参数 42 创建等值线图 43 选择等值线数目 45 修改等值线图 46 改变等值线图的外观 47 给等值线图赋色 48 创建填充的等值线图 49 在显示窗口定位图形输出 51 设置图形边缘 52 设置图形位置 52 设置图形区域 53 创建多个图形 53 给图形显示添加文本 57 找出可用字体的名称 58 用XYOutS命令添加文本 58 用矢量字体使用XYOut 59 排列文本 60 删除文本 61 改变文本的方向 61 给图形显示添加线和符号 61 图形显示添加色彩 62 第三章 图像数据处理 65 本章概要 65 图像处理 65 显示图像 65 调整图像数据 67 显示24位图像 69 控制图像显示顺序 70 改变图像尺寸 70 在显示窗口中定位图像 72 从显示器中读取图像 75 IDL中基本的图像处理 75 直方图均衡化 76 平滑图像 77 增强图像棱边 79 图像的频域滤波 80 第四章 图形显示技术 83 本章概要 83 IDL的颜色运用 83 使用索引颜色模式和RGB颜色模式 83 在24位显示设备上装载色谱表 88 获得色谱表的拷贝 88 修改和创建色谱表 89 保存自己的色谱表 90 创建自己的轴标注 91 调整轴刻度间隔 91 格式化轴的标注 92 用IDL处理残缺的数据 95 用IDL建立三维坐标系 97 建立三维散点图 97 从图形原点定位3D坐标轴 99 组合简单图形显示 100 IDL中的动画数据 102 建立动画工具 103 装载动画缓冲区 103 运行动画工具 103 动画的控制 103 存储动画的像素映射图 104 其它类型图形数据的动画 104 网格化数据以便图形显示 105 德洛内三角形法网格化 106 数据的球形网格化 108 第五章 图形显示技巧 110 本章概要 110 将光标用于图形显示 110 什么时候返回的光标位置? 110 哪一个鼠标键和光标共同作用呢? 111 用光标标注图形输出 111 在图像上使用Cursor命令 113 在循环中使用Cursor命令 113 从显示中删除注释 114 删除注释的异或法 114 删除注释的设备拷贝法 116 Z图形缓冲区中的图形显示技巧 120 Z图形缓冲区的实现 121 一个Z图形缓冲区实例:两个曲面 121 用Z图形缓冲区使图像变形 123 Z图形缓冲区中的透明效果 126 将Z图形缓冲区效果与体数据着色相结合 127 第六章 在IDL中读写数据 129 本章概要 129 打开文件进行读写 129 查找和选择数据文件 130 获取逻辑设备号 131 读写格式化数据 132 写自由格式文件 133 读写自由格式文件的实例 136 用确定的文件格式写入 139 从字符串中读取格式数据 141 读写非格式化数据 141 读取非格式化图像数据文件 142 写非格式化图像数据文件 142 非格式化数据文件的一些问题 144 用关联变量存取非格式化数据文件 144 读写常用文件格式的文件 147 创建彩色GIF文件 147 创建彩色JPEG文件 148 查询图像文件信息 150 第七章 图形硬拷贝输出 151 本章概要 151 选择图形硬拷贝输出设备 151 配置图形硬拷贝输出设备 152 常用的Device命令关键字 153 创建PostScript文件 154 将图形送到硬拷贝设备中 154 打印PostScript文件 155 在运行MacOS系统的计算机上打印PostScript文件 156 在Windows计算机上打印PostScript文件 156 生成封装的PostScript文件输出 156 封装PostScript图形的预览 157 生成彩色的PostScript输出 157 PostScript中的彩色图像与灰度图像 158 在PostScript设备上创建高质量的输出 159 显示设备和PostScript设备之间的相同点 159 显示设备与PostScript设备之间的不同点 159 在横向输出模式中计算PostScript的偏移量 172 用PS_Form配置PostScript设备 173 配置和使用打印设备 174 用打印设备定位图形 175 第八章 IDL编程基础 178 本章概述 178 编写IDL批处理文件 178 编写IDL主程序 179 过程和与函数中变量的作用范围 181 创建定位参数 181 定义可选的或必须的定位参数 182 定义关键字 183 创建输出型参数 186 编写IDL函数 189 方括号和函数的调用 190 使用程序控制语句 191 IDL中表达式的真和假 191 将多个语句处理成单个语句 192 If…Then…Else控制语句 192 条件表达式 194 FOR循环控制语句 194 WHILE循环控制语句 194 REPEAT...UNTIL 循环控制语句 194 CASE控制语句 195 GOTO控制语句 195 错误处理控制语句 196 编译和执行IDL程序模块 198 程序编译规则: 198 程序编译和自动运行规则 199 特殊编译命令 199 第九章 编写 IDL 程序 201 本章概述 201 基本的ImageBar程序 201 给程序ImageBar增加一个“先擦除”功能 205 向ImageBar程序增加颜色敏感功能 205 给ImageBar中的命令传递关键字 207 根据窗口大小改变字符大小 209 程序ImageBar的最终代码 210 在图形用户界面中包装ImageBar 211 第十章 编写简单的组件程序 212 本章概述 212 组件程序的结构 212 组件程序如何对事件作出反应 213 编写组件定义模块 213 定义和创建程序组件 214 在屏幕上实现组件 216 使绘图组件成为当前图形窗口 216 在绘图组件窗口上显示图形 216 保存程序运行时所需要的信息 216 创建事件循环和注册程序 217 运行程序 218 创建无阻塞组件程序 219 编写事件处理模块 219 事件结构中的公共字段 219 事件处理函数 220 将事件处理程序和组件联系起来 221 编写Quit按钮的事件处理程序 222 编写改变图形窗口大小的事件处理程序 223 进行小量地修改 224 添加颜色敏感 224 采用更高效的内存管理 225 第十一章 组件编程技巧 229 本章概述 229 改变颜色表 229 保护公共块 230 一个可选择颜色表的工具 230 指定Group Leader 233 给组件程序增加Group Leader 234 在24位显示器上改变颜色表 235 在组件程序中使用指针 237 使用Cleanup过程防止内存泄露 238 使用伪事件进行程序通信 239 创建一个具有“记忆功能”的程序 240 保护组件程序的颜色 243 通过组件跟踪事件来保护颜色 244 通过绘图组件事件来保护颜色 245 保存或者发布程序的图形 245 第十二章 对话框程序 249 本章概述 249 创建模式对话框 249 阻塞的组件程序 249 模式组件程序 250 编写模式对话框的定义模块 250 编写模式对话框的事件处理模块 254 测试模式对话框程序 255 创建非模式的对话框 256 编写非模式对话框程序 256 编写非模式对话框的事件处理模块 258 测试非模态对话程序 259 附录A 组件的事件结构 261 事件结构的定义 261 公共字段的定义 261 基本组件的事件结构 261 base组件 261 按钮组件 261 绘图组件 262 下拉式列表组件 262 标签组件 262 列表组件 262 滑动条组件 262 表单组件 263 文本组件 264 复合组件的事件结构 265 CW_Animate 265 CW_Arcball 265 CW_BGroup 265 CW_Clr_Index 265 CW_Color_Sel 265 CW_DefROI 266 CW_Field 266 CW_Form 266 CW_Flisder 266 CW_Orient 266 CW_PDMenu 266 CW_RGBSlider 266 CW_Zoom 267 组件程序的事件结构 267 Xcolors 267 其他组件的事件结构 267 键盘焦点事件 267 组件退出请求事件 267 组建计时器事件 268 组件跟踪事件 268 附录B 数据文件描述 269
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值