1. Herfried K. Wagner’s VB.Any
  2. .NET
  3. Frequently Asked Questions

Displaying week numbers in a datetimepicker control’s dropdown part

Displaying week numbers in a datetimepicker control's dropdown part
<URL:http://dotnet.mvps.org/dotnet/faqs/?id=datetimepickerweeknumbers&lang=en>
----------------------------------------------------------------------------

Displaying week numbers in a datetimepicker control's dropdown part

This solution is based on a sample written by Jürgen Beck [MVP].

The class below extends the standard datetimepicker control that comes with
the .NET Framework 1.0/1.1 by a 'ShowWeekNumber' property.  If this
property is set to 'True', week numbers will be shown in the dropdown part
of the control:

\\\
Imports System
Imports System.ComponentModel
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Public Class ExtendedDateTimePicker
    Inherits DateTimePicker

    Public Declare Auto Function GetWindowLong Lib "user32.dll" ( _
        ByVal hWnd As IntPtr, _
        ByVal nIndex As Int32 _
    ) As Int32

    Private Declare Auto Function SetWindowLong Lib "user32.dll" ( _
        ByVal hWnd As IntPtr, _
        ByVal nIndex As Int32, _
        ByVal dwNewLong As Int32 _
    ) As Int32

    Private Const GWL_STYLE As Int32 = (-16)

    Private Const MCM_FIRST As Int32 = &H1000
    Private Const MCM_GETMINREQRECT As Int32 = (MCM_FIRST + 9)
    Private Const MCS_WEEKNUMBERS As Int32 = &H4

    Private Const DTM_FIRST As Int32 = &H1000
    Private Const DTM_GETMONTHCAL As Int32 = (DTM_FIRST + 8)

    Private Declare Auto Function SendMessage Lib "user32.dll" ( _
        ByVal hWnd As IntPtr, _
        ByVal Msg As Int32, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr _
    ) As IntPtr

    Private Declare Auto Function SendMessage Lib "user32.dll" ( _
        ByVal hWnd As IntPtr, _
        ByVal Msg As Int32, _
        ByVal wParam As IntPtr, _
        ByRef lParam As Rectangle _
    ) As IntPtr

    Private Declare Function MoveWindow Lib "user32.dll" ( _
        ByVal hwnd As IntPtr, _
        ByVal x As Int32, _
        ByVal y As Int32, _
        ByVal nWidth As Int32, _
        ByVal nHeight As Int32, _
        ByVal bRepaint As Boolean _
    ) As Int32

    Private m_ShowWeekNumbers As Boolean

    < _
        Browsable(True), _
        DesignerSerializationVisibility( _
            DesignerSerializationVisibility.Visible _
        ) _
    > _
    Public Property ShowWeekNumbers() As Boolean
        Get
            Return m_ShowWeekNumbers
        End Get
        Set(ByVal Value As Boolean)
            m_ShowWeekNumbers = Value
        End Set
    End Property

    Protected Overloads Overrides Sub OnDropDown(ByVal e As EventArgs)
        Dim hMonthView As IntPtr = _
            SendMessage(Me.Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero)
        Dim dwStyle As Int32 = GetWindowLong(hMonthView, GWL_STYLE)
        If Me.ShowWeekNumbers Then
            dwStyle = dwStyle Or MCS_WEEKNUMBERS
        Else
            dwStyle = dwStyle And Not MCS_WEEKNUMBERS
        End If
        Dim rct As Rectangle
        SetWindowLong(hMonthView, GWL_STYLE, dwStyle)
        SendMessage(hMonthView, MCM_GETMINREQRECT, IntPtr.Zero, rct)
        MoveWindow(hMonthView, 0, 0, rct.Right + 2, rct.Bottom, True)
        MyBase.OnDropDown(e)
    End Sub
End Class
///