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

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

編輯:關於C語言

在這個方法中 ,我們首先創建了一個 GraphicsPath 對象,這個對象表示一個路徑,所謂路徑就是若干個 直線和曲線的組合。我們可以向路徑對象中添加各種直線段或曲線。在這裡我們調用它的 AddEllipse 方法向路徑中添加了一個橢圓曲線,這是一個封閉曲線。AddEllipse 方法的參 數表示一個橢圓的外切矩形。在這裡外切矩形就是控件的客戶區域。

所謂客戶區就是 控件內部可以自定義繪制圖形的區域。某些Windows控件具有邊框,比如文本輸入框,邊框上 面是不能繪制圖形的,因此若控件有邊框則它的客戶區大小不等於控件大小,此時需要使用 控件的 ClientSize 屬性獲得控件客戶區大小,當然若控件沒有邊框,則它的客戶區大小等 於控件大小,為了編程方便,建議大家以後繪制控件內容時都使用 ClIEntSize 屬性獲得可 繪制區域的大小。

創建了一個橢圓路徑後,我們可以使用繪制橢圓形了,首先是創建 一個 SolidBrush 對象,然後調用圖形繪制對象的FillPath方法來填充路徑。然後創建 Pen 對象,使用Graphics的DrawPath方法來繪制路徑。這裡要注意順序不能搞反。若先繪制邊框 然後填充橢圓,則會導致後面的操作覆蓋掉前面的操作成果。

圖形編程有一個很明顯 的特點,那就是各種圖形操作是要注意順序的,因為後一個圖形操作很容易覆蓋掉前面的圖 形操作結果,這造成了圖形開發中調試困難,很多時候需要對代碼進行非常仔細的靜態檢查 。

很多圖形編程對象,例如SolidBrush,Pen,GraphisPath等等,都實現了 System.IDisposable接口,其內部都使用了非托管資源,在不使用的時候要銷毀這些對象, 因此在代碼中使用了 using 語法結構來處理這些對象。

這裡我們使用鼠標懸停標志 變量 bolMouseHoverFlag ,使得鼠標懸停和不懸停時按鈕的背景色和邊框色有所不同。

繪制出橢圓區域後,我們就可以繪制按鈕文本。首先創建一個 StringFormat 對象, 這個對象用於控制繪制文本時的樣式。我們設置文本格式為水平居中對齊方式,垂直居中對 齊樣式,而且還不能換行,只能顯示單行文本。

我們根據文本顏色創建一個 SolidBrush對象,然後繪制文本,然後調用圖形繪制對象的 DrawString 方法來繪制字符串 。這個函數第一個參數是文本內容,第二個是字體,第三個就是繪制文本使用的畫刷對象, 第四個就是包含文本顯示區域的矩形區域,第5個就是文本格式控制。

完成了OnPaint 方法後,我們就獲得了一個具有橢圓形外觀的用戶控件,我們編譯程序,然後進入一個窗體 設計器,在工具箱的“我的用戶控件”欄目,上面可以看到已經有一個 EllipseButton 項目,按下這個項目就可以在窗體上放置一個橢圓形的按鈕了,你可以在屬 性列表中設置它的文本。然後運行程序,可以看到運行的窗體上顯示了一個橢圓形的按鈕, 但這個按鈕就像圖片一樣,毫無生機,我們還需要改進這個控件來實現動態效果。

響 應事件,實現動態效果

打開這個按鈕控件的代碼,開始添加代碼來實現鼠標懸停的動 態效果。首先編寫一個 CheckMouseHover 函數,該函數用於判斷鼠標是否懸停到按鈕上面, 由於按鈕是橢圓形,控件上有部分內容不屬於按鈕區域,因此即使鼠標在控件上面,也要判 斷鼠標光標是否在橢圓形區域中。CheckMouseHover函數代碼如下

/// <summary>
/// 檢測釋放發生鼠標懸停狀態發生改變,若發生改變則重寫繪制控 件
/// </summary>
/// <param name="x">測試點X坐標 </param>
/// <param name="y">測試點Y坐標 </param>
/// <returns>測試點是否在橢圓區域中</returns>
private bool CheckMouseHover( int x , int y )
{
  using( System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath())
  {
    path.AddEllipse( 0 , 0 , this.ClientSize.Width -1 , this.ClIEntSize.Height -1 );
    bool flag = path.IsVisible( x , y );
    if( flag != bolMouseHoverFlag )
    {
      bolMouseHoverFlag = flag ;
      // 控件 整體無效,准備重新繪制,但不立即繪制用戶界面.
      this.Invalidate ();
      //this.Refresh(); // 強制立即繪制用戶界面.
    }
    return flag ;
  }
}

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