-
2009年03月03日
Internet Explorer高亮完美解决 - [技术]
最近正在弄一个基于IE的插件,其中有一个功能就是实现对IE中文本的高亮显示。这个问题苦恼了我这个菜鸟很长时间!其间也想过很多办法,但是由于让人听到名字就恶心的IE实在太恶心,很多办法都未能如愿实现(但是FF可以)。前两天偶然在网上遇到一位达人,在给了提示的情况下终于成功解决。在此我不敢独自分享,贴出来与大家共享。如果有什么问题可以提出来。
首先说明我要实现的功能:在浏览器上选择一段文本后通过触发某个事件(比如按下工具条上的一个按钮)将这段文本高亮显示。
以前我想的是,在文本的两端添加一对<span></span>标签来实现,但是可耻的失败鸟~经过分析,问题出在如果我选择的内容是跨样式而且是从中间截断来做就会出错。所以我改变策略,花了一天的时间写算法打算解析所有的html标记。后来我的确做到了把所有的标记和标记内的内容全部解出来了,然后我就在内容中间加高亮,如:
<H1>this is a title</H1><p>from here we start...</p>
经过处理后变为:
<H1><span style="background-color: yellow">this is a title</span></H1><p><span style="background-color: yellow">from here we start...</span></p>但是得到的结果还是不对,分析种种原因得到的结论是IE太让人恶心!
以上办法被证明是不对的之后,我想到用IHTMLTxtRange中的moveStart和moveEnd函数来做。主要原理还是和上一种一样,但是不是由我自己去解析html,而是通过移动选区的办法来分别高亮。于是我做呀做呀,分析选区文本等等,但是最后还是没有弄出来。虽然现在我不能说这个办法做不出来,但是如果要做出来应该比较难!
正当我山重水复疑无路的时候,在网络上遇到了一位达人,于是乎柳暗花明又一村~前面的废话太多,进入主题:
其实很简单,调用IHTMLTxtRange里面的execCommand函数。通过MSDN查询可以知道execCommand支持的命令,其中有一个:“BackColor”的选项。具体再查下去,很快就知道该怎么做了。
下面给一个简单的例子程序:
//你已经有一个指向浏览器的指针:IWebBrowser2 *m_pBrowser;
//我做了一个简单的字数检查功能
IDispatch *ppDisp;
IHTMLDocument2* doc2;
m_pBrowser->get_Document(&ppDisp);
ppDisp->QueryInterface(IID_IHTMLDocument2, (void**)&doc2);
IHTMLSelectionObject *selection = 0;
doc2->get_selection(&selection);
IDispatch* pDispRange = 0;
selection->createRange(&pDispRange);
IHTMLTxtRange* pTextRange = 0;
pDispRange->QueryInterface(IID_IHTMLTxtRange, (void**)&pTextRange);
CComBSTR str;
pTextRange->get_text(&str);
long length = str.Length();
setlocale(LC_ALL, "chs");
if(length>0 && length<1001) {//字数判断
VARIANT_BOOL showUI, pfRet;
pTextRange->execCommand(SysAllocString(L"Unselect"), VARIANT_BOOL(VARIANT_TRUE), _variant_t(), &pfRet);//取消选择区块
pTextRange->execCommand(SysAllocString(L"BackColor"), VARIANT_BOOL(VARIANT_FALSE), _variant_t(L"yellow"), &pfRet);//设置背景颜色
}
else {
::MessageBox(0,_T("高亮字数在1~1000字之间"),_T("友情提示"),MB_OK);
}
//释放指针等后续操作省略 -
//BHO,实际上是一个COM组件,并且实现了IObjectWithSite接口。目前正在学习…… IHTMLDocument2 *doc2; //... HRESULT STDMETHODCALLTYPE Invoke(...) { switch(dispIdMember){ case DISPID_HTMLDOCUMENTEVENTS_ONBEFOREACTIVATE:
{
BSTR BD = SysAllocString(L"www.baidu.com");
BSTR URL;
hr = doc2->get_domain(&URL);
if(SUCCEEDED(hr) && !wcscmp(URL, BD)) {
doc2->put_URL (SysAllocString (L"http://www.google.cn/"));
}
return NOERROR;
} break; //... }程序(DLL)下载:点击这里 (for IE)
-
这两天本想在Windows下做一些学习,便把系统从XP Home换到了Server 2003。本来自信满满的我认为我的系统完全可以裸奔(主要还是怕杀毒软件、防火墙等占用过多资源),便什么防范都没有做。
今天去实验室做数据结构课程设计然后用U盘把程序保存起来。但是,回来后没有考虑什么就把U盘插了上去,用了一会儿,电脑便死了!重启,未果。进入Linux找可疑文件删除,未果。最后不得不重装系统。但哪知那病毒在其他盘也有,刚重装好了系统有死了。中毒太深!!我怕了,最近暂时在Linux下避难……
P.S. 惨痛的代价告诉我:不要到处乱插, 即使到处乱插也要有防范处理,安全第一!
-
我能抽象出整个世界…
但是我不能抽象出你…
因为你在我心中是那么的具体…
所以我的世界并不完整…
我可以重载甚至覆盖这个世界里的任何一种方法…
但是我却不能重载对你的思念…
也许命中注定了,你在我的世界里永远的烙上了静态的属性…
而我不慎调用了爱你这个方法…
当我义无返顾的把自己作为参数传进这个方法时…
我才发现爱上你是一个死循环…
它不停的返回对你的思念压入我心里的堆栈…
在这无尽的黑夜中…
我的内存里已经再也装不下别人…
我不停的向系统申请空间…
但却捕获一个异常——我爱的人不爱我…
为了解决这个异常…
我愿意虚拟出最后一点内存…
把所有我能实现的方法地址压入堆栈…
并且在栈尾压入最后一个方法——将字符串”我爱你,你爱我吗?”传递给你…
如果返回值为真——我将用尽一生去爱你…
否则——我将释放掉所有系资源…… -
2008年11月06日
一个小作品,自己蛮喜欢的~ - [技术]
图形界面的H3C for Linux。采用GTK+制作图形界面,功能由H3C命令行核心和自己写的C语言(还有大猫的一段代码~~开源就是好!)实现。
源代码比较混乱,自己整理一下然后发布出来。

以下是软件的截图。




