Изменить отображение недели в элементе управления DateTimePicker - PullRequest
1 голос
/ 09 мая 2020

Использование традиционного элемента управления DateTimePicker в среде winforms в приложении vb. net или c# Мне нужно изменить способ отображения недели с обычного воскресенья по субботу на вторник по понедельник. Я просмотрел Google и Stack и ничего не нашел по этому поводу. У меня нет проблем с созданием настраиваемого элемента управления. Я просто не знаю, с чего начать.

1 Ответ

2 голосов
/ 09 мая 2020

Вы можете использовать SendMessage , чтобы отправить сообщение MCM_SETFIRSTDAYOFWEEK в MonthCalendar объекта DateTimePicker (прочтите примечания, относящиеся к этому сообщению, в Документах).

Сначала вы отправляете сообщение DTM_GETMONTHCAL, чтобы получить дескриптор элемента управления MonthCalendar. Как показано, вы можете отправить это сообщение в обработчике событий DropDown объекта DateTimePicker.
Если дескриптор действителен, установите первый день отправки MCM_SETFIRSTDAYOFWEEK.
Значение lParam определяет первый показанный день в MonthCalendar:

0 = понедельник, 1 = вторник и c.

Если вы хотите создать собственный элемент управления (предпочтительнее 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
...