.NET Compact Framework通过托管Win32代码获得HtmlDocument:
问题引入:
有过CF的项目经验的朋友一定常常遇到与BS后台对接的问题,HTML在BS系统中有着得天独厚的条件,他能够直接被用作界面显示,并且能够被C#代码和Javascript操作,因此在一些应用中BS系统可能采取在数据库中存储HTML表单的设计,例如一些表单可视化设计控件(Table Designer)生成的就是HTML,直接存储HTML的好处在于绕过了解析HTML DOM的复杂性,可是在前端与之对接的Mobile应用程序中就带来的问题,当我的.NET CF程序读取到包含HTML的字段后就显得很尴尬了,用正则表达式解析HTML生成WinFom界面显然不切实际,然而.NET CF似乎只为我们提供了这么一条路,因为如果用WebBroswer(以下简称WB)控件直接显示HTML,很有可能因为HTML的规格不适合PDA屏幕而使得用户体验非常糟糕,一个常见的问题就是HTML FORM的宽度超出了Mobile设备屏幕范围,而使得WB出现横向滚动条,这还不是问题的关键,关键在于你将HTML交给了WB控件之后你就没有任何控制权了,WebBrowser类为我们提供的唯一和HTML交互手段是一个叫DocumentText的属性,遗憾的是该属性是SetOnly的,也就是说只有Set访问器,那么获取表单中输入的数值就不可能了。这个问题在Full Framework(以下简称FF)中是不存在的,因为FF中的WebBroswer类为我们提供了Document属性,它返回类型为HtmlDocument的HTML DOM结构,借助该属性可以轻松的完成HTML交互任务。对于上述问题我的思路还是使用HTML DOM模型来和HTML交互,如果您使用过WebBroswer.Document属性来操作HTML,那么您应该知道HtmlDocument只不过是封装了COM接口IHTMLDocument2的对象而已,他的大部分功能都是COM中提供的,那么CF里这个接口要怎么引入呢?这就是本文要解决的问题.
解决之道:
解决上述问题并不需要造原子弹的技术,不过阅读以下内容之前您需要具备Windows COM知识和.NET Compact Framework中P/Invoke基础知识,这里不需要您了解Data layout,但至少您要知道C++中的char*封送为string,不过作为CF开发者,我建议您还是深入学习P/Invoke,如果您没有这些知识那么我推荐您先阅读以下文章:
http://msdn.microsoft.com/en-us/library/aa446529.aspx
http://msdn.microsoft.com/en-us/library/k3f1t3ct(VS.80).aspx
http://msdn.microsoft.com/en-us/library/aa446497.aspx
当您已经掌握了这些知识那么恭喜您,您可能不需要把我的文章全部看完就能够做我们要做的事了。
既然CF中的WebBrowser控件没有提供我们对HtmlDocument的访问,那么我们来看看EVC中的HTML Control(以下简称HC)吧。
我一开始翻阅了大量Window Mobile SDK的文档,甚至在帮助文档中的HTML Control API Messages主题也找不到任何Message能够取得HC内部的HTML,最后在一个国外的C++开发论坛中找到了一些线索,其实在Mobile API中其实是可以访问HtmlDocument模型的,有这么一个Message可以返回HC的HTML Document对象,那就是DTM_DOCUMENTDISPATCH,有趣的是我们在SDK文档中输入DTM_DOCUMENTDISPATCH可以找到帮助页面,并且下方有HTML Control API Messages主题的链接,可是HTML Control API Messages帮助主题并没有介绍DTM_DOCUMENTDISPATCH消息,我们来看看DTM_DOCUMENTDISPATCH的描述吧:
The DTM_DOCUMENTDISPATCH message is sent by an application to the HTML viewer control to request a reference to its IDispatch interface.
Syntax
DTM_DOCUMENTDISPATCH
wParam = 0;
lParam = (LPARAM)(IDispatch*) ppDisp;
ParameterswParam Not used. pDisp [out] Reference to the HTML viewer control's IDispatch interface. Return Values
Returns the HTML viewer control's IDispatch pointer. Use it to call QueryInterface(IID_IPIEHTMLDocument, (void**)&pHTMLDocument) to retrieve the HTML viewer control's IPIEHTMLDocument interface.
相关视频
相关阅读 vs.netIDE报"以下文件中的行尾不一致,要将行尾标准化吗?"的解决ie6下面asp.net mvc3 部署应用程序.NET 3.5 安装错误的四个原因及解决方法支持无限制历史记录的Paint.NET 3.5.8 Final,你用了吗?.NET Framework环境安装错误怎么办?JVM和.NET CLR和哪个会被彻底击败在asp.net mvc中实现右键菜单和简单的分页教程VB.NET如何得到调用当前过程的方法名称和类名称
热门文章 没有查询到任何记录。
最新文章
什么是.NET中的TDD?ASP.NET AJAX入门简介
WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用
人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题
查看所有0条评论>>