C# winform制作不规则窗体(代码)


本文摘自PHP中文网,作者PHPzhong,侵删。

以前想制作不规则窗体,大多使用API函数来实现,在C#中,也可以不使用API函数照样能制作出漂亮的不规则窗体,下面就介绍一下相关方法,下面是代码。

1

2

3

4

5

6

7

8

9

private void Form1_Load(object sender, EventArgs e)

{

    //重新绘制窗口样式

    string fileName = @"C:\Users\admin\Desktop\Yuan1.png";

    Bitmap mybitmap = new Bitmap(fileName);

    CreateControlRegion(this, mybitmap);

    this.BackColor = Color.White;// 此处为添加部分 

    this.TransparencyKey = Color.White;//此处为添加部分 

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

/// <summary>

/// 重新绘制窗口样式

/// </summary>

/// <param name="control"></param>

/// <param name="bitmap"></param>

public static void CreateControlRegion(Control control, Bitmap bitmap)

{

    // Return if control and bitmap are null 

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

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

        return;

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

    control.Width = bitmap.Width;

    control.Height = bitmap.Height;

    // Check if we are dealing with Form here  

    //当控件是form时 

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

    {

        // Cast to a Form object 

        //强制转换为FORM 

        Form form = (Form)control;

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

        form.Width = control.Width;

        form.Height = control.Height;

        //没有边界 

        form.FormBorderStyle = FormBorderStyle.None;

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

        form.BackgroundImage = bitmap;

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

        GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);

        //应用新的区域 

        form.Region = new Region(graphicsPath);

 

        // 以下为自己添加的语句,不添加此两句会出现问题 

        form.Width = bitmap.Width;

        form.Height = bitmap.Height;

    }

 

    //当控件是button时 

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

    {

        //强制转换为 button 

        Button button = (Button)control;

        //不显示button text 

        button.Text = "";

 

        //改变 cursor的style 

        button.Cursor = Cursors.Hand;

 

        //设置button的背景图片 

        button.BackgroundImage = bitmap;

 

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

        GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);

        // Apply new region  

        //应用新的区域 

        button.Region = new Region(graphicsPath);

        button.Width = bitmap.Width;

        button.Height = bitmap.Height;

        button.FlatStyle = FlatStyle.Popup;//此处为添加部分 

    }

}

private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)

{

    //创建 GraphicsPath 

    GraphicsPath graphicsPath = new GraphicsPath();

 

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

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

 

    //第一个找到点的X 

    int colOpaquePixel = 0;

 

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

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

    {

        // Reset value  

        //重设 

        colOpaquePixel = 0;

 

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

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

        {

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

            if (bitmap.GetPixel(col, row) != colorTransparent)

            {

 

                colOpaquePixel = col;

 

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

                int colNext = col;

 

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

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

                {

                    Color gpi = bitmap.GetPixel(colNext, row);

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

                    {

 

                        break;

                    }

                }

                //将不透明点加到graphics path 

 

                {

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

                }

                col = colNext;

            }

        }

    }

    return graphicsPath;

}

完美!

以上就是C# winform制作不规则窗体(代码)的详细内容!

相关阅读 >>

具体介绍使用C#访问access数据库时,提示找不到可安装的isam(图)

C# 带滚动条的label控件的示例代码详解

简单介绍C#中list<t>对象的深度拷贝问题

C#如何使用 oledbconnection 连接读取excel?(代码实例)

C# sleep延时方法

C#和.net是一个东西吗?C#与.net的区别与联系

C#语言为什么用的人很少

关于C#中string类型的方法分享

C#获取鼠标在listview右键点击单元格的内容方法详解

C#如何将datatable中的列名复制到另一个datatable

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...