博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
winform壁纸工具:为图片添加当月的日历并设为壁纸 .
阅读量:5864 次
发布时间:2019-06-19

本文共 11726 字,大约阅读时间需要 39 分钟。

这几天用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    {        ///         /// 计算星期几: 星期日至星期六的值为0-6        ///         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);        }             ///         /// 获取指定年月的天数        ///         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;        }        ///         /// 获取在图片上生成日历的图片        ///         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;            }        }        ///         /// 绘制字符串        ///         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);        }        ///         /// 绘制有背景颜色的字符串        ///         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
list = new List
(){ 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); } ///
/// 浏览单个图片 /// 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); } } } ///
/// 手动设置壁纸 /// 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); } ///
/// 浏览文件夹 /// 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; } } ///
/// 获取或设置配置文件中的选择目录 /// ///
///
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; } ///
/// 定时自动设置壁纸 /// 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 = ""; } } ///
/// 定时随机设置壁纸 /// 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); } } ///
/// 双击托盘图标显示窗体 /// private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { ShowForm(); } ///
/// 隐藏窗体,并显示托盘图标 /// private void HideForm() { this.Visible = false; this.WindowState = FormWindowState.Minimized; notifyIcon1.Visible = true; } ///
/// 显示窗体 /// private void ShowForm() { this.Visible = true; this.WindowState = FormWindowState.Normal; notifyIcon1.Visible = false; } private void ToolStripMenuItemShow_Click(object sender, EventArgs e) { ShowForm(); } ///
/// 退出 /// private void toolStripMenuItemExit_MouseDown(object sender, MouseEventArgs e) { Application.Exit(); } ///
/// 最小化时隐藏窗体,并显示托盘图标 /// private void FrmMain_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { HideForm(); } } }}

 完整的项目代码下载:

转载地址:http://zxunx.baihongyu.com/

你可能感兴趣的文章
仿新浪右下角视频弹窗(视频弹出广告)播放器
查看>>
Java打印九九乘法表
查看>>
Linux服务器安装redis数据库教程
查看>>
【转载】VS工具使用——代码图
查看>>
常见证书格式和转换
查看>>
我希望自己尽早知道的 7 个 JavaScript 怪癖(转载oschina)
查看>>
Netstat
查看>>
nginx中图片无法显示
查看>>
网页全屏和屏蔽按下的特殊键
查看>>
.net MVC4 来一个简单的分页代码
查看>>
PhantomJS 和Selenium模拟页面js点击
查看>>
ViewController
查看>>
(十八)属性表
查看>>
20135220谈愈敏Blog2_操作系统是如何工作的
查看>>
EOJ 3263 丽娃河的狼人传说
查看>>
《转》进入MFC讲坛的前言
查看>>
用Mindjet MindManager 15 打开文件后停止响应的解决方法
查看>>
Redis安装
查看>>
事件冒泡和事件捕获
查看>>
一、策略模式
查看>>