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

2016-01-29 12:07 5 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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


原著:Paul DiLascia
翻译:NorthTibet

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

下载源代码: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移到其它控件相对),它们都能照样工作。
  眼

来源:https://www.tulaoshi.com/n/20160129/1484723.html

延伸阅读
11.1 Help文件的建立 Help文件是Micosoft Windows3.0以上的版本提供的超文本帮助文件。利用这种超文本,用户可非常方便地使用帮助文件系统。帮助文件是以主题为主线进行编写的,一个主题可以跳转至相关的主题,也可按关键字进行主题查询。帮助文件与软件开发工具相结合,可实现应用程序的'上下文敏感',而且帮助系统自动装入...
BOOL CSomeApp::InitInstance() { Enable3dControls(); LoadStdProfileSettings(); AddDocTemplate(...) ...... ShowWindow(...); m_pMainWnd-DragAcceptFiles(); EnableShellOpen(); RegisterShellFileTypes(TRUE); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo)) ...
标签: Delphi
笔者在前一段的工作中,需要开发一套简单的网络数据传输程序。由于平时常用Delphi做点开发,故此次也不例外。Delphi 7中带有两套TCP Socket组件:Indy Socket组件(IdTCPClient和IdTCPServer)和Delphi原生的TCP Socket组件(ClientSocket和ServerSocket)。但是,Borland已宣称ClientSocket和ServerSocket组件即将被废弃,建议用相应的I...
标签: Web开发
Web服务应用程序存在的一个常见问题是,真正的后端软件不支持XML(或者至少不支持你Web服务所使用的标准化的XML)。要解决这个问题,很多架构都实施了一个翻译阶段,用来解释收到的XML,并将它转换成为后端系统能够识别的更加适当的格式。虽然将XML翻译成不同的格式有很多种方式法,但是可扩展样式表语言(eXtensibleStylesheet Language,...
使用微软正在推行的.NET技术和C#语言可以快速建立Web应用程序,其安全性和可升级性都大大胜过普通的ASP应用程序。在这篇文章里,我们将使用.NET和C#一步一步的建立一个应用程序。 系统需求: Internet Explorer 5.5 Windows 2000 Professional, Server 或 Advanced Server ASP+/Microsoft .NET (预览版可以在 http://msdn.microso...

经验教程

901

收藏

44
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部