详解C#创建不规则窗体的几种方式.docx

上传人:b****7 文档编号:11105066 上传时间:2023-02-25 格式:DOCX 页数:12 大小:19.30KB
下载 相关 举报
详解C#创建不规则窗体的几种方式.docx_第1页
第1页 / 共12页
详解C#创建不规则窗体的几种方式.docx_第2页
第2页 / 共12页
详解C#创建不规则窗体的几种方式.docx_第3页
第3页 / 共12页
详解C#创建不规则窗体的几种方式.docx_第4页
第4页 / 共12页
详解C#创建不规则窗体的几种方式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

详解C#创建不规则窗体的几种方式.docx

《详解C#创建不规则窗体的几种方式.docx》由会员分享,可在线阅读,更多相关《详解C#创建不规则窗体的几种方式.docx(12页珍藏版)》请在冰豆网上搜索。

详解C#创建不规则窗体的几种方式.docx

详解C#创建不规则窗体的几种方式

详解C#创建不规则窗体的几种方式

2010年9月14日月高风黑   浏览:

512次发表评论阅读评论

现在,C#创建不规则窗体不是一件难事,下面总结一下:

一、自定义窗体

一般为规则的图形,如圆、椭圆等。

做法:

重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:

1.System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath(); 

2.

3.shape.AddEllipse(0,0,this.Height, this.Width); 

4.

5.this.Region = new Region(shape); 

6.

即重绘窗体的规则。

二、利用背景图片实现

1.  设置窗体的背景图片,其中背景图片是24位(不包括24)以下的位图(BMP图片),并且要设置TansparencyKey的值,一般为你背景图片的背景色,即创建不规则图片时的底色,一般设为你图片中没有的颜色。

这种做法的不好的地方就是背景图片一定要16位或者更低的,而且还要确保客户端的显示。

如果监视器的颜色深度设置大于24位,则不管TransparencyKey属性是如何设置的,窗体的非透明部分都会产生显示问题。

若要避免出现这种问题,请确保“显示”控制面板中的监视器颜色深度的设置小于24位。

当开发具有这种透明功能的应用程序时,请牢记应使您的用户意识到此问题。

实现步骤如下:

1. 新建windowsapplication

2. 选择窗体,找到BackgroundImage属性,点击打开新的窗口,选择下面的导入资源文件,选择你的不规则的BMP图片

3. 找到窗体的TansparencyKey,将它设置为你背景图片的背景色(如黄色)

4. 找到窗体的FormBorderStyle,将其设置为none,即不显示标题栏

5. 运行

–[endif]–>

2.      跟背景图片一样的图形,不过是动态加载,遍历位图以实现不规则窗体。

它的原理是这样的,在Form的load事件中写方法使得窗体的描绘区域发生改变。

实现步骤如下:

1. 建立winform应用程序

2. 找到窗体的Load事件,双击进行编辑

3. 编写方法,主要的代码如下:

1.class BitmapRegion 

2.{ 

3.    public BitmapRegion() 

4.    { } 

5.

6.

7.    /// 

  

8.    /// Create and apply the region on the supplied control 

9.    /// 创建支持位图区域的控件(目前有button和form) 

10.    /// 

  

11.    /// The Control object to apply the region to控件  

12.    /// The Bitmap object to create the region from位图  

13.    public static void CreateControlRegion(Control control, Bitmap bitmap) 

14.    { 

15.        // Return if control and bitmap are null 

16.        //判断是否存在控件和位图 

17.        if (control == null || bitmap == null) 

18.            return; 

19.

20.        // Set our control’’s size to be the same as the bitmap 

21.        //设置控件大小为位图大小 

22.        control.Width = bitmap.Width; 

23.        control.Height = bitmap.Height; 

24.        // Check if we are dealing with Form here  

25.        //当控件是form时 

26.        if (control is System.Windows.Forms.Form) 

27.        { 

28.            // Cast to a Form object 

29.            //强制转换为FORM 

30.            Form form = (Form)control; 

31.            // Set our form’’s size to be a little larger that the  bitmap just  

32.            // in case the form’’s border style is not set to none in the first place  

33.            //当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点 

34.            form.Width = control.Width; 

35.            form.Height = control.Height; 

36.            // No border  

37.            //没有边界 

38.            form.FormBorderStyle = FormBorderStyle.None; 

39.            // Set bitmap as the background image  

40.            //将位图设置成窗体背景图片 

41.            form.BackgroundImage = bitmap; 

42.            // Calculate the graphics path based on the bitmap supplied  

43.            //计算位图中不透明部分的边界 

44.            GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap); 

45.            // Apply new region  

46.            //应用新的区域 

47.            form.Region = new Region(graphicsPath); 

48.        } 

49.        // Check if we are dealing with Button here  

50.        //当控件是button时 

51.        else if (control is System.Windows.Forms.Button) 

52.        { 

53.            // Cast to a button object  

54.            //强制转换为 button 

55.            Button button = (Button)control; 

56.            // Do not show button text  

57.            //不显示button text 

58.            button.Text = “”; 

59.

60.            // Change cursor to hand when over button  

61.            //改变 cursor的style 

62.            button.Cursor = Cursors.Hand; 

63.            // Set background image of button  

64.            //设置button的背景图片 

65.            button.BackgroundImage = bitmap; 

66.

67.            // Calculate the graphics path based on the bitmap supplied  

68.            //计算位图中不透明部分的边界 

69.            GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap); 

70.            // Apply new region  

71.            //应用新的区域 

72.            button.Region = new Region(graphicsPath); 

73.        } 

74.    } 

75.    /// 

  

76.    /// Calculate the graphics path that representing the figure in the bitmap  

77.    /// excluding the transparent color which is the top left pixel.  

78.    /// //计算位图中不透明部分的边界 

79.    /// 

  

80./// The Bitmap object to calculate our graphics path from  

81.    /// Calculated graphics path  

82.    private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap) 

83.    { 

84.        // Create GraphicsPath for our bitmap calculation  

85.        //创建 GraphicsPath 

86.        GraphicsPath graphicsPath = new GraphicsPath(); 

87.        // Use the top left pixel as our transparent color  

88.        //使用左上角的一点的颜色作为我们透明色 

89.        Color colorTransparent = bitmap.GetPixel(0, 0); 

90.        // This is to store the column value where an opaque pixel is first found.  

91.   // This value will determine where we start scanning for trailing opaque pixels. 

92.        //第一个找到点的X 

93.        int colOpaquePixel = 0; 

94.        // Go through all rows (Y axis)  

95.        // 偏历所有行(Y方向) 

96.        for (int row = 0; row < bitmap.Height; row++) 

97.        { 

98.            // Reset value  

99.            //重设 

100.            colOpaquePixel = 0; 

101.            // Go through all columns (X axis)  

102.            //偏历所有列(X方向) 

103.            for (int col = 0; col < bitmap.Width; col++) 

104.            { 

105.        // If this is an opaque pixel, mark it and search for anymore trailing behind  

106.                //如果是不需要透明处理的点则标记,然后继续偏历 

107.                if (bitmap.GetPixel(col, row) !

= colorTransparent) 

108.                { 

109.                    // Opaque pixel found, mark current position 

110.                    //记录当前 

111.                    colOpaquePixel = col; 

112.              // Create another variable to set the current pixel position  

113.                    //建立新变量来记录当前点 

114.                    int colNext = col; 

115.               // Starting from current found opaque pixel, search for anymore opaque pixels  

116.            // trailing behind, until a transparent   pixel is found or minimum width is reached  

117.                    ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度  

118.                for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++) 

119.                        if (bitmap.GetPixel(colNext, row) == colorTransparent) 

120.                            break; 

121.            // Form a rectangle for line of opaque   pixels found and add it to our graphics path  

122.                    //将不透明点加到graphics path 

123.            graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1)); 

124.                    // No need to scan the line of opaque pixels just found  

125.                    col = colNext; 

126.                } 

127.            } 

128.        } 

129.        // Return calculated graphics path  

130.        return graphicsPath; 

131.    } 

132.} 

4. 运行

--[endif]-->

三、调用类库实现

主要就是根据一些坐标,然后根据这些坐标绘制窗体

代码如下:

1.public Form3() 

2.

3.        { 

4.

5.            InitializeComponent(); 

6.

7.            //创建不规则窗体 

8.

9.            POINTAPI[] poin; 

10.

11.            poin = new POINTAPI[5]; 

12.

13.            poin[0].x = 90; 

14.

15.            poin[0].y = 90; 

16.

17.            poin[1].x = this.Width; 

18.

19.            poin[1].y = 0; 

20.

21.            poin[2].x = Width; 

22.

23.            poin[2].y = this.Height / 2; 

24.

25.            poin[3].x = Width / 2; 

26.

27.            poin[3].y = Height / 2; 

28.

29.            poin[4].x = 0; 

30.

31.            poin[4].y = Width; 

32.

33.            Boolean flag = true; 

34.

35.            IntPtr hRgn = CreatePolygonRgn(ref poin[0], 8, 1); 

36.

37.            SetWindowRgn(this.Handle, hRgn, ref flag); 

38.

39.            this.BackColor = Color.BurlyWood; 

40.

41.        } 

42.

43.        [StructLayout(LayoutKind.Sequential)] 

44.

45.        private struct POINTAPI 

46.

47.        { 

48.

49.            internal int x; 

50.

51.            internal int y; 

52.

53.        } 

54.

55.        [DllImport("gdi32.dll")] 

56.

57. private static extern IntPtr CreatePolygonRgn(ref POINTAPI lpPoint,int nCount,int nPolyFillMode); 

58.

59.        [DllImport("user32.dll")] 

60.

61. private static extern IntPtr SetWindowRgn(IntPtr hWnd,IntPtr hRgn, ref Boolean bRedraw); 

62.

63.        //设置窗体显示状态 

64.

65.        [DllImport("user32.dll")] 

66.

67.private static extern int SetWindowPos(IntPtr hwnd,int hWndInsertAfter,int x,int y,int cx,int cy,int wFlags); 

68.

69.        private void Start_Btn_Click(object sender, EventArgs e) 

70.

71.        {//始终显示在前面 

72.

73.            SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 1); 

74.

75.        } 

76.

77.        private void button1_Click(object sender, EventArgs e) 

78.

79.        { 

80.

81.            //最小化始终显示在前面 

82.

83.            SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 0); 

84.

85.        } 

86.

 

当然,我们也可以自定义窗体的动作,如按着某个轨迹一定,下面的代码中的BackgroundForm程序中就小试了一下,效果还不错,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1