手机
当前位置:查字典教程网 >编程开发 >C#教程 >winform壁纸工具为图片添加当前月的日历信息
winform壁纸工具为图片添加当前月的日历信息
摘要:这几天用winform做了一个设置壁纸的小工具,为图片添加当月的日历并设为壁纸,可以手动设置壁纸,也可以定时设置壁纸,最主要的特点是在图片上...

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

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

winform壁纸工具为图片添加当前月的日历信息1

在图片上画日历的类代码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 PanelDesktop");

//显示方式,居中: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();

}

}

}

}

【winform壁纸工具为图片添加当前月的日历信息】相关文章:

C# 图片剪切与缩小的实例

gridview 显示图片的实例代码

winform模拟鼠标按键的具体实现

winform树形菜单无限级分类实例

C# WinForm程序完全退出的问题解决

C# WinForm中Panel实现用鼠标操作滚动条的实例方法

winform天气预报小工具(附源码下载)

c# winform取消右上角关闭按钮的实现方法

在Winform动态启动、控制台命令行的方法

winform中写app.config文件时调试情况下没有改变的原因

精品推荐
分类导航