首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

利用mshtml得到了某个IHTMLElement的实例,但是怎么获得这个实例的width呢

2012-02-07 
利用mshtml得到了某个IHTMLElement的实例,但是如何获得这个实例的width呢? 这个是不是非常麻烦的一件事儿?

利用mshtml得到了某个IHTMLElement的实例,但是如何获得这个实例的width呢?

这个是不是非常麻烦的一件事儿?  
似乎没有直接的接口获得这个属性。
(比如一个div)

寻求高手相助。

[解决办法]
http://helenblog.wordpress.com/2007/05/01/


将该IHTMLDOMNode转去IHTMLElement, 再用IHTMLElement::getAttribute 取Attribute的值
[解决办法]
微软的MSHTML使用起来好似有些问题.

比如: 对于以下的HTML content:
<HTML> <HEAD> <TITLE> my%20test%20on%20wed </TITLE>
<META http-equiv=Content-Type content=”text/html; charset=utf-8″>
<META content=”MSHTML 6.00.6000.16414″ name=GENERATOR>
<STYLE type=text/css> BODY {
FONT-SIZE: 12pt; BACKGROUND: #ffffff left top; COLOR: black; FONT-FAMILY: Times New Roman
}
</STYLE>
</HEAD>
<BODY>
<DIV> <STRONG> This is a test a </STRONG> </DIV>
<DIV align=center> <STRONG> Center </STRONG> </DIV>
<DIV align=left> <STRONG> Left </STRONG> </DIV>
<DIV align=right> <STRONG> right </STRONG> </DIV>
<DIV align=left> <STRONG> <FONT style=”FONT-SIZE: 19pt”> Big
Font </FONT> </STRONG> </DIV>
<OL>
<LI>
<DIV align=left> <STRONG> list1 </STRONG> </DIV>
<LI>
<DIV align=left> <STRONG> list2 </STRONG> </DIV>
<LI>
<DIV align=left> <U> <EM> <FONT color=#0000ff> list3 </FONT> </EM> </U> </DIV> </LI> </OL>
<UL>
<LI> bullet
<LI> bullet2
<LI>
<TABLE borderColor=#d2d2d2 cellPadding=3 border=1>
<TBODY>
<TR>
<TD>
<DIV> cell1 </DIV> </TD>
<TD>
<DIV> cell2 </DIV> </TD> </TR>
<TR>
<TD>
<DIV> cell3 </DIV> </TD>
<TD>
<DIV> cell4 </DIV> </TD> </TR> </TBODY> </TABLE> </LI> </UL>
<DIV> <IMG class=test id=44 style=”WIDTH: 324px; HEIGHT: 296px” height=480 alt=” "
hspace=0 src=”water lilies.jpg” width=527 align=baseline border=0> </DIV>
<DIV> </DIV>
<DIV> </DIV> </BODY> </HTML>

Helen想得到 <BODY> tag 里面的东东. 由于wordpress.com 会把每个HTML Element tag之后的换行回车解释做 <BR/> tag, 所以Helen想把HTML element tag 之后的换行回车去掉, 而似乎MSHTML并没有提供这样的功能.

而当Helen遍历HTML 的DOM Tree时, 发现MS HTML 对Attribute 的处理也很有问题.

以上面的HTML Content 为例, Helen想得到其中的 <IMG> tag 的所有Attrbute. 如果先用IHTMLDOMNode::get_attributes得到IDispatch 指针再转去IHTMLAttributeCollection借口; 用IHTMLAttributeCollection::item 得到单个Attrbute 的IDispatch 指针再转去IHTMLDOMAttribute或者IHTMLDOMAttribute2借口 , 对于STYLE Attribute, 当IHTMLDOMAttribute::get_specified返回VARIANT_TRUE时, MSHTML IHTMLDOMAttribute2::::get_value 或者IHTMLDOMAttribute::get_nodeValue居然返回null. 当然MSDN 就有说明:

The attributes collection does not expose the style object. Use the cssText property of the object’s style property to retrieve the persistent representation of the cascading styles associated with an object.

可是既然这样, 就不要把SYTLE列入Attribute 里面嘛.

然后就是此时对于WIDTH和HEIGHT的处理, IHTMLDOMAttribute2::get_value都返回0值. 这样一来, 放到BLOG上的图片无法正确显示. 就算将IHTMLDOMNode转去IHTMLImgElement, 企图用IHTMLImgElement::get_width和IHTMLImgElement::get_height取WIDTH和HEIGHT值, 都只能得到0值.

还有, 当Helen将该IHTMLDOMNode转去IHTMLElement, 再用IHTMLElement::getAttribute 取Attribute的值时, Width 和Height的值到是终于对头了, 但是就有新的情况: IHTMLElement::getAttribute不但不能得到正确的STYLE Attribute值, 连CLASS Attribute的值也取不到, 真是激气. 非要用IHTMLElement::get_className才行. 同样的还有ID的值也和CLASS类似, 要用IHTMLElement::get_id才可以. 估计还会有其他的几个Attribute也有相近的情况.



而STYLE Attribute, 则一定要IHTMLElement::get_style的到IHTMLStyle 接口, 再用IHTMLStyle::get_cssText才能的到正确的结果,

用MS HTML做一件这么简单的事情, 居然要这么山长水远, 微软, I 服了YOU.

热点排行