VC++ 中巧妙實現超鏈接控制

 我們用MFC開發應用程序時,通常在窗口中放置大量的控件,通過觸發這些控件的事件來完成我們的控制。但並不是每個控件都提供所有的事件消息,例如我們在對話窗口中加入一個靜態文本控件(CState類),這時在ClassWizard中此控件沒有任何消息,也就無法完成所要求的控制。VC++中爲我們提供了一個API函數GetWindowRect(),此函數可以獲得窗口中所有控件的位置,這樣我們就可以在窗口的消息中利用位置判斷來實現事件控制。

  基於以上原理,可以輕鬆的實現超鏈接控制和動態提示以及窗口區域事件捕獲等功能。以超鏈接控制爲例,通常我們在對話框中加入電子郵件或主頁的超鏈接,超鏈接一般要求獲得焦點後鼠標變形,並且能響應OnClick事件,下面簡單介紹其實現原理。

  1.首先創建基於對話框的Sample工程。

  2.在Sample工程的資源文件中引入光標文件將其ID設爲"IDC—HAND",在SAMPLE—DIALOG的對話框中加入靜態文本控件將其ID設爲"IDC—LINK",Caption設爲"http://www.ciw.com.cn"

  3.在對話類的頭文件(SampleDlg.h)添加數據成員

   protected:

   RECT m—pRectLink; //用於保存靜態文本框的屏幕座標

  4.獲取控件座標

   在對話類成員函數OnInitDialog()中添加以下代碼(sampleDlg.cpp):

   GetDlgItem(IDC—LINK)-〉GetWindowRect(&m—pRectLink);

  //將靜態文本的屏幕座標存放在m—pRectLink中

   ScreenToClient(&m—pRectLink);

  //將屏幕座標轉換爲客戶座標

   5.變換鼠標形狀

   利用ClassWizard爲對話框添加OnMouseMove()消息,在函數OnMouseMove(UINT nFlags, CPoint point)中,point參數可獲得對應於窗口左上角的鼠標座標,通過判斷算法就可實現事件的控制。

  //下面設置鼠標在靜態文本區時,將光標設成小手狀

   if (point.x〉m—pRectLink.left&&point.x〈m—pRectLink.right&&point.y〉m—pRectLink.top&&point.y〈m—pRectLink.bottom)

   //此處添加判斷座標算法

   { HCURSOR hCursor;

   hCursor=AfxGetApp()-〉LoadCursor(IDC—HAND);

   //將鼠標設爲小手狀

   SetCursor(hCursor); }

   //下面語句用來設置默認(箭頭)鼠標形狀,一般鼠標移開後窗口會自動恢復默認鼠標形狀,可酌情添加

   if (...)//此處酌情添加鼠標不在靜態文本區的座標算法,本例可不加

   { hCURSOR hCursor;

   hCursor=AfxGetApp()-〉LoadStandardCursor(IDC—IBEAM);

  //將光標設爲默認值(箭頭)

   SetCursor(hCursor); }

  6.添加鼠標單擊事件

   利用ClassWizard爲對話框添加OnLButtonDown()消息,參數與OnMouseMove()一樣。

   if (point.x〉m—pRectLink.left&&point.x〈m—pRectLink.right&&point.y〉m—pRectLink.top&&point.y〈m—pRectLink.bottom)

   //此處添加判斷座標算法

   { if (nFlags==MK—LBUTTON)//鼠標左鍵按下

   { //爲改善鼠標效果,此處加入以上變換鼠標形狀的代碼

   ShellExecute(0, NULL, "http://www.ciw.com.cn", NULL,NULL, SW—NORMAL);

   //也可以添加電子郵件的鏈接

   } }

  在開發應用程序的過程中,靈活運用控件的位置可以實現一些特殊的消息控制。在以上例子中將靜態文本稍加修飾,比如獲得焦點時增加亮度或下畫線效果會更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章