利用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亚洲乱熟无码|
好男人网官网在线观看|