Csharp Win版万年历 GDI绘制.doc_第1页
Csharp Win版万年历 GDI绘制.doc_第2页
Csharp Win版万年历 GDI绘制.doc_第3页
Csharp Win版万年历 GDI绘制.doc_第4页
Csharp Win版万年历 GDI绘制.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近做一个项目需要用到一个万年历,其中对阳历可做事件,生日提醒,生日提醒能支持农历日期.可C#自带的控件实现起来非常之痛苦,有太多局限性,因此便百度google看能否找到现成的控件,结果很失望.于是只能自己想办法了,这里我用了一个最笨的办法直接绘制一个万年历,并实现相关事件.这里主要介绍使用GDI+实现万年历的过程,个人拙见还望高人指点.万年历截图:图中除菜单栏和主panel外,全部是代码生成的.首先往panelMonthInfo控件上添加控件,如年份,月份 及 跳转到今天等,代码如下: View Code 1#region绘制控件2/绘制控件3privatevoidDrawControls()45varbtnToday=newButton();6btnToday.Location=newSystem.Drawing.Point(300,15);7btnToday.Name=btnToday;8btnToday.Size=newSystem.Drawing.Size(80,21);9btnToday.TabIndex=0;10btnToday.Text=跳转到今天;11btnToday.UseVisualStyleBackColor=true;12btnToday.Click+=newSystem.EventHandler(this.btnToday_Click);1314varlblYear=newLabel();15lblYear.Name=lblYear;16lblYear.Text=年份;17lblYear.Location=newPoint(91,19);18lblYear.Size=newSize(29,20);19lblYear.BackColor=Color.Transparent;2021varlblMonth=newLabel();22lblMonth.Name=lblMonth;23lblMonth.Text=月份;24lblMonth.Location=newPoint(190,19);25lblMonth.Size=newSize(29,20);26lblMonth.BackColor=Color.Transparent;27 28varcmbSelectYear=newComboBox();29cmbSelectYear.DropDownStyle=ComboBoxStyle.DropDownList;30cmbSelectYear.FormattingEnabled=true;31cmbSelectYear.Location=newPoint(120,15);32cmbSelectYear.Name=cmbSelectYear;33cmbSelectYear.AutoSize=false;34cmbSelectYear.Size=newSize(50,20);35cmbSelectYear.TabIndex=0;36cmbSelectYear.SelectionChangeCommitted+=newEventHandler(cmbSelectYear_SelectionChangeCommitted);3738varcmbSelectMonth=newComboBox();39cmbSelectMonth.DropDownStyle=ComboBoxStyle.DropDownList;40cmbSelectMonth.FormattingEnabled=true;41cmbSelectMonth.Location=newPoint(220,15);42cmbSelectMonth.Name=cmbSelectYear;43cmbSelectMonth.AutoSize=false;44cmbSelectMonth.Size=newSize(50,20);45cmbSelectMonth.TabIndex=0;46cmbSelectMonth.SelectionChangeCommitted+=newEventHandler(cmbSelectMonth_SelectionChangeCommitted);4748varpanelDateInfo=newPanel();49panelDateInfo.BackColor=Color.White;50panelDateInfo.Location=newPoint(575,45);51panelDateInfo.Size=newSize(165,390);52panelDateInfo.Paint+=newPaintEventHandler(panelDateInfo_Paint);5354varlblShowTime=newLabel();55lblShowTime.Location=newPoint(600,470);56lblShowTime.BackColor=Color.Transparent;57lblShowTime.AutoSize=true;58lblShowTime.Name=lblShowTime;5960varlabel1=newLabel();61label1.AutoSize=false;62label1.Font=newSystem.Drawing.Font(MicrosoftSansSerif,8.25F,System.Drawing.FontStyle.Italic,System.Drawing.GraphicsUnit.Point,(byte)(134);63label1.Location=newSystem.Drawing.Point(252,449);64label1.Name=label1;65label1.Size=newSystem.Drawing.Size(176,13);66label1.TabIndex=0;67label1.Text=飞鸿踏雪泥;68label1.BackColor=Color.Transparent;69label1.TextAlign=ContentAlignment.MiddleCenter;70label1.Width=400;71label1.Click+=newEventHandler(label1_Click);7273for(inti=1949;i=2049;i+)7475cmbSelectYear.Items.Add(i);76if(i=dtNow.Year)7778cmbSelectYear.SelectedItem=i;79selectYear=i;808182for(inti=1;i=12;i+)8384cmbSelectMonth.Items.Add(i);85if(i=dtNow.Month)8687cmbSelectMonth.SelectedItem=i;88selectMonth=i;899091panelMonthInfo.Controls.Add(btnToday);92panelMonthInfo.Controls.Add(lblMonth);93panelMonthInfo.Controls.Add(lblYear);94panelMonthInfo.Controls.Add(cmbSelectYear);95panelMonthInfo.Controls.Add(cmbSelectMonth);96panelMonthInfo.Controls.Add(panelDateInfo);97panelMonthInfo.Controls.Add(lblShowTime);98panelMonthInfo.Controls.Add(label1);99100101102#endregion这里共有两个panel控件,一个是绘制月历,一个是显示选中或者当前日期的详细信息,如图右侧.下一步绘制月历方格,代码如下:View Code 1/主窗体绘制月历2privatevoidpanelMonthInfo_Paint(objectsender,PaintEventArgse)34Graphicsg=e.Graphics;5varpen=newPen(Color.FromArgb(255,235,211),1);6vartb=newTextureBrush(global:ChineseCalender.Properties.Resources.wnlbg,WrapMode.TileFlipXY);7g.FillRectangle(tb,0,0,750,475);/绘制黄色背景,此处使用了图片作为背景8g.FillRectangle(newSolidBrush(Color.White),5,40,740,400);/绘制月历显示区域,背景为白色910SolidBrushsb=newSolidBrush(Color.FromArgb(50,255,247,241);11g.FillRectangle(sb,10,45,560,30);/此处绘制月历表头的背景填充1213/画横线14g.DrawLine(pen,10,45,570,45);15g.DrawLine(pen,10,75,570,75);16for(inti=1;i7;i+)1718g.DrawLine(pen,10,75+60*i,570,75+60*i);19202122/画竖线23for(inti=0;i8;i+)2425g.DrawLine(pen,10+80*i,45,10+80*i,435);26272829varsolidBrushWeekday=newSolidBrush(Color.Gray);30varsolidBrushWeekend=newSolidBrush(Color.Chocolate);31g.DrawString(日,newFont(微软雅黑,12),solidBrushWeekend,35,50);32g.DrawString(一,newFont(微软雅黑,12),solidBrushWeekday,115,50);33g.DrawString(二,newFont(微软雅黑,12),solidBrushWeekday,195,50);34g.DrawString(三,newFont(微软雅黑,12),solidBrushWeekday,275,50);35g.DrawString(四,newFont(微软雅黑,12),solidBrushWeekday,355,50);36g.DrawString(五,newFont(微软雅黑,12),solidBrushWeekday,435,50);37g.DrawString(六,newFont(微软雅黑,12),solidBrushWeekend,515,50);3839if(flag)/判断是否需要全部刷新4041GetWeekInfo(refweekOfFirstDay,refdaysOfMonth,dtNow.Year,dtNow.Month);/此方法是根据给出的年份和月份计算当月的第一天的星期,和当月的总天数42DrawDateNum(weekOfFirstDay,daysOfMonth,dtNow.Year,dtNow.Month);43/DrawDateInfo(dtNow);4445下面介绍一下在方格内绘制日期信息,首先我们要确定当月一号的位置,这里是通过星期来控制的,然后通过两个for循环进行日期绘制,看代码:1/绘制月历日期2privatevoidDrawDateNum(intfirstDayofWeek,intendMonthDay,intyear,intmonth)34DateTimedtNow=DateTime.Parse(DateTime.Now.ToShortDateString();56varfont=newFont(,14);7varsolidBrushWeekdays=newSolidBrush(Color.Gray);8varsolidBrushWeekend=newSolidBrush(Color.Chocolate);9varsolidBrushHoliday=newSolidBrush(Color.BurlyWood);10Graphicsg=panelMonthInfo.CreateGraphics();11intnum=1;1213for(intj=0;j6;j+)1415for(inti=0;i7;i+)1617if(j=0&iendMonthDay)/定义当月最后一天的位置2425break;2627stringcMonth=null;28stringcDay=null;29stringcHoliday=null;30stringccHoliday=null;3132if(i0&i3?cHoliday.Substring(0,3):cHoliday,newFont(,9),52solidBrushHoliday,(40+80*i),(90+60*j);5354/绘农历55if(ccHoliday!=)5657g.DrawString(ccHoliday,newFont(,10),solidBrushWeekdays,(25+80*i),58(115+60*j);5960else6162g.DrawString(cDay=初一?cMonth:cDay,newFont(,10),solidBrushWeekdays,(25+80*i),63(115+60*j);64656667/绘日期68g.DrawString(num.ToString(CultureInfo.InvariantCulture),font,solidBrushWeekdays,69(15+80*i),(80+60*j);707172else7374vardt=DateTime.Parse(year+-+month+-+num);75varts=dt-dtNow;76dateArrayi,j=dt.ToShortDateString();77if(ts.Days=0)7879g.DrawEllipse(newPen(Color.Chocolate,3),(15+80*i),(85+60*j),30,15);808182cMonth=ChineseDate.GetMonth(dt);83cDay=ChineseDate.GetDay(dt);84cHoliday=ChineseDate.GetHoliday(dt);85ccHoliday=ChineseDate.GetChinaHoliday(dt);8687if(cHoliday!=null)8889/绘阳历节日90g.DrawString(cHoliday.Length3?cHoliday.Substring(0,3):cHoliday,newFont(,9),91solidBrushHoliday,(40+80*i),(90+60*j);9293/绘农历94if(ccHoliday!=)9596g.DrawString(ccHoliday,newFont(,10),solidBrushWeekend,(25+80*i),97(115+60*j);9899else100101g.DrawString(cDay=初一?cMonth:cDay,newFont(,10),solidBrushWeekend,(25+80*i),102(115+60*j);103104105/绘日期106g.DrawString(num.ToString(CultureInfo.InvariantCulture),font,solidBrushWeekend,107(15+80*i),(80+60*j);108109110num+;111112113114115116117118/获取某月首日星期及某月天数119privatevoidGetWeekInfo(refintweekOfFirstDay,refintdaysOfMonth,intyear=1900,intmonth=2,intday=1)120121DateTimedt=122DateTime.Parse(year.ToString(CultureInfo.InvariantCulture)+-+123month.ToString(CultureInfo.InvariantCulture)+-+124day.ToString(CultureInfo.InvariantCulture);125weekOfFirstDay=(int)dt.DayOfWeek;126daysOfMonth=(int)DateTime.DaysInMonth(year,month);127这里调用了两个阳历转农历的方法,这个不是我写的,网上有现成的代码,后面我会附在附件里到这里,整个月历的样子就已经显示出来了,然后我想要选择年份和日期来控制月历的显示,比如在下拉列表中选择2013,01,然后显示当月的月历信息,如是,这里使用了Combobox控件的SelectionChangeCommitted事件,因为我在初始化控件的时候对其赋值了,如果使用了 selectedchange事件将会在窗体初始化是重复绘制.1privatevoidcmbSelectMonth_SelectionChangeCommitted(objectsender,EventArgse)23flag=false;4varcmbSelectMonth=senderasComboBox;5selectMonth=(int)cmbSelectMonth.SelectedItem;6panelMonthInfo.Refresh();7GetWeekInfo(refweekOfFirstDay,refdaysOfMonth,selectYear,selectMonth);8DrawDateNum(weekOfFirstDay,daysOfMonth,selectYear,selectMonth);91011privatevoidcmbSelectYear_SelectionChangeCommitted(objectsender,EventArgse)1213flag=false;14varcmbSelectYear=senderasComboBox;15selectYear=(int)cmbSelectYear.SelectedItem;16panelMonthInfo.Refresh();17GetWeekInfo(refweekOfFirstDay,refdaysOfMonth,selectYear,selectMonth);18DrawDateNum(weekOfFirstDay,daysOfMonth,selectYear,selectMonth);19Ok,到这里基本上已经可以实现了万年历的显示效果了,但还有一个地方未实现,我希望在单击日期的时候能显示当天的详细农历情况及当日的提醒等等,这里就需要实现日期选择的单击效果,我这里用panel的mouseClick事件+鼠标坐标来实现单击效果,1/鼠标单击2privatevoidpanelMonthInfo_MouseClick(objectsender,MouseEventArgse)345/MessageBox.Show(e.X+n+e.Y);6if(e.Button=MouseButtons.Left)78910if(e.X575)1112return;1314if(e.Y435)1516return;1718intx=(e.X-10)/80;19inty=(e.Y-75)/60;20if(dateArrayx,y=null)2122return;2324DateTimedtSelect=DateTime.Parse(dateArrayx,y);25dtInfo=dtSelect;26/DrawDateInfo(dtSelect);2728panelDateInfo.Refresh();29下面是绘制选中日期的详细信息,如下:privatevoidpanelDateInfo_Paint(objectsender,PaintEventArgse)ChineseCalendarcc=newChineseCalendar(dtInfo);stringdateString=cc.DateString;/阳历stringchineseDateString=cc.ChineseDateString;/农历stringdateHoliday=cc.DateHoliday;/阳历节日stringchineseTwentyFourDay=cc.ChineseTwentyFourDay;/农历节日stringconstellation=cc.Constellation;/星座stringweekDayString=cc.WeekDayStr;/星期stringganZhiDateString=cc.GanZhiDateString;stringanimalString=cc.AnimalString;stringchineseConstellation=cc.ChineseConstellation;if(panelDateInfo!=null)Graphicsg=panelDateInfo.CreateGraphics();if(dateString!=null)g.DrawString(dateString+weekDayString,newFont(,9),newSolidBrush(Color.Gray),7,10);g.DrawString(dtInfo.Day.ToString(CultureInfo.InvariantCulture),newFont(,45,FontStyle.Bold),newSolidBrush(Color.Gainsboro),50,30);varf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论