程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC用鍵盤操作靜態鏈接打開應用程序中的URLs

VC用鍵盤操作靜態鏈接打開應用程序中的URLs

編輯:vc教程

    這幾年我一直在公司的商業程序中使用你的 CStaticLink 類,在 1998 年 MSJ 三月刊裡,你示范了如何給超鏈接添加手型光標,但現在我想以另一種方式使用這個類。在微軟的 IE 浏覽器中,可以用Tab鍵遍歷Web頁面中的任何超鏈接,然後按回車鍵以單擊該鏈接。我能否讓 CStaticLink 做同樣的事情?我是不是有點得寸進尺?

  如果你要我借給你一千美元,那才是得寸進尺呢——但用鍵盤操作 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移到其它控件相對),它們都能照樣工作。

  眼光敏銳的讀者也許會問:參數在哪裡?前面代碼段中的 DrawFocusRect 不是實際的 DrawFocusRect。它是我寫的一個冒名頂替者,保護類型的 CStaticLink 成員函數,負責實際調用DrawFocusRect 前做一些准備工作。代碼如下:

/////////////////////////////////////////////////////////////////////////
// 獲得或丟失焦點: 繪制焦點矩形。對於位圖,用窗口矩形;文本則用實際文本矩形。
/////////////////////////////////////////////////////////////////////////
void CStaticLink::DrawFocusRect()
{
  CWnd* pParent = GetParent();
  ASSERT(pParent);
  // 計算在哪裡繪制焦點矩形,用屏幕坐標
  CRect rc;
  DWord dwStyle = GetStyle();
  if (dwStyle & (SS_BITMAP|SS_ICON|SS_ENHMETAFILE|SS_OWNERDRAW)) {
    GetWindowRect(&rc); // 圖像使用全窗口矩形
  } else {
    // 文本使用文本矩形. 不要忘了選字體!
    CClIEntDC dc(this);
    CString s;
    GetWindowText(s);
    CFont* pOldFont = dc.SelectObject(GetFont(

[1] [2] [3] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved