程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第五講 圖形開發基礎篇(5)

C#發現之旅第五講 圖形開發基礎篇(5)

編輯:關於C語言

我們創建一個路徑對象,向該 路徑添加橢圓區域,然後調用路徑的 IsVisible 函數判斷指定點是否包含在這個路徑中,若 不包含在路徑中,則該點不在橢圓形按鈕上面。若這次判斷的結果和上次判斷的結果不相同 ,則設置鼠標懸停狀態變量,然後重新繪制按鈕。

代碼中重新繪制控件具有兩種選擇 ,一個是調用控件的 Invalidate 方法,另外可調用 Refresh 方法。兩者都能重新繪制用戶 界面,但是有差別的。Invalidate方法是聲明控件用戶界面一部分或全部無效,但不會導致 立即重新繪制用戶界面,而是延遲一段時間後才真正的重新繪制用戶界面,可以看作是一種 異步操作;而Refresh則是立即重新繪制用戶界面,繪制完畢後才結束Refresh方法,是一種 同步操作。

在一般情況下Invalidate函數導致的延遲時間很短暫,人類無法察覺,此 時應當調用Invalidate方法;但在少數情況下使用Invalidate會導致明顯的可察覺的延遲, 則需要使用 Refresh 方法。Invalidate導致的延遲時間的長短和Windows底層消息驅動機制 有關,這裡看出比較精細的圖形編程和Windows底層是有關聯的,Invalidate方法是Win32API 函數InvalidateRect的.Net封裝,而Refresh方法是Win32API函數UpdateWindow的封裝。查閱 MSND中關於這兩個API函數的說明就可以理解為什麼會出現這種情況。

微軟提出.NET 框架目的是讓開發者脫離Windows底層API來進行快速軟件開發,這個目標在ASP.NET中得到的 相當好的實現,因此常規的Web數據庫開發中是不會用到Win32API的。但在圖形開發中,.NET 框架仍然很大程度的依賴Win32API函數,.NET圖形相關類庫中有很多部分是Win32API的封裝 ,這方面和VC的MFC框架有點類似,VC的MFC個人認為是傻大黑粗,功能是強大,可是使用很 不方便,而.NET框架中包含了一個充滿靈性的MFC,使用方便,功能也不弱,但仍然是基於 Win32API的。因此要很深入的學習.NET圖形編程,就要求對Win32API有所了解,這也加大 了.NET圖形編程的學習難度。當然比較簡單的.Net圖形編程是不需要了解Win32API的。

在這裡也反映出圖形開發中對用戶體驗的一些特殊要求。圖形軟件需要在計算機屏幕 上繪制圖形,而人類由於其生理特點,各種感覺器官和運動器官的速度是不同的,大腦思維 反應最遲鈍,手操作鍵盤和鼠標速度一般,而人眼的反映速度是很快的,能感知屏幕上幾十 毫秒內發生的變化,由於人眼具有很高的反應速度,因此對圖形軟件的圖形繪制代碼運行速 度有很高的要求。

重寫控件的OnMouseMove 方法,處理鼠標移動事件,該事件處理中 ,只是簡單的調用CheckMouseHover 成員,參數就使用鼠標光標位置。

控件提供了一 系列的以OnMouse開頭的方法都是處理鼠標事件的,該方法有一個類型為 MouseEventArgs 的 參數,該參數具有一些屬性,列出了發生鼠標事件時的鼠標按鍵狀態,鼠標滾輪計數和鼠標 光標在控件客戶區中的位置。

控件還重寫 OnMouseLeave 方法,處理鼠標離開控件客 戶區的事件,取消控件的鼠標懸停狀態。

觸發Click事件

客戶要求鼠標按下這 個橢圓形按鈕需要觸發一個事件,我們選擇了控件本身具有的Click事件作為按鈕點擊事件, 於是我們重寫了OnClick函數,該函數代碼為

  /// <summary>
/// 處理鼠標單擊事件
/// </summary>
/// <param name="e"></param>
protected override void OnClick (EventArgs e)
{
  //base.OnClick (e);
  Point p = System.Windows.Forms.Control.MousePosition ;
  p = base.PointToClIEnt( p );
  if( CheckMouseHover( p.X , p.Y ))
  {
     base.OnClick( e );
  }
}

由於按鈕是橢圓形的,當用戶鼠標點擊 控件時,要判斷點擊點是否在橢圓形區域中,從而要判斷是否需要觸發Click事件。因此我們 重寫 OnClick 方法來處理控件的 Click 事件。

OnClick方法的參數沒有指明鼠標光 標位置,因此我們自己計算鼠標光標在客戶區中的位置,我們使用Control類型的 MousePosition靜態屬性,獲得鼠標光標在計算機屏幕中的位置,然後使用控件的 PointToClIEnt函數將這個坐標從計算機屏幕坐標轉換為控件客戶區坐標,然後調用 CheckMouseHover函數判斷這個坐標是否在橢圓形區域中,若鼠標在橢圓形區域中,則調用 base.OnClick方法,觸發Click事件。

測試控件

重新編譯程序,新建一個窗體 ,打開窗體設計器,在工具箱的我的用戶控件頁面中可以看到有一個EllipiseButton的用戶 控件,若沒有則鼠標右擊工具箱,選擇菜單項目“添加/移除項目”。在對話框中 點擊浏覽選擇剛剛編譯生成的EXE或DLL文件,然後選中EllipiseButton即可在工具箱上新增 EllipseButton項目。選中橢圓形按鈕,設置屬性列表為顯示控件事件,雙擊添加控件的 Click事件,在該事件中顯示一個消息框,然後編譯運行即可看到一個具有動態效果的橢圓形 按鈕。如此這個按鈕控件編寫完畢。

我們設置工程類型為DLL樣式,重新編譯,得到 一個DLL文件,這個DLL文件就可以提交給客戶使用了。

小結

在本次課程中, 我們使用了C#開發了一個很簡單的具有動態效果的橢圓形按鈕的小組件,演示了C#圖形開發 的基本過程,使得大家能對C#圖形開發有一個初步的印象。從這個小程序可以看出,代碼是 不多的,但所需的基本知識是比較多的,軟件的設計,開發和WEB數據庫開發有著很大的不同 。最後我希望大家能在今天的程序的基礎上,實現一個三角型的按鈕控件。

在下一次 課程中,我們繼續使用C#開發一個稍微復雜的圖形軟件,從而更深入的進行C#圖形開發的探 索。

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