国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

利用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.56wlw.com/tanghuawei/archive/2006/10/16/530513.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产亚洲精品拍拍拍拍拍| 国产免费av网站| 国产在线视频精品视频免费看| av网址在线看| 免费不卡中文字幕视频| 国产尤物视频| 中文av字幕| 狠狠操天天操夜夜操| 国产精品人人爱一区二区白浆| 在线视频观看国产| 老司机精品视频一区二区| 国产一级网站视频在线| 伊人久久青青草| 国产美女视频网站| 亚洲欧美国产另类首页| 天堂亚洲精品| xxx国产精品| 中文字幕在线视频不卡| 依依成人在线| 国产小视频在线观看| 四虎a级欧美在线观看| 国产农村一级特黄α**毛片| 99中文字幕一区| 国产特级毛片| 激情六月丁香| 日本三级在线视频| 在线免费看黄av| 国产高清一区二区三区视频| 国产69精品久久app免费版| 一本久久精品| av大片在线播放| 国产精品区一区二| 天天操天天射天天插| 蜜桃视频网站在线| 麻豆精品免费视频入口| 欧美性猛交xxxx免费看蜜桃| 亚洲成人福利| 在线观看电影av| 91欧洲在线视精品在亚洲| 国产福利小视频在线观看| 国产激情三区| 国产区视频在线播放| 中文字幕在线免费视频| 天堂资源在线中文| 91福利在线免费| 国产一区久久精品| 国产精品视频白浆合集| 国产精品自产拍在线观看2019| 亚洲电影视频在线| 日本在线观看| 老师我好爽再深一点的视频| jizz一区二区三区| 激情综合丁香| 国产色在线观看| 精品黄色免费中文电影在线播放| 在线中文字幕观看| 四虎精品视频| 高潮白浆视频| 国产激情在线观看| 亚洲成人福利| 天堂资源在线中文| 国产超碰在线观看| 亚洲成人国产综合| 免费看ww视频网站入口| 国产天堂视频| 日本高清中文字幕| 国产精品日日爱| а√最新版在线天堂| 天堂资源在线中文| a视频在线播放| 国产网站在线播放| 色悠久久久久综合网小说| 五月天丁香在线| 日本在线观看网站| 国产福利片在线| 福利在线视频导航| 在线色视频网| 国产一级网站视频在线| 99色在线观看| 国产视频xxx| 国产卡1卡2卡三卡在线| 欧洲亚洲精品视频| 精品美女视频在线观看免费软件| 久久五月精品| www.狠狠色.com| 精品51国产黑色丝袜高跟鞋| 尤物网在线观看| 久热中文字幕| av在线二区| 在线观看国产福利视频| 91麻豆精品国产91久久| 国产一二三视频| 好吊日视频在线观看| 中文在线视频观看| 91蜜桃在线视频| 国产精品爱久久久久久久小说| 尤物网在线观看| 国产图片综合| 国产精品久久人| 国产jizz| 亚洲视频在线观看不卡| 午夜影院免费| 麻豆福利在线观看| 国产女王在线**视频| 国产www在线观看| 99久久免费精品国产免费| 伊人影院在线观看| 一本久久精品| 一区免费观看| 欧美日韩在线中文字幕| www在线免费观看视频| 久久这里精品| 国产特级毛片| 尤物视频在线观看视频| 日本黄在线观看| 国产男女无套在线播放| 国产极品视频| 亚洲色婷婷综合开心网| 免费一区二区在线观看| 国产在线黄色片| 国产情侣高潮对白| 在线观看午夜av| 丁香花在线电影| 国产精品视频二区三区| 在线观看免费高清完整| 丁香婷婷激情| 亚洲天堂视频在线观看免费| 男女午夜视频在线观看| 国产区在线观看| 欧美高清视频| 国产二区在线播放| 牛牛在线精品视频| 国产系列在线观看| 青青久草在线| 精品麻豆一区二区三区| 国产精品探花在线| 午夜性爽视频男人的天堂| 国产另类图片| 91精品专区| 日本中文字幕视频| 免费在线看v| 中文乱码字幕高清在线观看| 国产卡一卡二卡三| 四虎成人免费| 99高清免费国产自产拍| 国产无遮挡又黄又爽免费网站| 热99re久久精品精品免费| 国产二区视频| 国产区视频在线| 最新国产在线精品91尤物| 久热免费视频| 久久99亚洲网美利坚合众国| 四虎成人免费观看在线网址| 国产精品探花在线| 国产69久久| 国产九九在线| 国产中文第一页| 九七电影韩国女主播在线观看| 欧美日韩在线精品成人综合网| 亚洲永久免费网站| 在线观看wwww| www在线播放| www.狠狠操| 黄网站在线观看高清免费| 狠狠操五月天| 国产麻豆麻豆| 国产精品白浆流出视频| 国产成人精品实拍在线| 国产精品久久麻豆| 97在线超碰| 日本黄色免费网址| 九九视频精品在线| 中文字幕人成高视频| 国产精品冒白浆免费视频| 精品国产一区二区三区不卡在线 | 国产蜜臀在线| 国产日韩精品在线看| 国产高清免费视频| av在线播放av| 国产理论在线观看| 97最新国自产拍视频在线完整在线看 | 国产麻豆麻豆| 国产日本视频| www在线视频| 99视频免费| 国产porny蝌蚪视频| wwww在线观看免费视频| 九九热在线视频| 国产95在线|亚洲| 另类高清dbsm日本tvav| 国产精品黄页网站在线播放免费| 99reav| 国产在线更新| 四虎成年永久免费网站| 国产精品视频一区二区免费不卡| 亚洲色婷婷综合开心网| 国产小视频在线观看| 美女av在线播放| av麻豆国产| 国产对白在线|