返回首页

执行摘要
电子在云中的数据捕获这些天在每个人的心中。然而,文件形式仍然发现办事处在世界各地,管理,纸张是一个挑战。表格处理软件采用纸张形式,并把它们转变成可用的电子数据。处理解决方案的传统形式已在桌面上运行,或在本地server.nbsp,这白皮书建议另一种方法:通过Web的形式处理服务。这使得加工形式通过浏览器,移动形式处理和访问形式从超越环境的处理。NET中,如Java或PHP。与Web服务,可以提供表格处理能力,更多的应用程序更多的平台。由于这份文件捕捉市场动向批量收购专案收购(工作站或移动设备),提供形式处理上的能力更多的平台变得越来越有价值。
结构性表格处理是从文档中提取数据的分析和基于预定义的模板图像和领域。典型的结构形式处理 工作流程的需要一个填好的表格文档图像,并确定一组已知的模板。一旦找到一个匹配的模板,数据摘自形式。提取的数据,现在可以坚持一个有利于未来的格式使用,如在一个数据库或XML文件。概述
白皮书将引导您通过一个结构化的形式处理的发展Web服务,使用Windows Communication Foundation(WCF)和Accusoft飞马??FormSuite。 FormSuite SDK中提供。NET库执行结构形式处理。这些库包括用于执行图像的功能识别,图像清理,并提取数据。数据提取机制包括光学字符识别(OCR),手写识别(ICR),光学标记识别(OMR),条形码识别 1,more2。
解决方案本文包括三个parts.nbsp,第一是处理Web服务的形式通过HTTP请求暴露。形式的处理能力调用Web服务"鉴定:?它将接受一个填好的表格图像和标识反对一组已知的候选人模板。表格识别是第一步完整的形式处理系统。
第二部分是一个简单的WinForms应用程序消耗Web服务。但是,你不一定有,使用的WinForms或。NET构建您的应用程序,你可以很轻松地开发Java客户端或PHP的。
最后,本文说明如何建立一个表单集,Web服务将使用执行鉴定反对。
除了限制的形式处理能力,只是形式识别,许多快捷在此Web服务的发展。最终产品将功能,但仅作为一个起点开发企业的现成的解决方案。 要求和假设
本白皮书假定读者熟悉。NET和C#编程语言。 "文件使用Visual Studio 2010,NET 4.0和{A1} 软件开发工具包从www.accusoft.com。 创建Web服务 节将引导您通过建设的形式标识使用WCF的Web服务的过程中FormSuite。创建的Web服务API,可以暴露所谓通过HTTP请求,允许用户通过一个图像文档Web服务和检索XML字符串,其中包含的鉴定结果。架构
Web服务将建立在两个组件。第一个程序集实现和主机的Web服务API。第二次大会实现形式识别功能。这种架构分离的概念和也促进了在其他解决方案的形式识别代码的重用。
Web服务组装主机从一个控制台应用程序的Web服务。 WCF从IIS或从任何。NET应用程序的Web服务主机的许可证。选择该解决方案的主机在一个控制台应用程序Web服务是简化实施。我们将载入有关的设置形式的信息从一个磁盘上的文件(如下所述),并托管在一个控制台应用程序,而不是托管在IIS, 以回避IIS的具体配置和权限issues.nbsp;
解决方案将坚持在磁盘上的文件的形式的信息。这使我们能够使用不支持读取FormDirector数据库。如果本文的范围已较大,我们可以选择存储形式设置中关系database.nbsp的信息;构建Web服务API
运行Visual Studio 2010。创建一个新的控制台应用程序项目NET Framework 4的目标。呼叫项目FormsWebServiceHost,使解决方案的名称"FormWebService ??????因为我们会加入一些其他项目的解决方案。
{S0}
"解决方案资源管理器,现在有一个项目,"; FormsWebServiceHost","与单个源代码文件,Program.cs中。离开喜欢的Program.cs现在,我们会回来后,我们已经建立了稍后我们的web服务的接口。
下一步,更新为您的FormsWebServiceHost项目呢?的目标框架?框架4??(默认的目标是什么??NET Framework 4的客户端配置文件??。这是必需的参考System.ServiceModel.Web大会。
{S1}
我们将建立我们的Web服务接口。要做到这一点,我们需要引用程序集System.ServiceModel.dll和System.ServiceModel.Web.dll。这些集会揭露ServiceContractAttribute的,OperationContractAttribute的,WebInvokeAttribute类,这将被应用到指定的接口合同,并为我们的Web服务调用的方法。
现在,添加一个新的接口定义代码文件到项目中,让我们调用这个接口"IFormWebService .???/ P>
{S2}
以指定刚刚创建的接口定义了一个服务合同,标记与ServiceContractAttribute的接口(从System.ServiceModel命名空间)如下所示。

    [ServiceContract]

    interface IFormWebService

你有一个接口,定义了一个服务合同,您需要添加一些运营服务合同。如前所述,我们的服务 执行形式识别??对一组图像识别已知的模板图像。
定义一个操作界面,执行鉴定。 "操作必须接受图像作为输入,并返回结果鉴定。鉴定结果是复杂的,将包括一个标识符的模板匹配的输入形式,有信心鉴定是正确的,一个场景的错误信息在哪里鉴定失败。 Web服务将返回XML,这个复杂结果可任何调用客户端轻松地解析。
添加一个IFormWebService接口的方法,并称之为"识别??这种方法将接受作为其唯一参数的一个流,并返回一个??代码> IdentificationInfo??对象。流将包含图像文件。 IdentificationInfo是一个类,我们将定义后,在一节"建筑形式鉴定大会??还要注意的是返回一个类,我们似乎有矛盾要求返回XML,但WCF将处理序列化IdentificationInfo对象到XML。后来,我们将讨论什么 我们要做的IdentificationInfo类,以方便该序列化。
WebInvokeAttribute也需要被应用到识别方法。这将让我们指定操作的URL??相对于基本URLWeb服务?和操作响应的HTTP方法(即GET,POST等)。我们将使用POST操作,因为我们是发送二进制数据。虽然POST是默认的操作,我们将明确地指定它的可读性。
申报的识别方法看起来应该像这样。 {C}
UriTemplate价值表明识别操作是在baseURI /确定/访问。
在构建Web服务的下一步是创建一个具体的实施我们的IFormWebService接口。添加一个新类定义的项目和类命名为"FormWebService??
{S3}
修改这个类来实现IFormWebService。你只实施识别方法和实施,应该是相当简单,因为它会所有的工作委托FormsProcessing大会类。所有你需要做的是标准参数检查,并通过添加图像流ProcessorManager的IdentifyMethod。
整个实施FormWebService类看起来应该像这样。
class FormWebService : IFormWebService

{

    public IdentificationInfo Identify(System.IO.Stream imageStream)

    {

        if (imageStream == null)

            throw new ArgumentNullException("imageStream");



        return ProcessorManager.Identify(imageStream);

    }

}
创建一个主机为Web API
我们有Web服务的定义,我们需要主机。这把我们带回到在Program.cs的Main方法。在这种方法中,我们将配置和打开System.ServiceModel.ServiceHost公开我们的网站服务。首先,添加到Program.cs中为System.ServiceModel使用语句System.ServiceModel.Description命名空间。然后在主体方法中,创建一个ServiceHost类的实例,指定服务的URI实施服务合同的对象的类型。
string serviceUri = "http://localhost:8733/FormProcessing/";

ServiceHost host =

    new ServiceHost(typeof(FormWebService),

                    new Uri(serviceUri));

ServiceHost的,在这一点上,没有任何一个端点;我们必须添加端点使客户端能够与服务进行通信。第一在创建端点的第一步是创建一个绑定的对象指定通信协议的端点。因为我们希望我们的服务通过HTTP协议进行通信,我们将创建一个的WebHttpBinding。
    WebHttpBinding binding = new WebHttpBinding();

因为我们规划将图像传递服务,增加最大支持的文件大小和缓冲区的大小。下面的代码显示了如何增加这些128千字节的值,但您可能希望继续走高。
    binding.MaxReceivedMessageSize = 131072; // 128 x 1024

    binding.MaxBufferSize = 131072;

下一步我们将创建ServiceEndpoint对象,指定合同和有约束力的端点。
    ServiceEndpoint serviceEndpoint = 

	host.AddServiceEndpoint("FormsWebServiceHost.IFormWebService", binding, "");

最后一步是在创建服务主机的附加WebHttpBehavior端点,这是时需要使用的WebHttpBinding。
   WebHttpBehavior behavior = new WebHttpBehavior();

   serviceEndpoint.Behaviors.Add(behavior);

服务主机配置,添加代码,以开放的服务,让接受传入的请求。的命令行应用程序的主线程可以继续做别的事情,只要你不出售或关闭的ServiceHost。我们将等待一个被按下,使我们可以正常退出服务的关键。和记得包装在一个try - finally块主线程,以确保ServiceHost的是正确关闭,如果出现异常。
try

{

    host.Open();

    Console.ReadLine();

}

finally

{

    host.Close();

}

另外一点要注意的是,非管理员帐户,不默认情况下已经获得注册服务HTTP命名空间。这意味着您将需要以管理员身份运行程序或授予权限的用户帐户运行的主机注册到命名空间;更多的信息,就可以发现在{A2}。
至在启动时的控制台应用程序请求管理员权限,添加应用程序清单文件到项目中。在打开文件,并更改级别的属性requestedExecutionLevel元素从"asInvoker????代码> requireAdministrator??
<requestedExecutionLevel 

level="requireAdministrator" uiAccess="false" />
大厦表格识别大会节将步行通过创建大会将执行图像识别。
开始加入一个新的类库项目的FormsWebService解决方案。呼叫这个项目的"FormsProcessing??因为这是我们将实施表格处理功能,从FormSuite使用的组件。像上届大会,这个项目的目标框架。框架4。
{S4}的
删除自动生成的类(可能命名为"Class1.cs的??是Visual Studio为您创建。
将在本届大会上添加三个类:一,定义了我们的结果对象(IdentificationInfo.cs),实现的形式处理(FormsProcessor.cs)和一个管理多线程访问FormsProcessors(ProcessorManager.cs)。IdentificationInfo
我们将开始创建IdentificationInfo.cs以来,我们已经谈到,在前面的章节。这个类存储有关的鉴定结果,这将在本次大会的方法,而不是结果对象返回Accusoft FormFix component.nbsp; 我们这样做,因为我们希望封装形式处理的实施细则,也这使得我们从申请DataContractAttribute和DataMemberAttribute(System.Runtime.Serialization命名空间)的IdentificationInfo对象及其属性。这些属性指定的类和成员代表数据合同(这个实现可以定义独立的)是可序列化由DataContractSerializer。所以,当我们以前说我们的服务合同返回IdentificationInfo的对象,WCF为我们自动的(使用的数据合同)的IdentificationInfo序列化成XML对象,以使我们的Web服务返回的XML字符串。
实施IdentificationInfo类这个样子。
[DataContract]

public class IdentificationInfo

{

    public IdentificationInfo(

Accusoft.FormFixSdk.IdentificationResult identificationResult) {...}



    public IdentificationInfo(Exception e) {...}



    [DataMember]

    public String Name { get; set; }



    [DataMember]

    public int IdentificationConfidence { get; set; }



    [DataMember]

    public String Error { get; set; }

}

实施细则的构造是左保存在这个文件的空间,但可以发现 完整的源代码,见本文件的最后一页中的链接。 FormsProcessor
建设加工装配的下一步是创建FormsProcessor类,并实现形式鉴定。这份文件将给予本概述类,但不能进入这个类的实施细则。完整的实施也提供了完整的源代码。
注意:使用FormFix的示例代码和FormDirector实现形式的处理,可以发现在FormAssist源代码,以及在FormFixFormDirector samples.nbsp整个FormSuite产品,包括FormAssistFormFix和FormDirector,可以下载评价的Accusoft在{A3}的网站。
FormsProcessor类实现形式识别功能,使用FormDirector和FormFix组件。 FormDirector是作为一个IO层负载的形式设置和存储在内存中,FormFix实现了识别处理。虽然这些组件实现多形式需要的功能鉴定,FormsProcessor类仍然需要实现管道连接FormDirector到FormFix和控制FormDirector的设置形式加载文件从磁盘。
市民FormsProcessor类如下所示。
    public FormProcessor(){...}

        

public IdentificationInfo Identify(Stream unidentifiedImageStream) {...}

FormsProcessor将被配置为负载从一个名为的文件设置的形式在应用程序的工作目录位于FormSet.frs。后来在这文件中,我们将覆盖这个文件的创建。
注:在这一点上,我们也许应该谈有关事实,我们正在创建一个Web服务,但FormsProcessor使用FormDirector从磁盘加载的形式设置的文件。开箱,FormDirector确实不支持从流中加载和保存的形式设置,也不支持加载和从数据库中保存的形式设置。 FormDirector的概念是抽象出来,所以,加载和保存从流或数据库可以支持通过派生类。
这个解决方案是从磁盘加载的文件和我们在命令行应用程序托管服务,使我们不必写一个数据层或担心的I / O的过程中承载Web服务的权限。您应该评估在您的应用程序中的存储和安全的需要,并使用最适当的执行。 ProcessorManager
在建设FormsProcessing的最后一步大会是创造ProcessorManager class.nbsp类提供了一个解决方案的架构。通过创建一个表单处理挑战FormSuite.nbsp Web服务的挑战源于之间的矛盾FormFix IdentificationProcessor对象的最佳实践中的运用和典型Web服务的体系结构设计。
的最佳实践使用FormFix的IdentificationProcessor国家,一个实例应创建一个窗体设置一次,不应该出售或重新之间悬空的图像处理。这种做法减少开销创建和配置的对象,也是一个类的实例,将学习在输入图像模式,导致随着时间的推移更好的识别性能。
Web服务的典型结构设计距离保持在调用Web服务之间共享对象。这做是为了促进可扩展性和消除需要复杂的代码 防止并发访问的对象。
在这里提出的解决方案,我们将FormFix实践目标的最佳使用牺牲一个网络的要求服务。与所有的解决方案提出在这个文件中,你应该评估最合适的办法是什么您的应用程序。
ProcessorManager将是一个静态类与FormsProcessor对象的队列,将有一个静态方法所谓的"确定吗??接受一个流参数。从FormWebService对象识别方法将被调用;每次调用的识别方法,一个FormsProcessor将出列从队列中,用于执行处理,然后排队。这一机制将确保FormsProcessor只用一个呼叫在Web服务时间。如果多个请求同时调用Web服务,然后一线程可能会发现队列是空的,将不得不等待,直到一个其他线程使用完FormsProcessor对象。
我们将使用ConcurrentQueuelt; TGT;类型(从System.Collections.Concurrent命名空间)的集合,所以我们没有管理访问的FormsProcessors同步。在ProcessorManager的静态构造函数将创建许多FormsProcessors有机器上的处理器。这将使许多同时呼叫,Web服务,而不一个等待的呼叫。
ProcessorManager类的构造如下所示。
static Processor()

{

    processors = new ConcurrentQueue<FormsProcessor>();



    int numberOfProcessors = System.Environment.ProcessorCount;

    for (int num = 0; num < numberOfProcessors; num++)

    {

        processors.Enqueue(new FormsProcessor());

    }

}

,识别方法ProcessorManager类如下所示。
public static IdentificationInfo Identify(Stream unidentifiedImageStream)

{

    FormsProcessor formProcessor;

    while (!processors.TryDequeue(out formProcessor))

    {

        System.Threading.Thread.Sleep(100);

    }

    

    try

    {

        return formProcessor.Identify(unidentifiedImageStream);

    }

    catch (Exception e)

    {

        return new IdentificationInfo(e);

    }

    finally

    {

        processors.Enqueue(formProcessor);

    }

}

现在,我们已经完成了我们的发展FormsProcessing大会,FormsWebServiceHost项目应更新参考FormsProcessing大会。然后使用FormsProcessing声明可以添加到命名空间的IFormWebService.cs和FormWebService.cs文件。
一切都应该建立现在。你可以运行控制台应用程序来启动Web服务,但它会失败,当API调用作出,因为我们还没有创建的形式为它使用。在接下来的两节中,我们将创建一个客户端应用程序来测试Web服务,我们将演示如何创建一个窗体设置使用FormAssist。创建一个测试客户端
在本节中,我们将创建一个测试客户端为Web服务。客户端将是一个简单的的WinForms应用程序,一个按钮打开一个对话框,选择一个图像,图像 将被发送到Web服务。客户端也将有一个文本框显示从Web服务接收的XML。
要建立客户端,添加一个新的开始Windows窗体应用程序项目的FormsWebService解决方案。同样,目标框架应。NET Framework 4中。
你现在应该有一个新的项目空窗体名为Form1的。添加一个Button和TextBoxForm1上。其Multiline属性设置为true的TextBox多行,然后改变TextBox的名称"resultsTextBox??
现在,添加一个按钮的事件处理程序Click事件。在此事件处理程序中,我们将目前文件的用户打开的对话​​框中选择一个图像文件,以确定。
OpenFileDialog openFileDialog = new OpenFileDialog();

if (openFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;

然后我们将尝试打开该文件,并其内容读入一个字节数组。这个字节数组将被传递到Web服务。
byte[] imageBuffer;

using (Stream fileStream = new FileStream(openFileDialog.FileName, FileMode.Open))

{

    imageBuffer = new byte[fileStream.Length];

    fileStream.Read(imageBuffer, 0, imageBuffer.Length);

}

注意:或者,您可以打开图像ImagXpress,以验证它是一个支持的文件类型,然后你可以压缩图像,然后再发送到Web服务。
注2:这也是一个好去处验证文件的大小不超过最大支持的文件大小,这是我们设置到128kBnbsp建设时服务。
下一步是使Web请求Web服务,通​​过图像字节。这是通过创建一个HttpWebRequest的实例(从System.Net命名空间)并指定使用POST方法和要求的内容类型流。我们将内容类型设置为"应用程序/八位字节流??因为我们发送二进制数据,可能是许多图像文件格式之一。然后请求流的内容设置为imageBuffer,并请求流封闭。然后,我们可以得到响应从Web请求,读文本,并把它写入的resultsTextBox。 "做这一切的代码如下所示。
HttpWebRequest httpWebRequest =

    WebRequest.Create(@"http://localhost:8733/FormProcessing/Identify/")

as HttpWebRequest;

if (httpWebRequest != null)

{

    httpWebRequest.Method = "POST";

    httpWebRequest.ContentType = "application/octet-stream";



    

    Stream requestStream = httpWebRequest.GetRequestStream();

    requestStream.Write(imageBuffer, 0, imageBuffer.Length);

    requestStream.Close();



    String response = String.Empty;



    WebResponse webResponse = httpWebRequest.GetResponse();

    using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream()))

        response = streamReader.ReadToEnd();



    resultsTextBox.Text = response;

}

现在,我们已经完成的网站建设服务和测试客户端。剩下的只是第一步是创建的设置形式Web服务使用。这是覆盖在未来一节。创建一个表单集
我们将使用FormAssist,FormSuite演示应用程序,创建的形式设置,Web服务将使用它来识别FormAssist FormSuite第3版SDK安装;您可以发现在开始菜单程序GT下编译的演示程序; AccusoftGT;示范项目GT; FormAssist 3。然后运行演示,我们将建立的设置形式。
当启动对话框弹出,询问你选择一个开始"选项,选择"创建一个新的表单模板库??,然后按"确定"。
{五}
现在FormAssist将打开一个空形式设置。我们将添加几种形式(模板图像)的形式设置;这些模板将用于身份识别的图像。只有黑白(黑白)图像支持,所以你面前添加任何图像,可以肯定的是bitonal.nbsp,您可以转换任何灰度或彩色图像,你必须使用一个图像编辑器,如MS画图或GIMP。
添加一个表单,选择项目"添加新形式形式设置...??文件"菜单下。这将打开一个对话框,在那里你可以选择表单模板的形象。该FormSuiteSDK安装在一些图像%%的公众\文件\飞马成像\ COMMON \ IMAGES,我们将使用这些图像。
选择的形象??EM> BloomingtonPoliceBlank.tif??并打开它。这将添加到窗体设置的新形式BloomingtonPoliceBlank.tif作为模板图像。表单集树反映你现在有这种形式,在下面的图片所示。
{中六}
这种形式的名称已被设置基于模板图像的名称,但它可以改变一个更适当的值。这个名字将作为返回值从Web服务的形式的标识符。要更改名称,请选择的形式设置树的形式。设置面板,下面的表格设置树,现在将包含的形式设置。选择文本框,包含表单名称(这是唯一的文本框和控制,您可以编辑),更新名称,然后按ENTER键。结果显示在下面的图片。
{七}
我们的Web服务,只进行形式鉴定,这是所有你需要做的,添加一个表格(模板图像)的设置形式。到FormAssist了更多的功能,这将使您指定清理操作或定义字段形式,但在本白皮书FormsProcessing大会目前不支持表格处理的任何其他部分,它根本没有鉴定
现在,只是为了让事情变得有趣,添加多形式的形式设置与上述相同的步骤。从同一文件夹中安装的图像FormSuite,添加图像??EM> TexasLotteryBlank.tif???EM> RailroadRetirementTaxBlank.tif ??在现实生活中的情况下,你可能需要对许多可能的模板形象相匹配。
现在,我们已经加入所有形式我们将添加到表单中,我们需要一个图像处理的形式从FormAssist内设置。这使FormFix负载的形式设置一个机会和分析的形式设置的图像,然后我们可以设置保存时的形式存储的信息。这一步是不必需的,但强烈建议;将加快在网上操作服务。
至过程中一个图像,选择项目"的过程中形成... ...??下的工具菜单。您可以选择任何黑白图像处理。这一次,选择?公共%\文件\飞马成像\ COMMON \图片\
RailroadRetirementTaxFilled.tif。??FormAssist过程中形成"窗口将出现。自由探索,后处理已完成。单击"退出"当你做了探索。
现在,我们可以节省的形式设置。请记住,建设Web服务时,我们指定的Web服务将载入形式设置一个文件名为"FormSet.frs??在工作目录过程托管服务。要保存到这个位置,选择项目"保存表单集??根据"文件"菜单上,并导航到构建目录FormsWebServiceHost项目。
{S8}
更改文件名"FormSet.frs??然后单击"保存"。
{S9}
这就是它!现在你可以运行你的web服务和执行您的测试客户端图像识别。运行测试
试验鉴定,第一次运行FormsWebServiceHost.exe。你应该得到一个空白的控制台窗口。
下一步的运行FormsWebServiceTestClient.exe。这将打开一个如下所示的一个窗口。
{S10}
点击确定"按钮,并选择一个黑白图像识别。像以前一样,第一次运行选择的形象呢??EM>%%的公众\文件\飞马成像\ COMMON \图片\ RailroadRetirementTaxFilled.tif??,之后单击"OK" 图像将被发送到服务器进行处理。图像应处理和返回XML结果。 XML是显示在对话框中。
{S11}
作为你可以看到,被认定为图像匹配与信心的模板清莱{A4} lroadRetirementTaxBlank值97。
的所有已为表演形式识别的Web服务成功实施和测试。多个源代码
可读性,实施形式的某些部分的处理Web服务被排除在外;一个完整拷贝源从Accusoft网站可以下载的。NET {A5}。关于FormSuite
FormSuite束Accusoft飞马??形式处理组件成一种方便的安装和折扣的购买价格,当你购买所有包括components.nbsp;你可以下载一个全功能的无限的试用版FormSuite这里:{A6}。请与我们联系atnbsp; info@accusoft.cominfo @ accusoft.comnbsp;更多信息。作者简介
标记达克沃斯,软件工程师,自2008年以来,一直负责对产品的开发工作横跨Accusoft飞马??产品范围。他的贡献包括对形式的工作处理,OCR,ICR,MICR,TWAIN的是,Silverlight,Java和更多。马克赢得了科学计算机科学的硕士和计算机科学学士学位从佐治亚理工学院的科学。{A7} 1,2条形码识别及其他识别引擎不附带FormSuite但兼容的认可发动机是从Accusoft。

回答

评论会员:SK天才 时间:2012/01/27
正如一个实验尝试使用:
CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, false );

参考设备是什么它说,它应该表现作为一个完全兼容的DirectX兼容图形卡完全一样。如果CheckDeviceType工作正常,参考设备上,但在硬件设备上失败,那么你可能有一些不好的司机。

如果参考设备的工程,然后消除任何其他可能性,你可以也作出相同的格式都在显示和BackBuffer格式,还可以得到在当前的显示格式保障工作,因为它的已经设置,像这样

D3DDISPLAYMODE dispMode;

m_Device->GetAdapterDisplayMode(0, &dispMode);

m_Device->CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, dispMode.Format, dispMode.Format, false );

此外,我认为,你只能使用窗口模式(在这种情况下,只使用当前的显示格式),我给上面的相容性检查与全屏模式,以帮助避免从您提供的显示格式转换的问题的例子D3DFMT_UNKOWN在Windows的显示格式
评论会员:。 时间:2012/01/27