Конференция "WinAPI" » MCN_GETDAYS Выделить определенные дни в календаре(MONTHCAL_CLASS)
 
  • 123 (03.04.16 19:44) [0]
    Добрый день.
    Не могу понять как реализовать.
    В справке MSDN написано:


    #define BOLDDAY(ds, iDay) \
            if (iDay > 0 && iDay < 32)(ds) |= (0x00000001 << (iDay - 1))

        case WM_NOTIFY:
                if (((LPNMHDR)lParam)->code == MCN_GETDAYSTATE)
                {
                    MONTHDAYSTATE rgMonths[12] = { 0 }
    ;
                    int cMonths = ((NMDAYSTATE*)lParam)->cDayState;
                    for ( int i = 0; i < cMonths; i++)
                    {
                        BOLDDAY(rgMonths[i], 1);
                        BOLDDAY(rgMonths[i], 15);
                    }

                    ((NMDAYSTATE*)lParam)->prgDayState = rgMonths;
                    return TRUE;
                }
                break ;


    Переделал под Delphi.
    Установил стиль MCS_DAYSTATE.

    Во всех видимых(?) месяцах, должен быть выделено 15 число .Но не работает.


    var
     DayM :  array [0..11] of MONTHDAYSTATE;

    .......

    procedure BoldDays(MonthBoldInfo: LongWord; Days: LongWord);
    begin
       if (Days > 0) and (Days < 32) then
         MonthBoldInfo := ($00000001 shl (Days - 1));
    end;

    case PNMHdr(LParam).code of
                   
                   MCN_GETDAYSTATE:
                     begin  
                       cMonths := pnmdaystate(LParam).cDayState;
                   
                       for I := 0 to cMonths do
                         begin
                           BoldDays(DayM[i], 15);
                         end;
                       pnmdaystate(LParam).prgDayState := @daym;
                     end;


    Как правильно надо сделать?
  • DVM © (04.04.16 10:18) [1]
    (ds) |= (0x00000001 << (iDay - 1))



    и


    > MonthBoldInfo := ($00000001 shl (Days - 1));


    это не одно и то же ведь.
  • 123 (05.04.16 20:36) [2]
    >это не одно и то же ведь.
    Побитовый сдвиг влево a << b на С, в Delphi Shl. вpято с Wiki https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B
  • DVM © (05.04.16 23:13) [3]

    > 123   (05.04.16 20:36) [2]

    вот это |= не эквивалент :=
  • 123 (06.04.16 01:03) [4]
    А как тогда правильно?
  • DVM © (06.04.16 10:41) [5]

    > 123   (06.04.16 01:03) [4]

    По твоей ссылке же написано
    a |= b это a = a | b

    на Delphi будет: a := a or b;
  • 123 (06.04.16 20:57) [6]
    Исправил
    procedure BoldDays(ds, iDay: LongWord);
    begin
     if (iDay > 0) and (iDay < 32) then
       ds := ds or ($00000001 shl (iDay - 1));
    end;


    Но, не хочет выделить жирным дату.
    Что не так?
  • DVM © (07.04.16 08:30) [7]
    Эта процедура не эквивалент сишного кода. Сишный дефайн будет вставлен по месту как есть, твоя же функция не возвращает результатов своей работы вообще никак.
    Первый ее параметр надо передавать по ссылке var ds.
  • 123 (08.04.16 21:14) [8]

    > DVM ©   (07.04.16 08:30) [7]
    > Эта процедура не эквивалент сишного кода. Сишный дефайн
    > будет вставлен по месту как есть, твоя же функция не возвращает
    > результатов своей работы вообще никак.
    > Первый ее параметр надо передавать по ссылке var ds.


    Спасибо Вам ОГРОМНОЕ. Работает.


    var
     DayM :  array [1..12] of MONTHDAYSTATE;
    ......

    procedure BoldDays(var ds: MONTHDAYSTATE; iDay: array of LongWord);
    var
     I : Integer;
    begin
     for I := Low(iDay) to High(iDay) do
       if (iDay[I] > 0) and (iDay[I] < 32) then
         ds := ds or ($00000001 shl (iDay[I] - 1));
    end;

    var
     cMonths  : LongWord;

    WM_NOTIFY:
         begin
           if PNMHdr(LParam).hwndFrom = Calendar then

               begin
                 case PNMHdr(LParam).code of
                   MCN_GETDAYSTATE:
                     begin
                       cMonths := pnmdaystate(LParam).cDayState;
                       for I := 1 to cMonths - 1 do
                         BoldDays(DayM[i], [12 , 15, 16, 17, 18,29, 30, 31]);
                       pnmdaystate(LParam).prgDayState := @daym;
                     end;
                 end;
               end;

         end;



    Может кому пригодится или сделает нормальный вариант.
  • 123 (08.04.16 22:25) [9]
    Ха.
    Попытался сделать выделенные числа для каждого месяца индивидуально(от 1 до 12, т.е. январь = 1, февраль = 2 и т.д.).
    Размеры календаря позволяют просмотреть все 12 месяцев.
    Если смотреть с января, то все нормально.

    Но когда прокручиваешь месяца вперед, получается так === евраль 1, март = 2,
    Если крутить дальше то === Апрель = 1, май 2 и т.д.

    Не могу понять, как узнать индекс первого месяца отображаемого в календаре.
    Чтоб понятнее было , сейчас Апрель(4 месяц), а отображается он первым.
  • 123 (08.04.16 23:13) [10]
    Караул. В delphi 2010 нет большей части сообщений (mcm_) описанных в MSDN.
  • DVM © (09.04.16 09:43) [11]

    > Караул. В delphi 2010 нет большей части сообщений (mcm_)
    > описанных в MSDN.

    Ну так достань из SDK и пропиши в своем файле, в чем проблема.
  • имя (21.04.16 14:38) [12]
    Удалено модератором
 
Конференция "WinAPI" » MCN_GETDAYS Выделить определенные дни в календаре(MONTHCAL_CLASS)
Есть новые Нет новых   [118463   +19][b:0][p:0.003]