改变DateTimePicker控件中的星期显示方式

问题描述 投票:0回答:1

在vb.net或c#应用程序的winforms环境中使用传统的DateTimePicker控件,我需要将一周的显示方式从正常的周日到周六改为周二到周一。我在Google和Stack上搜索了一下,没有发现任何这方面的内容。我创建一个自定义控件没有问题。我只是不知道从哪里开始。

c# vb.net winforms datetimepicker
1个回答
3
投票

你可以使用 发送消息 发出 MCM_SETFIRSTDAYOFWEEK 消息到DateTimePicker的MonthCalendar(请阅读文档中与此消息相关的注释)。

你首先发送一个 DTM_GETMONTHCAL 消息来获取MonthCalendar控件的句柄。如图所示,你可以将此消息发送到 DropDown 事件处理程序的DateTimePicker。如果句柄有效,则设置第一天发送的 MCM_SETFIRSTDAYOFWEEK. 该 lParam 值决定了月历中显示的第一天。

0 = 星期一。1 = 星期二等。

如果你想建立一个自定义的控件(IMO,最好是),你可以在这里找到一个预建的控件。如何设置DateTimePicker下拉菜单只选择年或月?

它展示了如何处理DateTimePicker和它的MonthCalendar下拉菜单,以改变当前视图和类似的任务。

internal const int DTM_FIRST = 0x1000;
internal const int DTM_GETMONTHCAL = DTM_FIRST + 8;
internal const int MCM_FIRST = 0x1000;
internal const int MCM_SETFIRSTDAYOFWEEK = MCM_FIRST + 15;

internal enum MCWeekDay : int 
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

internal void MonthCalendarSetFirstDayOfWeek(IntPtr dtpHandle, MCWeekDay weekDay)
{
    IntPtr hWndCal = SendMessage(dtpHandle, DTM_GETMONTHCAL, 0, 0);
    if (hWndCal != IntPtr.Zero) {
        SendMessage(hWndCal, MCM_SETFIRSTDAYOFWEEK, 0, (int)weekDay);
    }
}

private void dateTimePicker1_DropDown(object sender, EventArgs e)
{
    MonthCalendarSetFirstDayOfWeek((sender as Control).Handle, MCWeekDay.Tuesday);
}

VB.Net版本:

Imports System.Runtime.InteropServices

Friend Const DTM_FIRST As Integer = &H1000
Friend Const DTM_GETMONTHCAL As Integer = DTM_FIRST + 8
Friend Const MCM_FIRST As Integer = &H1000
Friend Const MCM_SETFIRSTDAYOFWEEK As Integer = MCM_FIRST + 15

Friend Enum MCWeekDay As Integer
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
End Enum

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
Friend Shared Function SendMessage(hWnd As IntPtr, Msg As Integer, wParam As Integer, lParam As Integer) As IntPtr
End Function

Friend Sub MonthCalendarSetFirstDayOfWeek(dtpHandle As IntPtr, weekDay As MCWeekDay)
    Dim hWndCal As IntPtr = SendMessage(dtpHandle, DTM_GETMONTHCAL, 0, 0)
    If hWndCal <> IntPtr.Zero Then
        SendMessage(hWndCal, MCM_SETFIRSTDAYOFWEEK, 0, weekDay)
    End If
End Sub

Private Sub DateTimePicker1_DropDown(sender As Object, e As EventArgs) Handles DateTimePicker1.DropDown
    MonthCalendarSetFirstDayOfWeek(DirectCast(sender, Control).Handle, MCWeekDay.Tuesday)
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.