一种全新的软件界面设计方法(续)

类别:VC语言 点击:0 评论:0 推荐:

一种全新的软件界面设计方法(续)

点击下载文章所附代码

撰文:Aweay

你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。

前段时间,笔者写了一篇关于使用Web页面设计见面用于Win32应用程序的文章,详细内容请点击这里参考此文。但很可惜很多网友发mail说不知道我写的是什么,不就是设计网页嘛,早都有的技术为什么说是“全新的”的呢?还有网友提出如何实现像网际飞音那样的自定义协议,比如安装网际飞音后中浏览器会处理dnmp://cmd/15这样的地址,结果打开了网际飞音程序,问我能不能也用我文中提到的方法实现?还有什么WebCatcher://只类的东西,我也忘记了。为此作者决定再一篇续,补充讨论一些东西,并试图解决上面网友的问题,如果您还没有看过上面文章,建议您先参考一下,其实我认为已经写的非常清楚了,如果您已经是老读者了,那我们继续。

首先我在文中讨论到的界面设计技术在国内的软件中很少见到,在知名软件中,我也就见过Windows,Visual Studio.Net IDE工具,Norton Anti Virus,Borland C# Builder使用,可是说也是非常少的,虽然鲜有软件使用这样的技术设计界面,但我个人认为这是软件界面设计的一个方向,或者说趋势吧,所以就试图去研究这样的技术,并介绍给大家,如果您还不明白,我用CyberArticle(因为有人问如何实现这个软件的某些部分,我就安装了,发现挺好用)来说明一下:

这个界面是用于显示用户收藏的技术文章,在传统的界面设计中,我们可以使用ListView32来实现,但这里使用的InternetExplorer_Server,也就是Web页面,如果点击"移动到..."按钮,就会弹出一个对话框(本地代码),如图:

我们知道在网页里是不能直接调用本地代码的,当然您可以使用COM,但是在我那篇文章里已非常清楚的说明了为什么不使用COM,所以这里也不是使用COM,那么他怎么做到的呢?有什么好处呢?呵呵,这些问题在上面文章里也有介绍,详细内容请点击这里参考此文。

这就是这种技术,结合网页表现界面的简洁,又作到了界面使用的灵活性,还是这个这个软件,如果我们打开一个收藏的文章,网页的连接地址是类似于CyberArticle://15这样的地址,而不是我们常见的URL地址(这就是别人的问题,问我为什么?如何实现),点击这个地址后软件会打开一个本地的临时网页,里面是用户收藏的文章,是不是很神气呢?如果仔细考虑这个软件的实现,我想必须这样做才好。

其实如果仔细看我的上篇文章,关于这个问题是可以解决的,在上篇文章中我们提到IDocHostUIHandler有很多虚拟的方法,重载实现后可以定制浏览器的功能,在IDocHostUIHandler中有一个虚拟方法:TranslateUrl,这个方法可以给程序员一次自己解析URL地址的机会,这是我们判断需要解析的URL是否是我们需要的CyberArticle://格式,如果是,取得后面信息做相应处理,如果不是原样返回给IE。代码如下:

virtual HRESULT STDMETHODCALLTYPE TranslateUrl( /* [in] */ DWORD dwTranslate, /* [in] */ OLECHAR __RPC_FAR *pchURLIn, /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut) { String addr=WideString(pchURLIn); if(addr.SubString(1,5)=="siney") { WCHAR* home=L"http://siney.nease.net/index.htm"; WCHAR* soft=L"http://siney.nease.net/myproj/MySoft.htm"; WCHAR* article=L"http://siney.nease.net/dialy.htm"; WCHAR* nd=0; String section=addr.SubString(9,10); if(section=="home/") nd=home; else if (section=="soft/") nd=soft; else if (section=="article/") nd=article; else return S_FALSE; size_t ln=wcslen(nd); *ppchURLOut = (LPOLESTR)CoTaskMemAlloc((ln + 1) * sizeof(WCHAR)); wcscpy(*ppchURLOut, nd); return S_OK; } else return S_FALSE; }

上面的代码中,我们处理以siney://前导的协议URL地址类型,其他忽略,为此我们设计这样的html代码:

<html>
<head>
<SCRIPT language="JScript">
function MyFunc()
{
external.HelloWorld();
}
</SCRIPT>
</head>
<body>
<input type="Button" value="Show hello world" onClick="MyFunc();" /> 点击按钮后下面EditBox(本地的)会显示文字
<br>
<a href="siney://home">我的主页 siney://home</a><br>
<a href="siney://soft">我的软件 siney://soft</a><br>
<a href="siney://article">我的文章 siney://article</a><br>
</body>
</html>

这样当浏览器里访问siney://home这样地址的时候,就会来到我们主页地址,同样上面的html代码仅限于我们自己的定制浏览器可以访问,如果使用IE打开这个html文件,则访问是失败的,类似于上篇文章一样。

到这里我以为已经解决网友的问题,但我发现网际飞音的dnmp协议类型地址在任何基于IE的浏览器都能被准确执行(甚至FireFox也可以,Opera不行),比如:dnmp://45765adsf465a4sdf568a6d7s可能打开网际飞音播放一首mp3,说明它使用了不同的方法,经过一番研究,我发现它使用了更简单的方法,就是在注册表里注册一个键值,类似于注册一个文件扩展名一样,不同的是多了一个URL Protocol,如图:

这样,只要注册了相应协议类型的程序,IE就会在必要时把地址作为参数传递给注册的程序处理,这点同样类似于注册文件类型。

到这里,我们已经解决了全部问题,如果大家还有什么问题可以多看看MSDN和一些COM相关的东西,如果有什么想法或者心得也欢迎您与我取得联系:[email protected]

本文地址:http://com.8s8s.com/it/it613.htm