VB
发布时间:2022-04-03 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了VB.NET 编写仿微软的日历控件,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
控件名称
@H_673_14@ |
控件类型
@H_673_14@ |
设置属性
@H_673_14@ |
DatePanl
@H_673_14@ |
TableLayoutPanle
@H_673_14@ |
@H_673_14@
|
@H_574_6@monthAddbtn,MonthSubbtn
@H_673_14@ YearAddBtn,YearSubBtn
@H_673_14@ |
Button
@H_673_14@ |
Flatstyle=Flat
@H_673_14@ |
@H_574_6@monthLbl,Yearlbl,label3
@H_673_14@ |
Label
@H_673_14@ |
Dock=Fill
@H_673_14@ |
@H_801_146@
Picture
@H_673_14@ |
PictureBox
@H_673_14@ |
@H_673_14@
|
思路是先利用用户控件,做出日历的主体,然后利用ToolStripControlHost作为容器将日历的主体包含在里面利用ToolStripDropDown控件做弹出效果,最后重写Combobox控件形成完整的日历控件。
@H_673_14@
对于日历的主体,通过将背景分成不同的小格,然后将数字绘制在背景上。在编写的时候需要注意以下几个问题。
@H_673_14@
(一)在绘制的时注意定位,我以每个月的1号做为定位点通过@H_673_14@StartDay = @H_673_14@CDate(m_Date.Year & @H_673_14@"-" & m_Date.Month & @H_673_14@"-1").DayOfWeek @H_673_14@– 1这个计算将星期和日期定位以便绘制。
@H_673_14@
(二)通过边缘检测也就是检测没个小格的坐标然后再反算为日期以产生通过点击日历产生不同日期的效果。
@H_673_14@
(三)通过申明事件@H_673_14@Public @H_673_14@Event DateChanged(@H_673_14@ByVal Sender @H_673_14@As @H_673_14@Object,@H_673_14@ByVal e @H_673_14@As EventArgs)@H_673_14@然后在不同的时候触发以传出数据。
@H_673_14@
(四)特别是Picturebox控件没有实质的用处,但是没有他的时候当整个控件包装在ToolStripDropDown控件的时候会不能完全显示,所以只有将它放在右下角。
@H_673_14@
下面是主体代码:@H_673_14@
@H_673_14@
- ImportsSystem.Drawing.Drawing2D
- ImportsSystem.Windows.Forms.Design
- ImportsSystem.Windows.Forms.ComponentModel
- FriendClassCalendar
- Private@H_909_334@m_DateAsDate
- Private@H_909_334@m_Week()AsString=NewString(){"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}
- Private@H_909_334@m_ClipWidthAsSingle
- Private@H_909_334@m_CliPTOPAsInteger
- ShadowsFontAsNewFont("宋体",9,FontStyle.Regular,GraphicsUnit.Point)
- PrivateFormatAsNewStringFormat
- PrivateStartDayAsInteger
- PublicEventDateChanged(ByValSenderAsObject,ByValeAsEventArgs)
- Private@H_909_334@m_IsSELEctedAsBoolean
- Privatei,jAsInteger,RectAsNewRectangleF
- Private@H_909_334@minDateAsDate=CDate("1900-1-1")
- Private@H_909_334@maxDateAsDate=CDate("2100-12-31")
- PublicReadOnlyPropertyIsSELEcted()AsBoolean
- Get
- Return@H_909_334@m_IsSELEcted
- EndGet
- EndProperty
- PublicSubNew()
- InitializeComponent()
- @H_909_334@m_ClipWidth=(@H_583_332@me.Width-4)/7
- @H_909_334@m_CliPTOP=2+DatePanl.Height
- @H_909_334@m_Date=Now.Date
- Format.Alignment=StringAlignment.Center
- EndSub
- PublicPropertyDateValue()AsDate
- Get
- Return@H_909_334@m_Date
- EndGet
- Set(ByValvalueAsDate)
- Ifvalue>=MinDateAndAlsovalue<=MaxDateThen
- @H_909_334@m_Date=value
- @H_583_332@me.Invalidate()
- EndIf
- EndSet
- EndProperty
- PrivateSubCalendar_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)Handles@H_583_332@me.Load
- Label3.Text="今天:"&Now.ToShortDateString
- Label3.Left=(@H_583_332@me.Width-Label3.Width)/2
- EndSub
- PrivateSubAddBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.MouseEventArgs)Handles@H_909_334@monthAddbtn.MouseClick,MonthSubbtn.MouseClick,YearAddBtn.MouseClick,YearSubBtn.MouseClick
- Ife.button=Windows.Forms.MouseButtons.LeftThen
- DatePanl.Focus()
- DimTAsButton=CType(sender,Button)
- SELEctCaseT.Name
- Case"MonthAddbtn"
- @H_909_334@m_Date=@H_583_332@me.DateValue.AddMonths(1)
- Case"MonthSubbtn"
- @H_909_334@m_Date=@H_583_332@me.DateValue.AddMonths(-1)
- Case"YearAddBtn"
- @H_909_334@m_Date=@H_583_332@me.DateValue.AddYears(1)
- Case"YearSubBtn"
- @H_909_334@m_Date=@H_583_332@me.DateValue.AddYears(-1)
- EndSELEct
- If@H_909_334@m_Date>=MinDateAndAlso@H_909_334@m_Date<=MaxDateThen
- @H_909_334@m_IsSELEcted=false
- RaiseEventDateChanged(@H_583_332@me,Nothing)
- @H_583_332@me.Invalidate()
- ElseIf@H_909_334@m_Date<MinDateThen
- @H_909_334@m_Date=CDate("1900-1-"&m_Date.Day)
- Else
- @H_909_334@m_Date=CDate("2100-12-"&m_Date.Day)
- EndIf
- EndIf
- EndSub
- PrivateSubDrawWeek(ByValGraphicsAsGraphics)
- Fori=0To6
- Rect=NewRectangleF(2+i*m_ClipWidth,m_CliPTOP+2,m_ClipWidth,@H_583_332@me.Font.Height+2)
- Graphics.DrawString(m_Week(i),Font,Brushes.RoyalBlue,Rect)
- Next
- Graphics.DrawLine(Pens.Gray,2,m_CliPTOP+Font.Height+2,@H_583_332@me.Width-6,m_CliPTOP+Font.Height+2)
- Graphics.DrawRectangle(Pens.RoyalBlue,40,@H_583_332@me.Height-Font.Height,m_ClipWidth-1,Font.Height-1)
- EndSub
- PrivateSubDrawDate(ByValGraphicsAsGraphics)
- Dim@H_909_334@maxDaysAsInteger=Date.DaysInMonth(m_Date.Year,m_Date.Month)
- Dim@H_909_334@mindays=Date.DaysInMonth(m_Date.AddMonths(-1).Year,m_Date.AddMonths(-1).Month)
- StartDay=CDate(m_Date.Year&"-"&m_Date.Month&"-1").DayOfWeek-1
- DimDateStringAsInteger
- Fori=0To6
- Forj=0To5
- WithRect
- .X=2+i*m_ClipWidth
- .Y=m_CliPTOP+j*Font.Height+Font.Height+8
- .Width=m_ClipWidth
- .Height=Font.Height
- EndWith
- DateString=(i+j*7-StartDay)
- IfDateString<=0Then
- Graphics.DrawString(DateString+Mindays,Brushes.Gray,Rect,Format)
- ElseIfDateString>0AndAlsoDateString<=MaxDaysThen
- IfDateString=m_Date.DayThen
- Graphics.FillRectangle(Brushes.Silver,Rect.X-1,Rect.Y-1,Rect.Width,Rect.Height)
- EndIf
- IfDateString=Now.DayAndAlso@H_909_334@m_Date.Month=Now.MonthAndAlso@H_909_334@m_Date.Year=Now.YearThen
- Graphics.DrawRectangle(Pens.RoyalBlue,Rect.Width-1,Rect.Height-1)
- EndIf
- Graphics.DrawString(DateString,Brushes.black,Format)
- ElseIfDateString>MaxDaysAndAlsoDateString<=42Then
- Graphics.DrawString(DateString-MaxDays,Format)
- EndIf
- Next
- Next
- EndSub
- PrivateSubCalendar_MouseClick(ByValsenderAsObject,ByValeAsSystem.Windows.Forms.MouseEventArgs)Handles@H_583_332@me.MouseDown
- DimxAsInteger=e.X
- DimyAsInteger=e.Y
- DimDateStringAsInteger
- DimPenAsNewPen(Color.Gray)
- Pen.DashStyle=DashStyle.Dot
- Dim@H_909_334@maxDaysAsInteger=Date.DaysInMonth(m_Date.Year,m_Date.Month)
- Dim@H_909_334@mindays=Date.DaysInMonth(m_Date.AddMonths(-1).Year,m_Date.AddMonths(-1).Month)
- @H_909_334@m_IsSELEcted=false
- Ife.button=Windows.Forms.MouseButtons.LeftThen
- Fori=0To6
- Forj=0To5
- DateString=(i+j*7-StartDay)
- WithRect
- .X=2+i*m_ClipWidth
- .Y=m_CliPTOP+(j+1)*Font.Height+8
- .Width=m_ClipWidth
- .Height=Font.Height
- EndWith
- Ifx>=Rect.X-1AndAlsox<=Rect.RightAndAlsoy>Rect.Y-1AndAlsoy<=Rect.bottomThen
- IfDateString<=0Then
- IfCDate(m_Date.AddMonths(-1).Year&"-"&m_Date.AddMonths(-1).Month&"-"&dateString+Mindays)>=MinDateThen
- @H_909_334@m_Date=CDate(m_Date.AddMonths(-1).Year&"-"&m_Date.AddMonths(-1).Month&"-"&dateString+Mindays)
- @H_909_334@m_IsSELEcted=True
- EndIf
- ElseIfDateString>0AndAlsoDateString<=MaxDaysThen
- @H_909_334@m_Date=CDate(m_Date.Year&"-"&m_Date.Month&"-"&dateString)
- @H_909_334@m_IsSELEcted=True
- ElseIfDateString>MaxDaysAndAlsoDateString<=42Then
- IfCDate(m_Date.AddMonths(1).Year&"-"&m_Date.AddMonths(1).Month&"-"&dateString-MaxDays)<=MaxDateThen
- @H_909_334@m_Date=CDate(m_Date.AddMonths(1).Year&"-"&m_Date.AddMonths(1).Month&"-"&dateString-MaxDays)
- @H_909_334@m_IsSELEcted=True
- EndIf
- EndIf
- @H_583_332@me.CreateGraphics.DrawRectangle(Pen,Rect.Height-1)
- RaiseEventDateChanged(@H_583_332@me,Nothing)
- @H_583_332@me.Invalidate()
- EndIf
- Next
- Next
- Pen.Dispose()
- EndIf
- EndSub
- PrivateSubCalendar_Paint(ByValsenderAsObject,ByValeAsSystem.Windows.Forms.PaintEventArgs)Handles@H_583_332@me.Paint
- DrawWeek(e.Graphics)
- DrawDate(e.Graphics)
- @H_909_334@monthLbl.Text=m_Date.Month&"月"
- Yearlbl.Text=m_Date.Year&"年"
- EndSub
- PrivateSubLabel3_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesLabel3.Click
- @H_909_334@m_Date=Now
- @H_583_332@me.m_IsSELEcted=True
- RaiseEventDateChanged(@H_583_332@me,Nothing)
- @H_583_332@me.Invalidate()
- EndSub
- PrivateSubLabel3_MouseEnter(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesLabel3.MouseEnter
- Label3.cursor=cursors.Hand
- EndSub
- PrivateSubLabel3_MouSELEave(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesLabel3.MouSELEave
- Label3.cursor=cursors.Default
- EndSub
- PrivateSubCalendar_Resize(ByValsenderAsObject,ByValeAsSystem.EventArgs)Handles@H_583_332@me.Resize
- @H_583_332@me.Size=NewSize(298,150)
- EndSub
- EndClass
以下是主体在运行时的效果@H_673_14@
接下来是将Combobox控件重写然后将主体包装的代码@H_673_14@
- ImportsCalendar
- PublicClassDatePicker
- InheritsComboBox
- PrivateWithEventsCalendarAsCalendar
- PrivateDateToolAsToolStripDropDown
- PrivateConstWM_LBUTTONDOWN=
- PrivateConstWM_LBUTTONDBLCLK=
- PublicSubNew()
- InitTool()
- EndSub
- PublicPropertyValue()AsDate
- Get
- ReturnCalendar.DateValue
- EndGet
- Set(ByValvalueAsDate)
- IfDate.TryParse(value,Calendar.Datevalue)=TrueThen
- @H_583_332@me.Text=value.ToLongDateString
- EndIf
- EndSet
- EndProperty
- ProtectedOverridesSubWndProc(ByRef@H_909_334@mAsSystem.Windows.Forms.messagE)
- If@H_909_334@m.Msg=WM_LBUTTONDOWNOrElse@H_909_334@m.Msg=WM_LBUTTONDBLCLKThen
- ShowDrop()
- @H_583_332@me.Focus()
- Return
- EndIf
- @H_583_332@myBase.WndProc(m)
- EndSub
- PrivateSubInitTool()
- Calendar=NewCalendar
- DimToolHostAsNewToolStripControlHost(Calendar)
- DateTool=NewToolStripDropDown
- DateTool.Items.Add(ToolHost)
- EndSub
- PrivateSubShowDrop()
- IfDate.TryParse(@H_583_332@me.Text,Calendar.Datevalue)=TrueThen
- DateTool.Show(@H_583_332@me,@H_583_332@me.Height)
- EndIf
- EndSub
- PrivateSubCalendar_DateChanged(ByValSenderAsObject,ByValeAsSystem.EventArgs)HandlesCalendar.DateChanged
- IfCalendar.IsSELEcted=TrueThen
- Threading.Thread.Sleep(100)
- DateTool.Hide()
- EndIf
- @H_583_332@me.Text=Calendar.DateValue.ToLongDateString
- EndSub
- EndClass
@H_673_14@
最后进行测试
@H_673_14@
测试代码如下:@H_673_14@
- PrivateSubForm1_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)Handles@H_583_332@me.Load
- DatePicker1.Text=Now.ToLongDateString
- EndSub
运行效果如下图@H_673_14@
大佬总结
以上是大佬教程为你收集整理的VB.NET 编写仿微软的日历控件全部内容,希望文章能够帮你解决VB.NET 编写仿微软的日历控件所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。