利用C#實現標注式消息提示窗口
2006/12/13 9:15:48

    我們大家在Windows XP下使用U盤、閃存等移動存儲設備,當插上或拔下這些設備時任務欄區域都會顯示一個淡黃色背景,且具有標注樣式的提示窗口彈出來,這樣的提示即友善又美觀
 
    近一段時間由于項目需要一直專注于UI方面的編程,為了更加友好的將提示信息呈現給用戶,我們必須對標準的Windows消息提示窗口進行處理。我們大家在Windows XP下使用U盤、閃存等移動存儲設備,當插上或拔下這些設備時任務欄區域都會顯示一個淡黃色背景,且具有標注樣式的提示窗口彈出來,這樣的提示即友善又美觀,那么這到底是怎么實現的呢?其實道理并不復雜,該標注式提示窗口本身就是一個不規則窗體,當顯示時它會將標注窗口的箭頭指向不同控件。如下圖:

   
一般情況下的標注式提示窗口

屏幕邊緣的標注式提示窗口
  一、技術要點

  就像本文開頭所說的"標注式消息提示窗口"其實就是一個具有不規則外形的窗體,但卻具備了更加復雜的屬性和行為。標注的箭頭會根據不同控件指向不同的位置,當需要標注的控件過于接近屏幕的邊緣時,標注窗口還會自動調整顯示位置以及箭頭的長短和大小。

  我們為新創建的窗體取名為InfoWindow。在類的頭部定義intArc和intArrowHeight兩個私有變量,可以適當調整它們的值來微調提示窗口的位置和箭頭的大小與位置。

  提示窗口的箭頭位置無非具有左上、右上、左下和右下四個可能性,我們為此定義了枚舉類型的變量ArrowLocation,根據提示窗口位于屏幕的不同位置,GetArrowLocation可以計算提示窗口的位置并且返回適當的ArrowLocation,定義如下:

    ……
public enum ArrowLocation
{
 TopLeft,
 TopRight,
 BottomLeft,
 BottomRight
}
  SetInfoWindowRegion函數非常重要,它在Form.Load事件即裝載和顯示提示窗體時被調用,當計算出新的提示窗口的位置和箭頭顯示位置后,調用SetBounds將更新后的位置和大小應用到提示窗口,gPath是GraphicsPath類型的私有變量,它表示標注式窗口的不規則圖形路徑,該圖行路徑也是根據提示窗口的位置和箭頭顯示的位置來創建,gPath.AddArc方法用來繪制提示窗口四個邊角的弧度部分,和AddLine方法一起描繪出提示窗口包括箭頭的輪廓,一切就緒后我們就用這個gPath對象傳遞給Region對象,當將這個Region對象賦給Form窗體的Region屬性后,窗體就具備了標注式提示窗口樣式的不規則外形了,部分代碼如下:

    private void SetInfoWindowRegion()
{
 if (!this.IsHandleCreated)
  return;
 System.Drawing.Size windowSize = this.Size;
 Point[] ArrowPoints = new Point[3];
 Point topLeftPoint = Point.Empty;
 Point bottomRightPoint = (Point)windowSize;
 switch (this.GetArrowLocation)
 {
  case ArrowLocation.TopLeft:
   ……
  case ArrowLocation.TopRight:
   ……
  case ArrowLocation.BottomLeft:
   ……
  case ArrowLocation.BottomRight:
   ……
 }
 ……
 ……
 if ((this.GetArrowLocation == ArrowLocation.TopLeft) ||
(this.GetArrowLocation == ArrowLocation.TopRight))
 {
  gPath.AddArc(topLeftPoint.X, rectY2 - arcRadius, arcDia, arcDia, 90, 90);
  gPath.AddLine(topLeftPoint.X, rectY2, topLeftPoint.X, rectY1);
  gPath.AddArc(topLeftPoint.X, topLeftPoint.Y, arcDia, arcDia, 180, 90);
  gPath.AddLine(rectX1, topLeftPoint.Y, ArrowPoints[0].X, topLeftPoint.Y);
  gPath.AddLines(ArrowPoints);
  gPath.AddLine(ArrowPoints[2].X, topLeftPoint.Y, rectX2, topLeftPoint.Y);
  gPath.AddArc(rectX2 - arcRadius, topLeftPoint.Y, arcDia,

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 国产一级性生活| 在线观看国产成人AV片| 乱人伦xxxx国语对白| 波多野结衣伦理电影| 午夜小视频在线| 被合租粗糙室友到哭| 国产福利影院在线观看| 99久久精品午夜一区二区| 尤物在线视频观看| 丰满老熟妇好大bbbbb| 日韩国产欧美在线观看| 亚洲国产成人久久综合一区77| 狠狠做深爱婷婷久久综合一区| 午夜精品久久久久久中宇| 被cao的合不拢腿的皇后| 国产日韩欧美综合一区| 3p视频在线观看| 在线观看麻豆精品国产不卡| 一本到在线观看视频| 成年女人免费播放影院| 久久大香香蕉国产| 最新浮力影院地址第一页| 午夜美女福利视频| 亚洲老妈激情一区二区三区| 亚洲国产精品一区二区成人片国内| 亚洲aⅴ男人的天堂在线观看| 久久久久亚洲精品中文字幕| 一区二区三区内射美女毛片| 深夜福利视频网站| 欧美日韩高清在线| 人人妻人人澡人人爽人人精品| 紫黑粗硬狂喷浓精| 国产一级淫片免费播放| 高清欧美一区二区免费影视| 国产福利在线导航| 2015天堂网| 国产美女久久精品香蕉69| 97精品伊人久久大香线蕉| 大佬和我的365天2在线观看| jlzzjlzz亚洲乱熟无码| 好男人网官网在线观看|