Twain翻译第四章_第1页
Twain翻译第四章_第2页
Twain翻译第四章_第3页
Twain翻译第四章_第4页
Twain翻译第四章_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高级应用程序实现第四章内容能力。4 - 1选择数据传输。4-17ImageData及其布局。4-23转移多个图像。4-26传输压缩数据。4-32替代用户界面。4-35图像的灰度和颜色信息。4-38使用吐温获得光栅图像从一个设备是相对简单的实现在第3章,“应用程序实现”。然而,马克吐温也允许应用程序开发人员超越简单的收购一个图像在本地(DIB或皮克特人)格式。在本章中讨论这些更高级的主题。Capabilities功能,并应用谈判能力的力量来源,给控制TWAIN-compliant应用程序。在第十二章,“操作系统依赖关系”,你会看到的谈判能力,CAP_XFERCOUNT。这种能力是在状态4协商总是

2、如此,除非推迟谈判是同意由应用程序和源代码。在事实上,有更多的了解能力。能力值几个值是用来定义每个功能。在第十章,“能力”,马克吐温定义了一个默认值和一组允许的值为每个功能。应用程序不能修改默认值。然而,它能限制值提供给用户允许的值的子集和选择能力的当前值。默认值源被打开时,每个功能的当前值设置为吐温默认值列在第十章,“功能”。如果没有定义默认的吐温,源将为其默认选择一个值。应用程序可以返回一个TWAIN-defined能力默认发出DG_CONTROL / DAT_CAPABILITY MSG_RESET操作。尽管吐温定义默认值的功能,可能有不同的来源值,它将更喜欢使用作为默认,因为它将更有效

3、。例如,源可能通常使用0在黑白图像显示白色。然而,默认为ICAP_PIXELFLAVOR TWPF_CHOCOLATE即0代表黑人。尽管吐温默认TWPF_CHOCOLATE,来源的首选违约TWPF_VANILLA。当应用程序发出一个DG_CONTROL / DAT_CAPABILITY /MSG_GETDEFAULT操作,返回信息来源对其首选的违约。的源和应用能够更有效的转移在此基础上进行谈判信息。注意,这并不意味着吐温默认值应该完全忽视。当试图解决“首选”价值之间的冲突的一个特定的数据源能力和TWAIN-specified默认情况下,它应该考虑的问题是类似的从会话,会话存储和恢复图像属性。它

4、是合理的假设数据源将想要存储当前值与当前一些功能恢复价值在未来的会议。然后还合理的期望,这些值将恢复反映的当前设置适当的功能。虽然只是存储设置真正有用的图像属性(数据源不会存储的值ICAP_PIXELFLAVOR,但它可能会存储当前ICAP_RESOLUTION),应该说首选数据源的值将以同样的方式对待。加载数据源时,所有当前值适当的功能设置为值,要么恢复从先前的会话,或者那些“喜欢”的数据源。当前价值将继续,直到显式地改变了MSG_RESET调用应用程序,或者应用程序问题。这是最好的说明使用例子,因为并不是所有的功能都适合优先值,最不适合存储和跨多个扫描恢复会话。示例1:扫描参数存储在一个会

5、话,并恢复在另一个1。用户配置数据源的用户界面使用以下参数:4 x6英寸的形象在24位X和Y 200 DPI分辨率2。用户选择“扫描”应用程序和数据源信号传输。3所示。应用获得成功。4所示。应用程序禁用数据源。5。应用程序期间查询状态4帧的当前值,像素类型,深度,和决议。6。数据源每个调查报告是由用户设置的当前值:4 x6英寸图像在24位X和Y 200 DPI分辨率。7所示。应用程序关闭数据源。8。在关闭过程中,数据源存储当前帧,像素类型,深度和决议。9。应用程序打开数据源。10。在开放过程中,数据源恢复当前帧,像素类型,深度和决议。11。应用程序期间查询状态4帧的当前值,像素类型,深度,和决

6、议。12。数据来源报告每个调查恢复从先前的当前值会话:4 x6英寸X和Y图像在24位200 DPI分辨率在一个会话中。示例2:数据源是首选的像素风味的前提下吐温定义默认值1。首次应用程序打开数据源2。应用程序查询期间对违约状态4像素的味道3所示。数据来源报告TWPF_CHOCOLATE默认像素的味道。(见第10章,“能力”)。4所示。应用程序查询期间对当前像素状态4的味道。5。数据来源报告,当前像素味道TWPF_VANILLA(因为这个设备返回数据,性别本身)。6。应用程序问题重置为当前像素的味道。7所示。在复位操作,数据源改变当前值TWPF_CHOCOLATE和准备转化数据转移,以适应期间调

7、用应用程序的请求。有一个条件,这个逻辑。如果想返回的数据源TW_ENUMERATION MSG_GET请求限制能力,有机会的默认值由吐温规范(第十章,“能力”)将不存在在限制设置的值。在这种情况下,应用程序应该考虑默认值是未定义的。常识应该规定数据源提供一些默认的当前可用的值集内合理安全(糟糕的指数TW_ENUMERATION)可能是一个灾难。当默认值是(在使用MSG_RESET)应当及时解除约束,最初的默认值将再次和存在被定义。(参见下一节关于MSG_RESET约束能力)这只是一个问题TW_ENUMERATION容器,因为它包含一个索引默认。Current Value应用程序可以请求集的当前

8、值的能力。如果源的用户界面显示,当前值应该反映(也许通过突出)。如果应用程序设置当前值,它将用于收购和转让,除非用户或自动源过程变化。应用程序可以通过检查确定是否发生了改变当前值在国家6。确定功能的当前值,使用DG_CONTROL / DAT_CAPABILITY /MSG_GETCURRENT。可用来确定当前值和值,使用DG_CONTROL / DAT_CAPABILITY MSG_GET操作。例如,您可以做一个MSG_GETICAP_PIXELTYPE和源可能会返回一个包含TW_ENUMERATION容器TWPT_BW、TWPT_GRAY TWPT_RGB作为可用值。设置当前值:使用DG_

9、CONTROL / DAT_CAPABILITY MSG_SET和下列容器之一:在TW_ONEVALUE.ItemTWON_ONEVALUE:把所需的价值。TWON_ARRAY:只在TW_ARRAY.ItemList所需的物品。这些必须返回的条目的一个子集来源MSG_GET操作。还可以使用TW_ENUMERATION和TW_RANGE容器设置当前值。详情查看可用的值信息。Available Values限制设置源可以用在获取和传输过程中,应用程序可以限制可用的值。源外这些不应该使用一个值值。这些限制应该反映在源的用户界面没有值不提供给用户。例如,如果MSG_GET操作ICAP_PIXELTYP

10、E表示支持来源TWPT_BW、TWPT_GRAY TWPT_RGB图像和应用程序只希望黑人和白人图像,它可以请求限制可用的值,黑色和白色。限制可用的值:使用DG_CONTROL / DAT_CAPABILITY / MSG_SETCONSTRAINT和下列之一容器:TWON_ENUMERATION:地方只有所需的值TW_ENUMERATION。ItemList字段。当前值也可以设置在这个时间设置CurrentIndex ItemList指向所需的值。TWON_RANGE:地方只有所需的TW_RANGE字段中的值。当前值也可以通过设置CurrentValue设置字段。注意:TW_ONEVALUE

11、容器不能用于限制可用的值。Capability Negotiation谈判过程包括三个基本部分:1。应用程序决定了哪些功能支持来源2。应用程序集所需的支持能力3所示。应用程序验证设置源所接受谈判(第1部分)源支持的应用程序决定了哪些功能步骤1应用程序分配一个TW_CAPABILITY结构和填充它的字段如下:盖= CAP_,ICAP_或ACAP_名称的能力很感兴趣ConType = TWON_DONTCARE16hContainer =零步骤2应用程序使用DG_CONTROL / DAT_CAPABILITY TW_CAPABILITY结构MSG_GET操作。步骤3源检查帽字段是否支持能力。如果

12、是这样,它创造了为应用程序的信息。在这两种情况下,适当地设置它的返回代码。步骤4应用程序检查返回代码,也许条件代码,从操作。如果TWRC_SUCCESS支持能力和来源ConType字段与容器由源标识符(TWON_ARRAY,TWON_ENUMERATION、TWON_ONEVALUE或TWON_RANGE)源分配容器结构hContainer ConType和引用场结构。然后容器装满值描述能力的当前值、默认值和可用的值。基于容器的类型及其内容(其类型是由其ItemType表示字段),应用程序可以读取的值。应用程序必须释放容器。如果TWRC_FAILURE TWCC_CAPUNSUPPORTED来

13、源不支持此功能应用程序可以重复这个过程要了解每一个功能。如果应用程序只希望得到的当前值的能力,它可以使用MSG_GETCURRENT操作相反。在这种情况下,ConType就是TWON_ONEVALUE或TWON_ARRAY但不是TWON_RANGE或TWON_ENUMERATION。注:能力,CAP_SUPPORTEDCAPS,返回一个列表的功能,支持来源。但这并不表明是否支持功能可以协商,如果源不支持CAP_SUPPORTEDCAPS功能,它返回TWRC_FAILURE /TWCC_CAPUNSUPPORTED。谈判(第2部分)应用程序集所需的支持能力步骤1应用程序分配一个TW_CAPABI

14、LITY结构和填充它的字段如下:上限= CAP_、ICAP_或ACAP_名称功能感兴趣ConType = TWON_ARRAY、TWON_ENUMERATION TWON_ONEVALUE或TWON_RANGE(参见第十章,“能力”看到每个能力和什么类型的容器可以用来设置一个特定的功能。)hContainer =应用程序必须分配一个ConType类型的结构和参考这一领域。(见下一步。)步骤2应用程序分配一个结构类型的ConType并填充它。基于收到的值在MSG_GET源,它可以指定所需的当前值和可用值它想要源使用。应用程序不应该试图设置源的默认价值,把一个合适的常数在这一领域(例TWON_DO

15、NTCARE32)。注意:应用程序负责回收容器结构时的操作完成为止。步骤3发送请求到源使用DG_CONTROL / DAT_CAPABILITY /MSG_SETCONSTRAINT。谈判(第3部分)应用程序必须验证他们的请求的结果步骤1即使源支持一个特定的功能,它不需要支持的设置这种能力。应用程序必须检查MSG_SET请求的返回代码看看发生什么。如果TWRC_SUCCESS源设置功能要求。如果TWRC_CHECKSTATUS那么源不能使用一个或多个你的确切值。例如,你要求值为310,但只能接受100,200,300,300。你的要求是在它最亲密的有效合法的范围,所以它的设置。使用DG_CON

16、TROL / DAT_CAPABILITY / MSG_GET操作来确定当前和可用的设置。这是唯一的方法来确定源的选择接受您的应用程序。如果TWRC_FAILURE / TWCC_BADVALUE源不批准你的请求组或限制的价值。,或者你的要求值并不在其合法的值。它可能试图将值设置为最亲密的可用价值。使用DG_CONTROL / DAT_CAPABILITY / MSG_GET操作来确定当前和可用的设置。这是唯一的方法可以确定您的应用程序继续没有你的要求值。您可以重复设置和验证流程每一个感兴趣的你的能力应用程序。记住,你的应用程序必须释放所有容器结构。The Most Common Capabi

17、lities吐温定义了超过150的能力。虽然看起来势不可挡,它是更容易处理如果你认识到更常用的一些功能。这里有一些这些功能:基本的能力单位ICAP_UNITS能力决定了所使用的度量单位将源。默认是英寸但厘米、像素等都是允许的。这个功能使用的价值在测量其他值的功能和数据结构包括:ICAP_PHYSICALHEIGHT,ICAP_PHYSICALWIDTH,ICAP_XNATIVERESOLUTION,ICAP_YNATIVERESOLUTION,ICAP_XRESOLUTION,ICAP_YRESOLUTION,TW_FRAME,TW_IMAGEINFO.XResolution,TW_IMAGE

18、INFO.YResolution意义上的像素ICAP_PIXELFLAVOR指定应该如何解释一些数据时转移从源应用程序。默认是TWPF_CHOCOLATE这意味着一个0表示黑色的(或最黑暗的颜色)。TWPF_VANILLA替代,0表示白色(或手段轻的颜色)。决议图像分辨率是报道TW_IMAGEINFO结构。查询或设置源的决议,使用ICAP_XRESOLUTION和ICAP_YRESOLUTION。还指ICAP_XNATIVERESOLUTION ICAP_YNATIVERESOLUTION。Image Type Capabilities类型的像素应用程序应该ICAP_PIXELTYPE ICA

19、P_BITDEPTH,除非它可以进行谈判处理所有像素类型位深。允许像素类型有:TWPT_BW TWPT_GRAY,TWPT_RGB、TWPT_PALETTE TWPT_CMY、TWPT_CMYK TWPT_YUV,TWPT_YUVK,TWPT_CIEXYZ,TWPT_INFRARED。像素的深度(位)像素类型如TWPT_BW只允许1比特每像素(黑色或白色)。另一个像素类型可能允许各种比特每像素24或48比特位(4比特或8位灰度,颜色)。是首先确定设置ICAP_PIXELTYPE,然后设置ICAP_BITDEPTH。Parameters for Acquiring the Image曝光可以影响

20、这几个功能。它们包括ICAP_BRIGHTNESS ICAP_CONTRAST,ICAP_SHADOW、ICAP_HIGHLIGHT ICAP_GAMMA,ICAP_AUTOBRIGHT。扩展指导一个源图像在传输之前,规模指ICAP_XSCALING和ICAP_YSCALING。旋转指导一个源旋转图像在传输之前,参考ICAP_ROTATION和ICAP_ORIENTATION。Constrained Capabilities and Message Responses有一些困惑关于数据源应该如何应对各种功能查询当应用程序实施了限制所支持的价值观。以下指南应该帮助澄清的情况。MSG_RESET众

21、所周知,这个调用重置的当前值默认请求的能力。它必须也是说这叫还将重置任何应用程序实施约束要求能力。MSG_GETCURRENT,MSG_GETDEFAULT直观的假设这消息不应该不支持的功能当前或默认值。然而,规范说否则在第十章,“能力”(CAP_SUPPORTEDCAPS就是一个很好的例子)。在这种情况下,简单地应对这些是有意义的以同样的方式作为MSG_GET消息。它也可以被认为是更直观的数据源来应对这种能力TW_ONEVALUE TW_ONEVALUE容器容器在所有情况下,是被允许的。MSG_GET如果一个应用程序限制目前的能力,然后反应的数据源消息应该反映这些约束。否则,这应该回应所有的

22、值支持的数据源。当然,可以放置在响应值限制允许的容器特定的第十章中概述当前的能力,“能力”。MSG_SET (applies if either the application or the driver is TWAIN 2.1 or less)在第七章表示,“三胞胎行动”,此功能三联体的描述:“当前值设置在容器TW_ONEVALUE或TW_ARRAY。可用的和当前值设置当容器TW_ENUMERATION或TW_RANGE。”进一步澄清这个操作,应该指出,当应用程序强加一个约束,数据源必须考虑支持的一组值的设置要求约束。的产生的价值观应当只包含那些支持和共享的价值观要求。实施后,可能会出现一

23、个条件约束,默认值是不再一组支持的值。的报道,当使用TW_ENUMERATION默认索引应该被改变的数据源的东西属于新的约束集。这是简单的预防措施,以确保它是一个有效的索引。在这种情况下,默认的索引中TW_ENUMERATION失去意义和应用程序应该被忽略的,因为MSG_RESET应当导致约束被消除。MSG_SET(如果适用于应用程序和驱动程序是吐温2.2或更多)当应用程序和司机都是吐温2.2或更高版本MSG_SET只改变了当前值,它没有影响可用的值。这适用于无论容器类型使用。换句话说,TW_ENUMERATION和TW_RANGE可用于设置当前值使用MSG_SET。只在TW_ENUMERAT

24、ION ItemType,CurrentIndex ItemList字段是用于获取当前值。只在TW_RANGE ItemType和CurrentValue使用字段。MSG_SETCONSTRAINT (applies if both the application and the driver is TWAIN 2.2 ormore)第七章指出,“三胞胎行动”:“当前值设置在容器TW_ONEVALUE或TW_ARRAY。可用的和当前值设置当容器TW_ENUMERATION或TW_RANGE。”进一步澄清这个操作,应该指出,当应用程序强加一个约束,数据源必须考虑支持的一组值的设置要求约束。的产生

25、的价值观应当只包含那些支持和共享的价值观要求。实施后,可能会出现一个条件约束,默认值是不再一组支持的值。的报道,当使用TW_ENUMERATION默认索引应该被改变的数据源的东西属于新的约束集。这是简单的预防措施,以确保它是一个有效的索引。在这种情况下,默认的索引中TW_ENUMERATION失去意义和应用程序应该被忽略的,因为MSG_RESET应当导致约束被消除。Capability Containers in Code Form功能应用程序之间的信息传递和利用数据结构称为源容器:TW_ARRAY TW_ENUMERATION、TW_ONEVALUE TW_RANGE。所需的行为创建(包)和

26、读取(解压缩)容器在下面的代码段。容器是灵活的,因为它们可以定义包含许多类型的数据之一。只有一个ItemType(TWTY_xxxx)说明/容器(TWON_xxxx)。指工具箱磁盘完整的包装和拆包实用程序,您可以使用容器。Reading (unpacking) a Container from a MSG_GET Operation/-/Example of DG_CONTROL / DAT_CAPABILITY / MSG_GET/-TW_CAPABILITY twCapability;TW_INT16 rc;/Setup TW_CAPABILITY StructuretwCapabilit

27、y.Cap = Cap; /Fill in capability of interesttwCapability.ConType = TWON_DONTCARE16;twCapability.hContainer = NULL;/Send the Tripletrc = (*pDSM_Entry)(&AppID,&SourceID,DG_CONTROL,DAT_CAPABILITY,MSG_GET,(TW_MEMREF)&twCapability);/Check return codeif (rc = TWRC_SUCCESS)/Switch on Container Typeswitch (

28、twCapability.ConType)/-ENUMERATIONcase TWON_ENUMERATION:pTW_ENUMERATION pvalEnum;TW_UINT16 valueU16;TW_UINT16 index;pvalEnum =(pTW_ENUMERATION)GlobalLock(twCapability.hContainer);NumItems = pvalEnum-NumItems;CurrentIndex = pvalEnum-CurrentIndex;DefaultIndex = pvalEnum-DefaultIndex;for (index = 0; in

29、dex NumItems; index+)if (pvalEnum-ItemType = TWTY_UINT16)valueU16 = (TW_UINT16)(pvalEnum-ItemListindex*2);/Store Item Valueelse if (pvalOneValue-ItemType = TWTY_BOOL)valueBool = (TW_BOOL*)&pvalEnum-ItemList)index;/Store Item ValueGlobalUnlock(twCapability.hContainer);break;/-ONEVALUEcase TWON_ONEVAL

30、UE:pTW_ONEVALUE pvalOneValue;TW_BOOL valueBool;pvalOneValue =(pTW_ONEVALUE)GlobalLock(twCapability.hContainer);if (pvalOneValue-ItemType = TWTY_BOOL)valueBool = (TW_BOOL)pvalOneValue-Item;/Store Item ValueGlobalUnlock(twCapability.hContainer);break;/-RANGEcase TWON_RANGE:pTW_RANGE pvalRange;pTW_FIX3

31、2 pTWFix32;float valueF32;TW_UINT16 index;pvalRange = (pTW_RANGE)GlobalLock(twCapability.hContainer);if (TW_UINT16)pvalRange-ItemType = TWTY_FIX32)pTWFix32 = &(pvalRange-MinValue);valueF32 = FIX32ToFloat(*pTWFix32);/Store Item ValuepTWFix32 = &(pvalRange-MaxValue);valueF32 = FIX32ToFloat(*pTWFix32);

32、/Store Item ValuepTWFix32 = &(pvalRange-StepSize);valueF32 = FIX32ToFloat(*pTWFix32);/Store Item ValueGlobalUnlock(twCapability.hContainer);break;/-ARRAYcase TWON_ARRAY:pTW_ARRAY pvalArray;TW_UINT16 valueU16;TW_UINT16 index;pvalArray = (pTW_ARRAY)GlobalLock(twCapability.hContainer);for (index = 0; i

33、ndex NumItems; index+)if (pvalArray-ItemType = TWTY_UINT16)valueU16 = (TW_UINT16)(pvalArray-ItemListindex*2);/Store Item ValueGlobalUnlock(twCapability.hContainer);break; /End Switch StatementGlobalFree(twCapability.hContainer); else /Capability MSG_GET Failed check Condition Code/* Fix32ToFloat* Co

34、nvert a FIX32 value into a floating point value.*/float FIX32ToFloat (TW_FIX32 fix32)float floater;floater = (float)fix32.Whole + (float)fix32.Frac / 65536.0;return floater;Creating (packing) a Container for a MSG_SET Operation/-/Example of DG_CONTROL / DAT_CAPABILITY / MSG_SET/-TW_CAPABILITY twCapa

35、bility;TW_INT16 rc;TW_UINT32 NumberOfItems;twCapability.Cap = Cap; /Insert Capability of InteresttwCapability.ConType = Container;/Use TWON_ONEVALUE or TWON_ARRAY to set current value/Use TWON_ENUMERATION or TWON_RANGE to limit available valuesswitch (twCapability.ConType)/-ENUMERATIONcase TWON_ENUM

36、ERATION:pTW_ENUMERATION pvalEnum;/The number of Items in the ItemListNumberOfItems = 2;/Allocate memory for the container and additional ItemList/ entriestwCapability.hContainer = GlobalAlloc(GHND,(sizeof(TW_ENUMERATION) + sizeof(TW_UINT16) *(NumberOfItems);pvalEnum = (pTW_ENUMERATION)GlobalLock(twC

37、apability.hContainer);pvalEnum-NumItems = 2 /Number of Items in ItemListpvalEnum-ItemType = TWTY_UINT16;(TW_UINT16)(pvalEnum-ItemList0) = 1;(TW_UINT16)(pvalEnum-ItemList1) = 2;GlobalUnlock(twCapability.hContainer);break;/-ONEVALUEcase TWON_ONEVALUE:pTW_ONEVALUE pvalOneValue;twCapability.hContainer =

38、 GlobalAlloc(GHND,sizeof(TW_ONEVALUE);pvalOneValue =(pTW_ONEVALUE)GlobalLock(twCapability.hContainer);(TW_UINT16)pvalOneValue-ItemType = TWTY_UINT16;(TW_UINT16)pvalOneValue-Item = 1;GlobalUnlock(twCapability.hContainer);break;/-RANGEcase TWON_RANGE:pTW_RANGE pvalRange;TW_FIX32 TWFix32;float valueF32

39、;twCapability.hContainer = GlobalAlloc(GHND, sizeof(TW_RANGE);pvalRange = (pTW_RANGE)GlobalLock(twCapability.hContainer);(TW_UINT16)pvalRange-ItemType = TWTY_FIX32;valueF32 = 100;TWFix32 = FloatToFIX32 (valueF32);pvalRange-MinValue = *(pTW_INT32) &TWFix32);valueF32 = 200;TWFix32 = FloatToFIX32 (valu

40、eF32);pvalRange-MaxValue = *(pTW_INT32) &TWFix32);GlobalUnlock(twCapability.hContainer);break;/-ARRAYcase TWON_ARRAY:pTW_ARRAY pvalArray;/The number of Items in the ItemListNumberOfItems = 2;/Allocate memory for the container and additional ItemListentriestwCapability.hContainer = GlobalAlloc(GHND,(

41、sizeof(TW_ARRAY) + sizeof(TW_UINT16) * (NumberOfItems);pvalArray = (pTW_ARRAY)GlobalLock(twCapability.hContainer);(TW_UINT16)pvalArray-ItemType = TWTY_UINT16;(TW_UINT16)pvalArray-NumItems = 2;(TW_UINT16)(pvalArray-ItemList0) = 1;(TW_UINT16)(pvalArray-ItemList1) = 2;GlobalUnlock(twCapability.hContain

42、er);break;/-MSG_SETrc = (*pDSM_Entry)(&AppID,&SourceID,DG_CONTROL,DAT_CAPABILITY,MSG_SET,(TW_MEMREF)&twCapability);GlobalFree(twCapability.hContainer);switch (rc)case TWRC_SUCCESS:/Capabilitys Current or Available value was set as specifiedcase TWRC_CHECKSTATUS:/The Source matched the specified valu

43、e(s) as closely aspossible/Do a MSG_GET to determine the settings madecase TWRC_FAILURE:/Check the Condition Code for more information/* FloatToFix32* Convert a floating point value into a FIX32.*/TW_FIX32 FloatToFix32 (float floater)TW_FIX32 Fix32_value;TW_INT32 value = (TW_INT32) (floater * 65536.

44、0 + 0.5);Fix32_value.Whole = value 16;Fix32_value.Frac = value & 0x0000ffffL;return (Fix32_value);Delayed Negotiation - Negotiating Capabilities After State 4应用程序可能询问一个源的能力值在会话期间的任何时候源。然而,作为一个规则,应用程序只能请求期间设置功能状态4。这一限制背后的基本原理与源的显示的用户界面时启用源。许多来源将修改的内容用户界面响应一些应用程序请求的设置。这些用户界面修改防止用户从选择的选择不符合应用程序的请求的值。源的

45、用户界面不会显示在状态4就可以改动所以用户的意识。然而,界面会显示在状态5到7。有些功能没有影响源的用户界面和应用程序可能真的想让他们以后比4。允许推迟谈判,应用程序必须请求,在状态4,一个特定的功能可以设置后(在州5、6、7)。源可能同意这个请求或拒绝它。请求应用程序与协商源利用DG_CONTROL CAP_EXTENDEDCAPS / DAT_CAPABILITY操作能力。CAP_EXTENDEDCAPS能力,DG_CONTROL / DAT_CAPABILITY操作:MSG_GET表示能力源州5中愿意协商,6或7。MSG_SET指定哪些功能应用程序希望谈判在5、6、7。对马克吐温2.3或

46、更高版本的数据源,该值将已经被设置为允许的值数据源,从未开始空列表。MSG_GETCURRENT源提供一个数组的功能允许在州5谈判,6和7。为吐温2.3或更高版本的数据源,该值将已经被设置为允许的值数据源,从未开始空列表。与任何其他功能,如果源不支持谈判CAP_EXTENDEDCAPS,将返回的返回码TWRC_FAILURE TWCC_CAPUNSUPPORTED条件代码。如果一个应用程序试图设置一个状态的能力5、6、7和源没有之前同意这样的安排,操作将会失败TWRC_FAILURE的返回代码TWCC_SEQERROR的状态码。如果应用程序不使用源的用户界面,但提出了自己的应用程序显式地控制源

47、的状态。如果应用程序想要设置任何的价值功能,它返回源状态4和这样做。因此,应用程序使用它自己的用户界面将可能不需要使用CAP_EXTENDEDCAPS。Options for Transferring Data正如前面所讨论的,有三种模式定义为吐温传输数据:本地磁盘文件缓冲内存源需要支持本地和缓冲内存传输。Native Mode Transfer使用本地模式,默认模式,传输数据覆盖在第3章,“应用程序实现”。有一个潜在的限制,可以发生在一个本地模式转移。也就是说,可能没有一个足够大的内存块可用来保存图像。这种情况下不会被发现,直到传输尝试当应用程序问题DG_IMAGE / DAT_IMAGEN

48、ATIVEXFER / MSG_GET操作。缺乏记忆出现时,源可能回应的几种方法。它可以:简单操作失败。视频图像,让它可用RAM -源应通知用户剪切操作发生是由于有限的内存。剪切应保持的选择图像的纵横比和原点(左上角)。与用户互动让他们调整图像或取消捕获。返回的返回码/条件代码DG_IMAGE / DAT_IMAGENATIVEXFER /MSG_GET操作可能表明这些行动的发生。If the Return Code is TWRC_XFERDONE:这表明转让完成后,会话状态7。然而,它不保证源没有剪辑图像,使其健康。即使应用程序发布DG_IMAGE / DAT_IMAGEINFO MSG_

49、GET操作转移之前确定的形象大小,不能认为ImageWidth和ImageLength值返回操作真正适用于最终的图像传输。如果图像的尺寸重要的应用程序,应用程序应该检查实际的图像传输转让完成后大小。要做到这一点:1。执行一个DG_CONTROL / DAT_PENDINGXFERS / MSG_ENDXFER操作移动会话状态7 - 6(5)。2。确定图像的实际大小是通过阅读标题的转移实际的图像数据传输。看到第12章,“操作系统依赖关系”获得更多信息。如果返回代码TWRC_CANCEL:收购被用户取消。会话状态是7。执行一个DG_CONTROL /DAT_PENDINGXFERS / MSG_E

50、NDXFER操作将会话状态7 - 6(5)。如果返回代码TWRC_FAILURE:检查状态码来确定故障的原因。会话状态是6。没有内存分配的DIB和皮克特人。图像仍悬而未决。如果缺乏记忆原因,你可以尝试免费额外的内存或丢弃悬而未决的图像通过执行DG_CONTROL / DAT_PENDINGXFERS / MSG_ENDXFER。Disk File Mode Transfer磁盘文件模式被确定为TWSX_FILE。不需要支持磁盘文件来源转移验证的支持是很重要的。确定源支持磁盘文件模式使用DG_CONTROL / DAT_CAPABILITY MSG_GET操作。设置TW_CAPABILITY I

51、CAP_XFERMECH帽字段。源返回的信息传输模式支持的容器结构指出TW_CAPABILITY hContainer字段的结构。磁盘文件模式确认为TWSX_FILE。支持验证磁盘文件传输后,设置转移在国家4:设置ICAP_XFERMECH TWSX_FILE。使用DG_CONTROL / DAT_CAPABILITY /MSG_SET操作。使用DG_CONTROL / DAT_CAPABILITY / MSG_GET操作,以确定哪些文件格式可以支持来源。设置TW_CAPABILITY。上限ICAP_IMAGEFILEFORMAT并执行MSG_GET。源返回的支持格式标识符从TWFF_开始,可

52、能包括TWFF_PICT、TWFF_BMP TWFF_TIFF等等。在吐温的上市。H文件第八章的常量部分,”数据类型和数据结构”。During States 4, 5, or 6:设置转移MSG_GET DG_CONTROL / DAT_SETUPFILEXFER操作,可以使用MSG_GETDEFAULT,MSG_SET。DSM_Entry调用中使用的数据结构是一个(TW_SETUPFILEXFER结构DAT_SETUPFILEXFER):typedef struct TW_STR255文件名;* / / *文件包含数据TW_UINT16格式;/ * TWFF_xxxx常量* /TW_HANDLE VrefNum;/ *仅用于Macintosh * / TW_SETUPFILEXFER,远* pTW_SETUPFILEXFER;应用程序可以使用MSG_GETDEFAULT操作来确定默认文件格式和文件名(吐温。TMP或马克吐温。澳元在当前目

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论