• 用C#开发类似QQ输入法的不规则窗体的程序详解+代码打包分享 狼人:


    QQ窗体是圆角的,Kugoo窗体也是圆角的,QQ的输入法皮肤窗体是不规则的。。。等N多日常使用的程序主窗体都不是四四方方的,其实都是调用2D绘画函数按指定的路径画出来的,那么这一课我给入门级学者讲解的是关于C#实现这一功能。

    先来看看实现效果(左边的字体也是窗体的一部分):

    其实其核心就是围绕Drawing2D来实现的,用GraphicsPath的方法GetPixel取左上角的一点的颜色作为我们透明色,然后横坚循环遍历每一个像素坐标点,如果发现其为透明色,则不加入绘制窗体区域。

    下面看怎么实现的,看图:

    关键点:

    第一、设置当前窗体为无边框的(this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;);

    第二、排除捕获对错误线程的调用,CheckForIllegalCrossThreadCalls = false;

    第三、计算位图中不透明部分的边界,代码如下:

    #region //计算位图中不透明部分的边界
    private GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
    {
    //创建 GraphicsPath
    GraphicsPath graphicsPath = new GraphicsPath();
    //使用左上角的一点的颜色作为我们透明色
    Color colorTransparent = bitmap.GetPixel(0, 0);

    // 偏历所有行(Y方向)
    for (int row = 0; row < bitmap.Height; row++)
    {
    //第一个找到点的X
    int colOpaquePixel = 0;
    //偏历所有列(X方向)
    for (int col = 0; col < bitmap.Width; col++)
    {
    //如果是不需要透明处理的点则标记,然后继续偏历
    if (bitmap.GetPixel(col, row) != colorTransparent)
    {
    //记录当前
    colOpaquePixel = col;
    ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
    while (col < bitmap.Width)
    if (bitmap.GetPixel(col++, row) == colorTransparent)
    break;
    //将不透明点加到graphicspath
    graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, col - colOpaquePixel - 1, 1));
    }
    }
    }
    return graphicsPath;
    }
    #endregion

     第四、设置当前窗体的绘制路径区域

    this.Region = new Region(this.CalculateControlGraphicsPath(this.BackgroundImage as Bitmap));
     

    代码下载地址:WindowsFormsApplication1.rar

    声明:此博有部分内容为转载,版权归原作者所有~
  • 相关阅读:
    文件过滤驱动隐藏目标文件
    POJ 3345 Bribing FIPA(树形DP)
    POJ 1018 Communication System(分组背包DP)
    无用的,ring0暴力枚举进程模块
    HDOJ 3496 Watch The Movie(基本二维背包)
    栈回溯法的一个例子
    代码这样写奇丑无比...编码前期要做好规划工作啊
    多核发dpc安全inline hook
    纵我不往,知识不来学习Java第一周心得
    对“TD信息树”的使用体验
  • 原文地址:https://www.cnblogs.com/waw/p/2236480.html
Copyright © 2020-2023  润新知