亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

利用C#實現標注式消息提示窗口

2019-11-18 16:55:34
字體:
來源:轉載
供稿:網友

為了更加友好的將提示信息呈現給用戶,我們必須對標準的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, arcDia, 270, 90);
  gPath.AddLine(bottomRightPoint.X, rectY1, bottomRightPoint.X, rectY2);
  gPath.AddArc(rectX2 - arcRadius, rectY2 - arcRadius, arcDia, arcDia, 0, 90);
  gPath.AddLine(rectX2, bottomRightPoint.Y, rectX1, bottomRightPoint.Y);
 }
 else
 {
  gPath.AddLine(rectX1, topLeftPoint.Y, rectX2, topLeftPoint.Y);
  gPath.AddArc(rectX2 - arcRadius, topLeftPoint.Y, arcDia, arcDia, 270, 90);
  gPath.AddLine(bottomRightPoint.X, rectY1, bottomRightPoint.X, rectY2);
  gPath.AddArc(rectX2 - arcRadius, rectY2 - arcRadius, arcDia, arcDia, 0, 90);
  gPath.AddLine(rectX2, bottomRightPoint.Y, ArrowPoints[0].X, bottomRightPoint.Y);
  gPath.AddLines(ArrowPoints);
  gPath.AddLine(ArrowPoints[2].X, bottomRightPoint.Y, rectX1, bottomRightPoint.Y);
  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.CloseFigure();
 this.Region = new Region(this.gPath);
}

  ShowInfoWindow函數用來將提示窗口顯示出來,該函數需要將提示窗口附著的控件和需要顯示的文本傳遞過來。然后,AnchorPointFromControl根據控件的位置返回提示窗口的箭頭應該顯示的坐標,代碼如下:

public static Point AnchorPointFromControl(Control anchorControl)
{
 if (anchorControl == null)
 throw new ArgumentException();
 Point controlLocation = anchorControl.Location;
 System.Drawing.Size controlSize = anchorControl.Size;

 if (anchorControl.Parent != null)
  controlLocation = anchorControl.Parent.PointToScreen(controlLocation);
 return controlLocation + new Size(controlSize.Width / 2, controlSize.Height / 2);
}

  PointToScreen表明將工作區點的位置映射成屏幕坐標統一進行計算。上述代碼最后以行說明提示窗口的箭頭顯示在附著控件的中點。
  將提示窗口的背景顏色設置成Info

  我們發現這樣的外觀有點別扭,沒錯!因為提示窗口缺少黑色邊框!所以,還需要在窗體的OnPaint事件中添加代碼,如下:

protected override void OnPaint(PaintEventArgs e)
{
 Pen p = new Pen(Color.Black , 2);
 e.Graphics.DrawPath(p, gPath);
 base.OnPaint(e);
}
 
 
二、程序實現

  啟動Visual Studio 2005,新建Visual C#的Windows應用程序項目,并取名為ShowInfoWindow,添加4個Button組件、1個Label組件、1個textBox組件和3個Panel組件,其中3個Button用來顯示標注式消息提示窗口并分別附著在三個組件之上,代碼如下:

……
private InfoWindow iw;
……
private void button1_Click(object sender, EventArgs e)
{
 iw = new InfoWindow();
 iw.ShowInfoWindow(label1, "關于標簽組件的提示說明。");
}
private void button3_Click(object sender, EventArgs e)
{
 iw = new InfoWindow();
 iw.ShowInfoWindow(button2, "關于按鈕組件的提示說明。");
}

private void button4_Click(object sender, EventArgs e)
{
 iw = new InfoWindow();
 iw.ShowInfoWindow(textBox1, "關于文本框組件的提示說明。");
}

  然后,我們在項目中添加新Windows窗體,取名為InfoWindow,將InfoWindow的BackColor設為Info,FormBorderStyle設為None,將ShowIcon和ShowInTaskbar都設為False,在窗體上放置1個Label組件和1個Button組件,分別用來顯示消息內容和關閉提示窗口的操作。具體實現請參見文章附帶的源碼,這里不再詳述。

  三、總結

  本文演示了標注式消息提示窗口的創建和顯示,利用GraphicsPath對象、Region對象以及屏幕坐標映射等方法有效的實現了提示窗口的外觀和樣式,提示窗口可以自動附著在相應控件之上,并且根據附著控件在屏幕上的位置自動調整提示窗口箭頭的位置和大小。演示程序在Windows XP SP2以及.Net 框架 2.0環境下運行通過。
http://www.49028c.com/tanghuawei/archive/2006/10/16/530513.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产网站| 久久久久国产精品免费| 国内精品一区二区三区四区| 亚洲精品网站在线播放gif| 久久久精品国产| 亚洲精品在线91| 国产精品视频免费在线观看| 欧美成人免费一级人片100| 欧美激情精品久久久久久大尺度| 伊人久久男人天堂| 国产精品视频1区| 57pao成人国产永久免费| 亚洲肉体裸体xxxx137| 精品久久久免费| 国产极品jizzhd欧美| 亚洲精品美女久久久久| 色先锋资源久久综合5566| 国产精品美女久久久久av超清| 中文字幕亚洲无线码在线一区| 九九热精品视频| 亚洲第一网中文字幕| 国产色视频一区| 韩国精品久久久999| 精品国产美女在线| 国产在线观看精品| 国产精品444| 欧美性猛交xxxx黑人猛交| 国内精品久久久久久久久| 久久久久久18| 欧美日韩激情美女| 久久国产色av| 久久久国产精彩视频美女艺术照福利| 亚洲欧洲av一区二区| 亚洲精品资源美女情侣酒店| 国内偷自视频区视频综合| 日韩av最新在线观看| 国产精品香蕉国产| 日韩在线免费av| 7m精品福利视频导航| 成人精品久久一区二区三区| 亚洲情综合五月天| 国产在线播放91| 按摩亚洲人久久| 日韩国产高清视频在线| 久久精品国产91精品亚洲| 久久国产精品久久国产精品| 日韩美女视频免费在线观看| 久久亚洲精品成人| 亚洲精品一二区| 日韩有码在线观看| 中文字幕久久亚洲| 欧美电影电视剧在线观看| 日韩av中文字幕在线| 一本大道香蕉久在线播放29| 亚洲精品久久久久| 亚洲欧美日韩另类| 国产午夜精品全部视频播放| 欧美另类xxx| www亚洲精品| 日本午夜精品理论片a级appf发布| 亚洲人成网在线播放| 中文字幕精品网| 97视频在线观看免费| 亚洲精品欧美日韩| 热久久这里只有| 97久久国产精品| 97久久精品人人澡人人爽缅北| 欧美亚州一区二区三区| 亚洲欧洲午夜一线一品| 国产精品美女在线观看| 日韩成人av一区| 在线视频欧美日韩| 国产精品直播网红| 中文字幕亚洲二区| 欧美性精品220| 日韩国产精品一区| 福利二区91精品bt7086| 亚洲精品有码在线| 久久国产视频网站| 美日韩精品免费观看视频| 国产精品亚洲网站| 97视频免费在线看| 国产精品视频资源| 欧美老女人性生活| 91精品国产成人www| 日韩精品小视频| 日韩成人中文电影| 性亚洲最疯狂xxxx高清| 久久91超碰青草是什么| 欧美性猛交xxxx乱大交蜜桃| 97精品欧美一区二区三区| 亚洲最新av在线网站| 中文字幕视频在线免费欧美日韩综合在线看| 在线观看免费高清视频97| 91精品视频免费| 夜色77av精品影院| 欧美大片欧美激情性色a∨久久| 亚洲第一色中文字幕| 亚洲人成亚洲人成在线观看| 成人免费视频在线观看超级碰| 久久久黄色av| 日本高清不卡的在线| 欧美亚洲免费电影| 精品久久久久久久久久久| 91精品视频在线播放| 国产一区二区免费| 欧美午夜宅男影院在线观看| 久久久久久久激情视频| 色哟哟入口国产精品| 久久青草福利网站| 91久久久久久| 国产欧美一区二区三区在线| 亚洲精品www| 中文字幕视频在线免费欧美日韩综合在线看| 91社区国产高清| 亚洲在线视频观看| 亚洲第一网中文字幕| 欧美电影免费播放| 在线观看精品自拍私拍| 亚洲自拍偷拍福利| 久久综合国产精品台湾中文娱乐网| 亚洲精品不卡在线| 午夜精品理论片| 日韩在线免费视频| 色99之美女主播在线视频| 久久欧美在线电影| 亚洲一级黄色av| 成人久久久久久| 亚洲成av人片在线观看香蕉| 久久久99免费视频| 欧美极品少妇xxxxⅹ免费视频| 国产欧美va欧美va香蕉在线| 久久精品夜夜夜夜夜久久| 亚洲毛片在线观看.| 欧美日韩国产一中文字不卡| 久久九九全国免费精品观看| 97视频在线观看成人| 日韩精品免费在线视频观看| 色综合久久88色综合天天看泰| 欧美日韩亚洲激情| 亚洲国内精品在线| 中国人与牲禽动交精品| 日韩资源在线观看| 日韩av中文字幕在线| 中文字幕精品久久久久| 久久久久久亚洲精品| 欧美性猛交xxxx富婆弯腰| 一区二区欧美亚洲| 欧美激情精品久久久久久黑人| www.欧美视频| 欧美日韩在线视频观看| 国产午夜精品一区二区三区| 亚洲免费人成在线视频观看| 97超级碰碰碰久久久| 国产精品久久久久7777婷婷| 亚洲自拍高清视频网站| 成人在线中文字幕| 日韩成人中文电影| 久久久99久久精品女同性| 麻豆国产精品va在线观看不卡| 国内精品久久影院| 国产欧美亚洲精品| 美日韩精品免费观看视频| 精品国偷自产在线视频99|