zoukankan      html  css  js  c++  java
  • winform壁纸工具:为图片添加当月的日历并设为壁纸 .

    这几天用winform做了一个设置壁纸的小工具, 为图片添加当月的日历并设为壁纸,可以手动设置壁纸,也可以定时设置壁纸,最主要的特点是在图片上生成当前月的日历信息。

    工具和桌面设置壁纸后的效果如下:

    在图片上画日历的类代码Calendar.cs如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    using System.IO;
    using System.Drawing.Imaging;
    
    namespace SetWallpaper
    {
        public class Calendar
        {
            /// <summary>
            /// 计算星期几: 星期日至星期六的值为0-6
            /// </summary>
            public static int GetWeeksOfDate(int year, int month, int day)
            {
                DateTime dt = new DateTime(year, month, day);
                DayOfWeek d = dt.DayOfWeek;
                return Convert.ToInt32(d);
            }     
            /// <summary>
            /// 获取指定年月的天数
            /// </summary>
            public static int GetDaysOfMonth(int year, int month)
            {
                DateTime dtCur = new DateTime(year, month, 1);
                int days = dtCur.AddMonths(1).AddDays(-1).Day;
                return days;
            }
            /// <summary>
            /// 获取在图片上生成日历的图片
            /// </summary>
            public static Bitmap GetCalendarPic(Image img)
            {
                Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb);
                bmp.SetResolution(72, 72);
                using (Graphics g = Graphics.FromImage(bmp))
                {                
                    g.DrawImage(img, 0, 0, img.Width, img.Height);                              
                  
                    DateTime dtNow = DateTime.Now;
                    int year = dtNow.Year;
                    int month = dtNow.Month;
                    int day = dtNow.Day;
                    int day1st = Calendar.GetWeeksOfDate(year, month, 1); //第一天星期几
                    int days = Calendar.GetDaysOfMonth(year, month); //获取想要输出月份的天数
    
                    int startX = img.Width / 2; //开始的X轴位置
                    int startY = img.Height / 4; //开始的Y轴位置
                    int posLen = 50; //每次移动的位置长度
                    int x = startX + day1st * posLen; //1号的开始X轴位置
                    int y = startY + posLen * 2;//1号的开始Y轴位置
    
                    Calendar.DrawStr(g, dtNow.ToString("yyyy年MM月dd日"), startX, startY);
                    string[] weeks = { "日", "一", "二", "三", "四", "五", "六" };
                    for (int i = 0; i < weeks.Length; i++)
                        Calendar.DrawStr(g, weeks[i], startX + posLen * i, startY + posLen);
    
                    for (int j = 1; j <= days; j++)
                    {
                        if (j == day)//如果是今天,设置背景色
                            Calendar.DrawStrToday(g, j.ToString().PadLeft(2, ' '), x, y);
                        else
                            Calendar.DrawStr(g, j.ToString().PadLeft(2, ' '), x, y);
                        //星期六结束到星期日时换行,X轴回到初始位置,Y轴增加
                        if ((day1st + j) % 7 == 0)
                        {
                            x = startX;
                            y = y + posLen;
                        }
                        else
                            x = x + posLen;
                    }
                     
                   return bmp;
                }
            }
            /// <summary>
            /// 绘制字符串
            /// </summary>
            public static void DrawStr(Graphics g, string s, float x, float y)
            {
                Font font = new Font("宋体", 25, FontStyle.Bold);
                PointF pointF = new PointF(x, y);
                g.DrawString(s, font, new SolidBrush(Color.Yellow), pointF);
            }
            /// <summary>
            /// 绘制有背景颜色的字符串
            /// </summary>
            public static void DrawStrToday(Graphics g, string s, float x, float y)
            {
                Font font = new Font("宋体", 25, FontStyle.Bold);
                PointF pointF = new PointF(x, y);
                SizeF sizeF = g.MeasureString(s, font);
                g.FillRectangle(Brushes.White, new RectangleF(pointF, sizeF));
                g.DrawString(s, font, Brushes.Black, pointF);
            } 
        }
    }
    

     主窗体设置壁纸等的代码FrmMain.cs如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Drawing.Drawing2D;
    using Microsoft.Win32;
    using System.Collections;
    using System.Runtime.InteropServices;
    using System.Xml;
    using System.Drawing.Imaging;
    
    namespace SetWallpaper
    {   
        public partial class FrmMain : Form
        {
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
    
            int screenWidth = Screen.PrimaryScreen.Bounds.Width;
            int screenHeight = Screen.PrimaryScreen.Bounds.Height;          
            FileInfo[] picFiles;
            public FrmMain()
            {
                InitializeComponent();           
            }
            private void FrmMain_Load(object sender, EventArgs e)
            {
                List<DictionaryEntry> list = new List<DictionaryEntry>(){
                    new DictionaryEntry(1, "居中显示"),
                    new DictionaryEntry(2, "平铺显示"),
                    new DictionaryEntry(3, "拉伸显示")
                };
                cbWallpaperStyle.DisplayMember = "Value";
                cbWallpaperStyle.ValueMember = "Key";
                cbWallpaperStyle.DataSource = list;
    
                txtPicDir.Text = XmlNodeInnerText("");
                timer1.Tick += new EventHandler(timer_Tick);
                Text = string.Format("设置桌面壁纸(当前电脑分辨率{0}×{1})", screenWidth, screenHeight);
            }     
            /// <summary>
            /// 浏览单个图片
            /// </summary>
            private void btnBrowse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog openFileDialog = new OpenFileDialog())
                {
                    openFileDialog.Filter = "Images (*.BMP;*.JPG)|*.BMP;*.JPG;";
                    openFileDialog.AddExtension = true;
                    openFileDialog.RestoreDirectory = true;
                    if (openFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        Bitmap img = (Bitmap)Bitmap.FromFile(openFileDialog.FileName);
                        pictureBox1.Image = img;
                        string msg = (img.Width != screenWidth || img.Height != screenHeight) ? ",建议选择和桌面分辨率一致图片" : "";
                        lblStatus.Text = string.Format("当前图片分辨率{0}×{1}{2}", img.Width, img.Height, msg);
                    }
                }
            }
    
            /// <summary>
            /// 手动设置壁纸
            /// </summary>
            private void btnSet_Click(object sender, EventArgs e)
            {
                if (pictureBox1.Image == null)
                {
                    MessageBox.Show("请先选择一张图片。");
                    return;
                }
                Image img = pictureBox1.Image;           
                SetWallpaper(img);
            }
    
            private void SetWallpaper(Image img)
            {
                Bitmap bmp = Calendar.GetCalendarPic(img);
                string filename = Application.StartupPath + "/wallpaper.bmp";
                bmp.Save(filename, ImageFormat.Bmp);
    
                string tileWallpaper = "0";
                string wallpaperStyle = "0";
                string selVal = cbWallpaperStyle.SelectedValue.ToString();
                if (selVal == "1")
                    tileWallpaper = "1";
                else if (selVal == "2")
                    wallpaperStyle = "2";
    
                //写到注册表,避免系统重启后失效
                RegistryKey regKey = Registry.CurrentUser;
                regKey = regKey.CreateSubKey("Control Panel\\Desktop");
                //显示方式,居中:0 0, 平铺: 1 0, 拉伸: 0 2
                regKey.SetValue("TileWallpaper", tileWallpaper);
                regKey.SetValue("WallpaperStyle", wallpaperStyle);
                regKey.SetValue("Wallpaper", filename);
                regKey.Close();
                SystemParametersInfo(20, 1, filename, 1);
            }
    
           /// <summary>
           /// 浏览文件夹
           /// </summary>
            private void btnBrowseDir_Click(object sender, EventArgs e)
            {
                string defaultfilePath = XmlNodeInnerText("");
                using (FolderBrowserDialog dialog = new FolderBrowserDialog())
                {
                    if (defaultfilePath != "")  
                        dialog.SelectedPath = defaultfilePath;                
    
                    if (dialog.ShowDialog() == DialogResult.OK)                              
                        XmlNodeInnerText(dialog.SelectedPath);
                  
                    txtPicDir.Text = dialog.SelectedPath;
                }
            }       
            /// <summary>
            /// 获取或设置配置文件中的选择目录
            /// </summary>
            /// <param name="text"></param>
            /// <returns></returns>
            public string XmlNodeInnerText(string text)
            {
                string filename = Application.StartupPath + "/config.xml";
                XmlDocument doc = new XmlDocument();
                if (!File.Exists(filename))
                {
                    XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                    doc.AppendChild(dec);               
                    XmlElement elem = doc.CreateElement("WallpaperPath");
                    elem.InnerText = text;
                    doc.AppendChild(elem);
                    doc.Save(filename);
                }
                else
                {
                    doc.Load(filename);
                    XmlNode node = doc.SelectSingleNode("//WallpaperPath");
                    if (node != null)
                    {
                        if (string.IsNullOrEmpty(text))
                            return node.InnerText;
                        else
                        {
                            node.InnerText = text;
                            doc.Save(filename);
                        }
                    }
                }
                return text;
            }    
            /// <summary>
            /// 定时自动设置壁纸
            /// </summary>
            private void btnAutoSet_Click(object sender, EventArgs e)
            {
                string path = txtPicDir.Text;
                if (!Directory.Exists(path))
                {
                    MessageBox.Show("选择的文件夹不存在");
                    return;
                }
                DirectoryInfo dirInfo = new DirectoryInfo(path);
                picFiles = dirInfo.GetFiles("*.jpg");
                if (picFiles.Length == 0)
                {
                    MessageBox.Show("选择的文件夹里面没有图片");
                    return;
                }
                if (btnAutoSet.Text == "开始")
                {
                    timer1.Start();
                    btnAutoSet.Text = "停止";
                    lblStatus.Text = string.Format("定时自动换壁纸中...");            
                }
                else
                {
                    timer1.Stop();
                    btnAutoSet.Text = "开始";
                    lblStatus.Text = "";
                }
            }
            /// <summary>
            /// 定时随机设置壁纸
            /// </summary>
            private void timer_Tick(object sender, EventArgs e)
            {            
                timer1.Interval = 1000 * 60 * (int)numericUpDown1.Value;
                FileInfo[] files = picFiles;
                if (files.Length > 0)
                {
                    Random random = new Random();
                    int r = random.Next(1, files.Length);
    
                    Bitmap img = (Bitmap)Bitmap.FromFile(files[r].FullName);               
                    pictureBox1.Image = img;
    
                    SetWallpaper(img);
                }
            }
            /// <summary>
            /// 双击托盘图标显示窗体
            /// </summary>
            private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
            {
                ShowForm();
            }
            /// <summary>  
            /// 隐藏窗体,并显示托盘图标  
            /// </summary>  
            private void HideForm()
            {
                this.Visible = false;
                this.WindowState = FormWindowState.Minimized;
                notifyIcon1.Visible = true;
            }
    
            /// <summary>  
            /// 显示窗体  
            /// </summary>  
            private void ShowForm()
            {
                this.Visible = true;
                this.WindowState = FormWindowState.Normal;
                notifyIcon1.Visible = false;
            }
            private void ToolStripMenuItemShow_Click(object sender, EventArgs e)
            {
                ShowForm();
            }
            /// <summary>  
            /// 退出  
            /// </summary>  
            private void toolStripMenuItemExit_MouseDown(object sender, MouseEventArgs e)
            {
                Application.Exit();
            }
            /// <summary>  
            /// 最小化时隐藏窗体,并显示托盘图标 
            /// </summary>  
            private void FrmMain_SizeChanged(object sender, EventArgs e)
            {
                if (this.WindowState == FormWindowState.Minimized)
                {
                    HideForm();
                }
            }         
        }
    }
    

     完整的项目代码下载:

    http://download.csdn.net/detail/gdjlc/5096674

  • 相关阅读:
    洛谷 P1200.[USACO1.1]你的飞碟在这儿Your Ride Is Here
    洛谷 P1055.ISBN号码
    洛谷 P1567.统计天数
    洛谷 P2141.珠心算测验
    洛谷 P1428.小鱼比可爱
    洛谷 P1427.小鱼的数字游戏
    洛谷 P1047.校门外的树
    洛谷 P1046.陶陶摘苹果
    洛谷 P1980.计数问题
    洛谷 P1424.小鱼的航程(改进版)
  • 原文地址:https://www.cnblogs.com/gdjlc/p/2938012.html
Copyright © 2011-2022 走看看