用键盘操作静态链接打开应用程序中的URLs

草原牧人70

草原牧人70

2016-01-29 12:07

用键盘操作静态链接打开应用程序中的URLs,用键盘操作静态链接打开应用程序中的URLs

C++ At Work 专栏...
用键盘操作静态链接打开应用程序中的URLs


原著:Paul DiLascia
翻译:NorthTibet

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码:CATWork0503.exe (184KB)
原文出处:Making Static Links Keyboard-Capable, Launching URLs from Your App

这几年我一直在公司的商业程序中使用你的 CStaticLink 类,在 1998 年 MSJ 三月刊里,你示范了如何给超链接添加手型光标,但现在我想以另一种方式使用这个类。在微软的 IE 浏览器中,可以用Tab键遍历Web页面中的任何超链接,然后按回车键以单击该链接。我能否让 CStaticLink 做同样的事情?我是不是有点得寸进尺?
Tom Gifford 如果你要我借给你一千美元,那才是得寸进尺呢——但用键盘操作 CStaticLink 则是合理要求。我可以想象得到,对于一个习惯用键盘的人来说尤其如此。我讨厌伸手去用无聊的鼠标(这就是为什么我用 Emacs 的原因),并且我讨厌部提供足够键盘支持的应用程序。所以你的要求一点都不过分;相反,你应该获得用户界面最优奖。
  对于新读者来说,CStaticLink 是我早在1997年12月写的一个类,这个类可以让你在窗体或关于对话框中添加Web链接。CStaticLink 类基于 MFC 的静态控件类 CStatic。根据读者对这个类功能特性的要求,我陆陆续续对它进行了改进和增强,看来这次又有事情做了。CStaticLink 用鼠标单击来启动 URL,还有一些其它的友好功能,比如用标准的蓝/紫色绘制未访问/访问链接文本显示颜色(你可以定制),文本下划线以及当鼠标移到链接上时显示相应的鼠标光标。CStaticLink 甚至能在资源文件查找与控件有相同ID号的串资源,从而从自动加载 URL。如果你还没用过 CStaticLink,那就用用试试吧。
  现在 Tom 明智地要我做一个可用键盘操作的静态链接。有两件最基本的事情要做,一是要让链接具备Tab式样,二是必须处理链接的键盘导航。我们就从建立 Tab 式样开始吧。
  当用户按对话框中的 Tab 键时,Windows 将输入焦点移到Tab顺序的下一个控件。焦点之停留在具备Tab 属性的控件上——即具备 WS_TABSTOP 式样的控件。默认情况下,对话框编辑器不会创建具备 WS_TABSTOP 式样的静态控件。因为静态(Static)控件静态的,它不做任何事情,它们压根就不会变化,也不与用户交互。
  然而,现在 CStaticLink 被赋予了鼠标单击能力,所以要求 Tab 属性也是合情合理的。用户界面的一个最重要的原则(请注意了,伙计)是:无论用户能用鼠标做什么,那么也必须能用键盘做。这样不仅仅对象我这种惯于使用键盘的人友好,而且也方便习惯使用鼠标的人,以防鼠标线断掉。也许你的用户使用无线鼠标,但鼠标电池在凌晨1:00点耗尽,报告要在当日早晨一上班提交——当你知道用键盘也能完成工作,那岂不是一件很棒的事情吗。
  所以第一件事情是让静态链接具备 Tab Stop 属性,在资源文件中添加 WS_TABSTOP 即可,或者在 Visual Studio .NET 中将控件的 Tabstop 属性置为 True(如图一所示)。


Figure 1 设置静态链接的 Tab Stop 属性

  一旦你设置了控件的 Tab Stop 属性,对话框运行时,用户便能用 Tab 键操作它。现在唯一的问题是当用户这样做的时候,什么也不发生。没有任何可视迹象表示控件具有了输入焦点。如果你用Tab操作一个编辑框控件,它会显示一个一闪一闪的光标。如果是列表框,Windows 会在第一项周围画一个点状矩形虚线,如果是按钮,那么 Windows 会在按钮内画一个焦点矩形。但 CStaticLink 什么都不做。
  所以我必须添加一些可视化提示以告诉用户“你在这里”。对于超链接来说就是锚点(<A 元素),IE 浏览器是在链接文本周围画焦点矩形。那为什么不如法炮制呢?尤其是 Windows 有一个很方便的函数叫做(说来也奇怪)DrawFocusRect,这个函数有着极好的使用 XOR 光栅操作特性,所以第二次调用它便擦除焦点矩形。当你的控件获得焦点时绘制焦点矩形;失去焦点时擦除之。关键代码如下:

void CStaticLink::OnSetFocus(CWnd* /*pOldWnd*/){DrawFocusRect();}void CStaticLink::OnKillFocus(CWnd* /*pNewWnd*/){DrawFocusRect();}    
  是不是很简单?即便是用户因为切换到其它程序而失去焦点(与用Tab移到其它控件相对),它们都能照样工作。
  眼
展开更多 50%)
分享

猜你喜欢

用键盘操作静态链接打开应用程序中的URLs

C语言教程 C语言函数
用键盘操作静态链接打开应用程序中的URLs

VC用键盘操作静态链接打开应用程序中的URLs

编程语言 网络编程
VC用键盘操作静态链接打开应用程序中的URLs

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在一个程序中打开其它应用程序

编程语言 网络编程
在一个程序中打开其它应用程序

体验Vista操作系统应用程序

windows 操作系统
体验Vista操作系统应用程序

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

MAC OS X中如何改变默认打开文件应用程序

电脑入门
MAC OS X中如何改变默认打开文件应用程序

用BCB编制OpenGL应用程序

编程语言 网络编程
用BCB编制OpenGL应用程序

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何使用JSP+MySQL创建留言本(一)

如何使用JSP+MySQL创建留言本(一)

利用iText在JSP中生成PDF报表

利用iText在JSP中生成PDF报表
下拉加载更多内容 ↓