using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
namespace CustomCalendar
...{
public partial class CustomCalendar : Form
...{
Bitmap getTheImage;
public CustomCalendar()
...{
InitializeComponent();
}
...#region
private void changebtn1_Click(object sender, EventArgs e)
...{
if (textBox1.Text.Trim() != "" && textBox2.Text.Trim() != "")
...{
btn_print.Visible = true;
getTheImage = new Bitmap(1650, 1275);
try
...{
//getTheImage = (Bitmap)Bitmap.FromFile(Application.StartupPath + "/Template.png");
Graphics g = Graphics.FromImage(getTheImage);
//提高字體清晰度 開始
g.CompositingQuality = CompositingQuality.HighQuality;
//設置高質量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//設置高質量,低速度呈現平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//文字抗鋸齒
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
//提高字體清晰度 結束
int xRectangle = 77; //畫線起始點X座標
int yRectangle = 141; //畫線起始點Y座標
int latticeWidth = 213; //格子寬度
int dayHigh = 201; //日子格子寬度
int monthHigh = 47; //月份格子高度
int yYear = 40; //年的字體起始點Y座標
int xMonthFont = xRectangle + 10; //月份字體起始點x座標
int yMonthFont = yRectangle + 7; //月份字體起始點Y座標
int xDayFont = xRectangle + 12; //月份字體起始點x座標
int yDayFont = yRectangle + monthHigh + 12; //月份字體起始點Y座標
string monthStr = "December";
Int32 myYear = Int32.Parse(textBox1.Text);
Int32 myMonth = Int32.Parse(textBox2.Text);
DateTime dtDay = new DateTime(myYear, myMonth, 01);
AmericanHoliday ldh = new AmericanHoliday(dtDay);
Int32 thenum = Int32.Parse(ldh.weekValue); //獲得本月一號是星期幾
DateTime FirstDay = dtDay.AddDays(-thenum + 1); //本月日曆第一格的日期
DateTime lastDay = Convert.ToDateTime(dtDay.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1); //獲得本月最後一天
//打印年份和月份
g.DrawString(dtDay.Year.ToString(), new Font("Arial Black", 55), Brushes.Black, 720, yYear, StringFormat.GenericDefault);
switch (dtDay.Month)
...{
case 1:
monthStr = "January";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1150, yYear, StringFormat.GenericDefault);
break;
case 2:
monthStr = "February";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1125, yYear, StringFormat.GenericDefault);
break;
case 3:
monthStr = "March";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1230, yYear, StringFormat.GenericDefault);
break;
case 4:
monthStr = "April";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1290, yYear, StringFormat.GenericDefault);
break;
case 5:
monthStr = "May";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1320, yYear, StringFormat.GenericDefault);
break;
case 6:
monthStr = "June";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1285, yYear, StringFormat.GenericDefault);
break;
case 7:
monthStr = "July";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1310, yYear, StringFormat.GenericDefault);
break;
case 8:
monthStr = "August";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1200, yYear, StringFormat.GenericDefault);
break;
case 9:
monthStr = "September";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1040, yYear, StringFormat.GenericDefault);
break;
case 10:
monthStr = "October";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1150, yYear, StringFormat.GenericDefault);
break;
case 11:
monthStr = "November";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1070, yYear, StringFormat.GenericDefault);
break;
case 12:
monthStr = "December";
g.DrawString(monthStr.ToString(), new Font("Arial Black", 55), Brushes.Black, xRectangle + 1070, yYear, StringFormat.GenericDefault);
break;
}
//打印固定的星期名稱
//填充背景顏色
g.FillRectangle(Brushes.Gray, xRectangle, yRectangle, 7 * latticeWidth, monthHigh);
Pen blackPen = new Pen(Color.Black, 5);
Point point1 = new Point(xRectangle, yRectangle + monthHigh);
Point point2 = new Point(xRectangle + 7 * latticeWidth, yRectangle + monthHigh);
g.DrawLine(blackPen, point1, point2);
g.DrawRectangle(new Pen(Color.Black, 5), xRectangle, yRectangle, 7 * latticeWidth, monthHigh + 5 * dayHigh);
g.DrawRectangle(Pens.Black, xRectangle, yRectangle, latticeWidth, monthHigh);
g.DrawString("SUNDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + 40, yMonthFont, StringFormat.GenericDefault);
g.DrawRectangle(Pens.Black, xRectangle + latticeWidth, yRectangle, latticeWidth, monthHigh);
g.DrawString("MONDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + latticeWidth + 35, yMonthFont, StringFormat.GenericDefault);
g.DrawRectangle(Pens.Black, xRectangle + 2 * latticeWidth, yRectangle, latticeWidth, monthHigh);
g.DrawString("TUESDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + 2 * latticeWidth + 35, yMonthFont, StringFormat.GenericDefault);
g.DrawRectangle(Pens.Black, xRectangle + 3 * latticeWidth, yRectangle, latticeWidth, monthHigh);
g.DrawString("WEDNESDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + 3 * latticeWidth + 15, yMonthFont, StringFormat.GenericDefault);
g.DrawRectangle(Pens.Black, xRectangle + 4 * latticeWidth, yRectangle, latticeWidth, monthHigh);
g.DrawString("THURSDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + 4 * latticeWidth + 25, yMonthFont, StringFormat.GenericDefault);
g.DrawRectangle(Pens.Black, xRectangle + 5 * latticeWidth, yRectangle, latticeWidth, monthHigh);
g.DrawString("FRIDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + 5 * latticeWidth + 50, yMonthFont, StringFormat.GenericDefault);
g.DrawRectangle(Pens.Black, xRectangle + 6 * latticeWidth, yRectangle, latticeWidth, monthHigh);
g.DrawString("SATURDAY", new Font("Arial Black", 19), Brushes.Black, xRectangle + 6 * latticeWidth + 25, yMonthFont, StringFormat.GenericDefault);
//打印該月五週內的日期(一般情況)
for (int i = 0; i < 5; i++)
...{
for (int j = 0; j < 7; j++)
...{
g.DrawRectangle(Pens.Black, xRectangle, yRectangle + monthHigh, latticeWidth, dayHigh);
DateTime fisrtOneDay = dtDay.AddDays(-1);
DateTime lastDayOfMoth = lastDay.AddDays(1);
if (fisrtOneDay < FirstDay && lastDayOfMoth > FirstDay)
...{
g.DrawString(FirstDay.Day.ToString(), new Font("Arial Black", 23), Brushes.Black, xDayFont, yDayFont, StringFormat.GenericDefault);
}
else
...{
g.DrawString(FirstDay.Day.ToString(), new Font("Arial Black", 23), Brushes.Gray, xDayFont, yDayFont, StringFormat.GenericDefault);
}
AmericanHoliday feteDate = new AmericanHoliday(FirstDay); //節假日
if (feteDate.feteValue.ToString() != "")
...{
//打印節假日
g.DrawString(feteDate.feteValue.ToString(), new Font("Arial", 14), Brushes.Red, xDayFont + 50, yDayFont + 5, StringFormat.GenericDefault);
if (feteDate.wordFeteValue.ToString() != "")
...{
//打印特殊節假日
g.DrawString(feteDate.wordFeteValue.ToString(), new Font("Arial", 14), Brushes.Red, xDayFont + 50, yDayFont + 5 + monthHigh, StringFormat.GenericDefault);
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 + 2 * monthHigh, StringFormat.GenericDefault);
}
else
...{
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 + monthHigh, StringFormat.GenericDefault);
}
}
else
...{
if (feteDate.wordFeteValue.ToString() != "")
...{
//打印特殊節假日
g.DrawString(feteDate.wordFeteValue.ToString(), new Font("Arial", 14), Brushes.Red, xDayFont + 50, yDayFont + 5, StringFormat.GenericDefault);
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 + monthHigh, StringFormat.GenericDefault);
}
else
...{
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5, StringFormat.GenericDefault);
}
}
xRectangle = xRectangle + latticeWidth;
xDayFont = xDayFont + latticeWidth;
FirstDay = FirstDay.AddDays(1);
}
xRectangle = 77;
yRectangle = yRectangle + dayHigh;
xDayFont = 77 + 12;
yDayFont = yDayFont + dayHigh;
}
//打印該月第六週的日期(特殊情況)
DateTime lastOneDay = FirstDay.AddDays(-1); //第5周最一個日期
if (lastDay > lastOneDay)
...{
for (int i = 0; i < 7; i++)
...{
g.DrawString("-------------", new Font("Arial Black", 9), Brushes.Black, xDayFont - 3, yDayFont - 170, StringFormat.GenericDefault);
DateTime fisrtDayOfNextMonth = lastDay.AddDays(1); //下個月一號
if (FirstDay < fisrtDayOfNextMonth)
...{
g.DrawString(FirstDay.Day.ToString(), new Font("Arial Black", 23), Brushes.Black, xDayFont, yDayFont - 165, StringFormat.GenericDefault);
}
else
...{
g.DrawString(FirstDay.Day.ToString(), new Font("Arial Black", 23), Brushes.Gray, xDayFont, yDayFont - 165, StringFormat.GenericDefault);
}
AmericanHoliday feteDate = new AmericanHoliday(FirstDay); //節假日
if (feteDate.feteValue.ToString() != "")
...{
//打印節假日
g.DrawString(feteDate.feteValue.ToString(), new Font("Arial", 14), Brushes.Red, xDayFont + 50, yDayFont + 5 - 165, StringFormat.GenericDefault);
if (feteDate.wordFeteValue.ToString() != "")
...{
//打印特殊節假日
g.DrawString(feteDate.wordFeteValue.ToString(), new Font("Arial", 14), Brushes.Red, xDayFont + 50, yDayFont + 5 - 165 + monthHigh, StringFormat.GenericDefault);
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 - 165 + 2 * monthHigh, StringFormat.GenericDefault);
}
else
...{
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 - 165 + monthHigh, StringFormat.GenericDefault);
}
}
else
...{
if (feteDate.wordFeteValue.ToString() != "")
...{
//打印特殊節假日
g.DrawString(feteDate.wordFeteValue.ToString(), new Font("Arial", 14), Brushes.Red, xDayFont + 50, yDayFont + 5 - 165, StringFormat.GenericDefault);
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 - 165 + monthHigh, StringFormat.GenericDefault);
}
else
...{
//打印一般節假日
g.DrawString(feteDate.ybFeteValue.ToString(), new Font("Arial", 14), Brushes.Black, xDayFont + 50, yDayFont + 5 - 165, StringFormat.GenericDefault);
}
}
xDayFont = xDayFont + latticeWidth;
FirstDay = FirstDay.AddDays(1);
}
}
pictureBox1.Width = getTheImage.Width;
pictureBox1.Height = getTheImage.Height;
pictureBox1.Image = getTheImage;
//getTheImage.Save("f:/abc/test.jpg");
}
catch (Exception Ex)
...{
Console.Write(Ex);
}
finally
...{
}
}
else
...{
MessageBox.Show("請輸入年和月");
textBox1.Focus();
}
}
#endregion
private void btn_print_Click(object sender, EventArgs e)
...{
PrintDocument prnDcu = new PrintDocument();
prnDcu.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
prnDcu.QueryPageSettings += new QueryPageSettingsEventHandler(OnQueryPageSetting);
prnDcu.Print();
}
private void OnQueryPageSetting(object sender, QueryPageSettingsEventArgs qe)
...{
qe.PageSettings.Landscape = true;
}
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
...{
if (getTheImage != null)
...{
//getTheImage.RotateFlip(RotateFlipType.Rotate90FlipX);
ev.Graphics.DrawImage(getTheImage, 0, 0, 105 + 950, 105 + 710);
ev.HasMorePages = false;
}
}
}
}
using System.Collections.Generic;
using System.Text;
namespace CustomCalendar
...{
class AmericanHoliday
...{
...#region
//構造方法
public AmericanHoliday()
...{
}
//構造方法
public AmericanHoliday(DateTime dt)
...{
switch (this.CaculateWeekDay(dt.Year, dt.Month, dt.Day))
...{
case 7:
this.weekValue = "1";
break;
case 1:
this.weekValue = "2";
break;
case 2:
this.weekValue = "3";
break;
case 3:
this.weekValue = "4";
break;
case 4:
this.weekValue = "5";
break;
case 5:
this.weekValue = "6";
break;
case 6:
this.weekValue = "7";
break;
}
this.weekNumValue = this.returnweekNum(dt.Year, dt.Month, dt.Day).ToString(); //獲得當前日期是第幾周 string
this.feteValue = this.Fete(dt.Month, dt.Day); //獲得該日期下的節假日
this.ybFeteValue = this.ybFete(dt.Month, dt.Day); //獲得一般節假日
Int32 countWeekNum = Int32.Parse(this.weekNum); //當前日期是第幾周 int
Int32 countDayNum = Int32.Parse(this.week); //當前日期是星期幾 int
this.wordFeteValue = this.WordFete(dt.Month, countWeekNum, countDayNum); //獲得不規律節假日
}
#endregion
...#region
//私有成員 屬性
private DateTime baseDate = new DateTime(1900, 1, 31);
private const ushort START_YEAR = 1901;
private const ushort END_YEAR = 2050;
private string week;
private string weekNum;
private string fete;
private string ybfete;
private string wordFete;
public string weekValue //獲得星期幾
...{
get ...{ return week; }
set ...{ week = value; }
}
public string weekNumValue //獲得月內的第幾周
...{
get ...{ return weekNum; }
set ...{ weekNum = value; }
}
public string feteValue //獲得節日
...{
get ...{ return fete; }
set ...{ fete = value; }
}
public string ybFeteValue //獲得一般節假日
...{
get ...{ return ybfete; }
set ...{ ybfete = value; }
}
public string wordFeteValue //獲得不規律節假日
...{
get ...{ return wordFete; }
set ...{ wordFete = value; }
}
#endregion
...#region
//法定節假日數組
private static string[] sFtv = ...{
"0101 New Year's Day",
//"0202 Groundhog Day",
//"0212 Lincoln's Birthday",
//"0214 Valentine's Day",
//"0317 Saint Patrick's Day",
//"0323 Easter Day",
//"0415 Tax Day",
//"0423 Administrative Professionals Day",
//"0511 Mother's Day",
//"0614 Flag Day",
//"0615 Father's Day",
"0704 Independence Day",
//"1031 Halloween",
//"1104 Election Day",
"1111 Veteran's Day",
//"1224 Christmas Eve",
"1225 Christmas Day",
//"1231 New Year's Eve"
};
//一般節假日數組
private static string[] ybFtv = ...{
"0202 Groundhog Day",
"0212 Lincoln's Birthday",
"0214 Valentine's Day",
"0317 Saint Patrick's Day",
"0323 Easter Day",
"0415 Tax Day",
"0423 Administrative Professionals Day",
"0511 Mother's Day",
"0614 Flag Day",
"0615 Father's Day",
"1031 Halloween",
"1104 Election Day",
"1224 Christmas Eve",
"1231 New Year's Eve"
};
//不規律節假日數組
private static string[] twFtv = ...{
"0132 Martin Luther King Day", //1月的第三個星期一
"0232 Presidents' Day", //2月的第三個星期一
"0552 Memorial Day", //5月的最後一個星期一
"0912 Labor Day", //9月的第一個星期一
"1022 Columbus Day", //10月的第二個星期一
"1145 Thanksgiving Day" //11月的第四個星期四
};
#endregion
...#region
//獲得法定節假日名稱
public string Fete(int month, int day)
...{
for (int i = 0; i < sFtv.Length; i++)
...{
string[] s = new string[4];
s[0] = sFtv[i].Substring(0, 2);
s[1] = sFtv[i].Substring(2, 2);
s[2] = sFtv[i].Substring(4, 1);
s[3] = sFtv[i].Substring(5);
if (Convert.ToInt32(s[0]) == month && Convert.ToInt32(s[1]) == day)
...{
return s[3];
}
}
return "";
}
//獲得一般節假日名稱
public string ybFete(int month, int day)
...{
for (int i = 0; i < ybFtv.Length; i++)
...{
string[] s = new string[4];
s[0] = ybFtv[i].Substring(0, 2);
s[1] = ybFtv[i].Substring(2, 2);
s[2] = ybFtv[i].Substring(4, 1);
s[3] = ybFtv[i].Substring(5);
if (Convert.ToInt32(s[0]) == month && Convert.ToInt32(s[1]) == day)
...{
return s[3];
}
}
return "";
}
//獲得不規律節假日名稱
public string WordFete(int month, int num, int week)
...{
for (int i = 0; i < twFtv.Length; i++)
...{
string[] s = new string[4];
s[0] = twFtv[i].Substring(0, 2);
s[1] = twFtv[i].Substring(2, 1);
s[2] = twFtv[i].Substring(3, 1);
s[3] = twFtv[i].Substring(4);
if (Convert.ToInt32(s[0]) == month && Convert.ToInt32(s[1]) == num && Convert.ToInt32(s[2]) == week)
...{
return s[3];
}
}
return "";
}
//期根據年月日計算星期幾方法 返回int
public int CaculateWeekDay(int y, int m, int d) //y-年,m-月,d-日,期根據年月日計算星期幾的函數
...{
if (m == 1)
...{
m = 13;
y = y - 1;
}
if (m == 2)
...{
m = 14;
y = y - 1;
}
int week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7; //基姆拉爾森計算公式
int weekstr = 0;
switch (week)
...{
case 0: weekstr = 1; break;
case 1: weekstr = 2; break;
case 2: weekstr = 3; break;
case 3: weekstr = 4; break;
case 4: weekstr = 5; break;
case 5: weekstr = 6; break;
case 6: weekstr = 7; break;
}
return weekstr;
}
//計算是該月第幾周
public int returnweekNum(int y, int m, int d)
...{
int weekNo = 0;
int week = this.CaculateWeekDay(y, m, d);
if (week == 7)
week = 0;
if (d > (week))
...{
if ((d - week) % 7 == 0)
weekNo = (d - week) / 7 + 1;
else
weekNo = (d - week) / 7 + 2;
}
else
...{
weekNo = 1;
}
return weekNo;
}
}
}
#endregion