CODE

GitHub 源码

1、女友说很丑的一个软件

说个最近的事情,女友公司过年了要搞活动,需要个抽奖的环节,当时就问我能不能给做一个,正好我也没啥事儿,就在周末的时候用C#做了一个,虽然派上用场了,不过被说丑也是挺无语的……

2、丑也要说

虽然心里想的这个软件很简单,但是真正编程也花了5个小时,主要在怎样做好看上犹豫的太久,后来索性全都做成可以配置的了,也真是绝了……

3、程序主界面

先把软件界面放出来:

主界面
主界面

抽中某某某的样子
抽中某某某的样子

使用帮助
使用帮助

根本也没用什么随机之类的算法,直接用的是Timer控件,噼里啪啦一顿循环,按 “空格” 或者 “回车” 都可以 “开始/暂停”,简单暴力。抽中后,可以把抽中的人删除掉,双击照片,或者直接按键盘 “DEL”(随意大小写)就可以删掉这个人了,下次就不会重复出现了……当然,可以重置所有的列表,跟着使用帮助就可以了。

4、配置文件

界面控件位置(控件在运行期间是可以移动的,自动保存移动位置)
界面控件位置(控件在运行期间是可以移动的,自动保存移动位置)

软件配置
软件配置

配置文件的详细解释:

[Strings]
FormName=这真的是一个抽奖软件 '窗口名'
Title=这真的是一个抽奖软件 '标题文本'
[Color]
MottoText=#ffffff '段落文本的颜色'
TitleText=#ffffff '标题的颜色'
[FontStyle]
Motto=华文楷体 '段落文本的字体'
Title=华文楷体 '标题的字体'
[FontSize]
Title=20 '标题的字号'
Motto=12 '段落文本的字号'
[FormSize]
MainFormWidth=1000 '窗口宽'
MainFormHeight=600 '窗口高'
[Interval]
Rolling=50 '图片滚动间隔:毫秒'

5、主界面上的图片也是可以修改的

主界面图片源
主界面图片源

目录Images文件夹中的图片,是主界面显示的:背景、Logo以及空闲状态的照片,可以修改成自己想要的样子。

6、至于如何把照片放到程序里

想要滚动的照片,放到Box文件夹中,如果有文本要显示,取和图片相同文件名,后缀为.txt就可以了:

要滚动的照片放在这里
要滚动的照片放在这里

对于一些大图片来说,动辄就是几M,也并不能让用户来压缩成小图片,所以我就自行处理成缩略图了,以免在程序中加载图片太大造成的卡顿,当然对于这个文件夹的操作 “什么都不用管,什么都不用管,什么都不用管”:

图片的缩略图处理
图片的缩略图处理

7、关于绘图过程的双缓冲

在拖动控件的时候或者绘图的过程中,会有些闪动的情况发生,需要在窗体构造的时候开启双缓冲即可:

            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.  
            SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲 

8、关于缩略图的生成

之前忘了是从哪里收集的一个图片处理的工具类:

    public class ImageHelper
    {
        /// <summary> 
        /// 生成缩略图 
        /// </summary> 
        /// <param name="originalImagePath">源图路径(物理路径)</param> 
        /// <param name="thumbnailPath">缩略图路径(物理路径)</param> 
        /// <param name="width">缩略图宽度</param> 
        /// <param name="height">缩略图高度</param> 
        /// <param name="mode">生成缩略图的方式</param>     
        public static bool MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            Image originalImage = Image.FromFile(originalImagePath);
            int towidth = width;
            int toheight = height;
            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;
            switch (mode)
            {
                case "HW"://指定高宽缩放(可能变形)                 
                    break;
                case "W"://指定宽,高按比例                     
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高,宽按比例 
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高宽裁减(不变形)                 
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }
            //新建一个bmp图片 
            Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
            //新建一个画板 
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);
            //设置高质量插值法 
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            //设置高质量,低速度呈现平滑程度 
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //清空画布并以透明背景色填充 
            g.Clear(Color.Transparent);
            //在指定位置并且按指定大小绘制原图片的指定部分 
            g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
                new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);
            try
            {
                //以jpg格式保存缩略图 
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
                return true;
            }
            catch (System.Exception e)
            {
                return false;
                //throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }
        /// <summary>
        /// 逆时针旋转图像
        /// </summary>
        /// <param name="originalImagePath">原始图像路径</param>
        /// <param name="saveImagePath">保存图像的路径</param>
        /// <param name = "angle" > 旋转角度[0, 360](前台给的) </ param >
        /// <returns></returns>
        public static bool RotateImg(string originalImagePath, string saveImagePath, int angle)
        {
            Image originalImage = Image.FromFile(originalImagePath);
            angle = angle % 360;
            //弧度转换  
            double radian = angle * Math.PI / 180.0;
            double cos = Math.Cos(radian);
            double sin = Math.Sin(radian);
            //原图的宽和高  
            int w = originalImage.Width;
            int h = originalImage.Height;
            int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
            int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
            //目标位图  
            Bitmap saveImage = new Bitmap(W, H);
            Graphics g = Graphics.FromImage(saveImage);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //计算偏移量  
            Point Offset = new Point((W - w) / 2, (H - h) / 2);
            //构造图像显示区域:让图像的中心与窗口的中心点一致  
            Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);
            Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
            g.TranslateTransform(center.X, center.Y);
            g.RotateTransform(360 - angle);
            //恢复图像在水平和垂直方向的平移  
            g.TranslateTransform(-center.X, -center.Y);
            g.DrawImage(originalImage, rect);
            //重至绘图的所有变换  
            g.ResetTransform();
            g.Save();
            //保存旋转后的图片  
            originalImage.Dispose();
            try
            {
                saveImage.Save(saveImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
                return true;
            }
            catch (Exception e) { return false; }
            finally
            {
                originalImage.Dispose();
                saveImage.Dispose();
                g.Dispose();
            }
        }
    }
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐