Changeset 6709 for trunk/src/comctl32/monthcal.c
- Timestamp:
- Sep 15, 2001, 11:26:26 AM (24 years ago)
- File:
-
- 1 edited
-
trunk/src/comctl32/monthcal.c (modified) (94 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/monthcal.c
r6705 r6709 1 1 /* Month calendar control 2 * 2 3 3 * 4 4 * Copyright 1998, 1999 Eric Kohl (ekohl@abo.rhein-zeitung.de) 5 5 * Copyright 1999 Alex Priem (alexp@sci.kun.nl) 6 6 * Copyright 1999 Chris Morgan <cmorgan@wpi.edu> and 7 * James Abbatiello <abbeyj@wpi.edu>7 * James Abbatiello <abbeyj@wpi.edu> 8 8 * Copyright 2000 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de> 9 9 * … … 13 13 * 14 14 * FIXME: handle resources better (doesn't work now); also take care 15 * of internationalization.15 of internationalization. 16 16 * FIXME: keyboard handling. 17 17 */ … … 43 43 DEFAULT_DEBUG_CHANNEL(monthcal); 44 44 45 #define MC_SEL_LBUTUP 1/* Left button released */46 #define MC_SEL_LBUTDOWN 2/* Left button pressed in calendar */45 #define MC_SEL_LBUTUP 1 /* Left button released */ 46 #define MC_SEL_LBUTDOWN 2 /* Left button pressed in calendar */ 47 47 #define MC_PREVPRESSED 4 /* Prev month button pressed */ 48 48 #define MC_NEXTPRESSED 8 /* Next month button pressed */ 49 #define MC_NEXTMONTHDELAY 350 /* when continuously pressing `next */50 /* month', wait 500 ms before going */51 /* to the next month */52 #define MC_NEXTMONTHTIMER 1 /* Timer ID's */53 #define MC_PREVMONTHTIMER 2 49 #define MC_NEXTMONTHDELAY 350 /* when continuously pressing `next */ 50 /* month', wait 500 ms before going */ 51 /* to the next month */ 52 #define MC_NEXTMONTHTIMER 1 /* Timer ID's */ 53 #define MC_PREVMONTHTIMER 2 54 54 55 55 typedef struct … … 58 58 COMCTL32_HEADER header; 59 59 #endif 60 COLORREF bk;61 COLORREF txt;62 COLORREF titlebk;63 COLORREF titletxt;64 COLORREF monthbk;65 COLORREF trailingtxt;66 HFONT hFont;67 HFONT hBoldFont;68 int textHeight;69 int textWidth;70 int height_increment;71 int width_increment;72 int left_offset;73 int top_offset;74 int firstDayplace; /* place of the first day of the current month */75 int delta;/* scroll rate; # of months that the */60 COLORREF bk; 61 COLORREF txt; 62 COLORREF titlebk; 63 COLORREF titletxt; 64 COLORREF monthbk; 65 COLORREF trailingtxt; 66 HFONT hFont; 67 HFONT hBoldFont; 68 int textHeight; 69 int textWidth; 70 int height_increment; 71 int width_increment; 72 int left_offset; 73 int top_offset; 74 int firstDayplace; /* place of the first day of the current month */ 75 int delta; /* scroll rate; # of months that the */ 76 76 /* control moves when user clicks a scroll button */ 77 int visible;/* # of months visible */78 int firstDay;/* Start month calendar with firstDay's day */79 int monthRange;77 int visible; /* # of months visible */ 78 int firstDay; /* Start month calendar with firstDay's day */ 79 int monthRange; 80 80 MONTHDAYSTATE *monthdayState; 81 SYSTEMTIME todaysDate;82 DWORD currentMonth;83 DWORD currentYear;84 int status;/* See MC_SEL flags */85 int curSelDay;/* current selected day */86 int firstSelDay;/* first selected day */87 int maxSelCount;88 SYSTEMTIME minSel;89 SYSTEMTIME maxSel;90 DWORD rangeValid;91 SYSTEMTIME minDate;92 SYSTEMTIME maxDate;93 94 RECT rcClient; /* rect for whole client area */95 RECT rcDraw; /* rect for drawable portion of client area */96 RECT title; /* rect for the header above the calendar */97 RECT titlebtnnext; /* the `next month' button in the header */98 RECT titlebtnprev; /* the `prev month' button in the header */ 99 RECT titlemonth; /* the `month name' txt in the header */100 RECT titleyear; /* the `year number' txt in the header */101 RECT wdays; /* week days at top */102 RECT days; /* calendar area */103 RECT weeknums; /* week numbers at left side */104 RECT todayrect; /* `today: xx/xx/xx' text rect */81 SYSTEMTIME todaysDate; 82 DWORD currentMonth; 83 DWORD currentYear; 84 int status; /* See MC_SEL flags */ 85 int curSelDay; /* current selected day */ 86 int firstSelDay; /* first selected day */ 87 int maxSelCount; 88 SYSTEMTIME minSel; 89 SYSTEMTIME maxSel; 90 DWORD rangeValid; 91 SYSTEMTIME minDate; 92 SYSTEMTIME maxDate; 93 94 RECT rcClient; /* rect for whole client area */ 95 RECT rcDraw; /* rect for drawable portion of client area */ 96 RECT title; /* rect for the header above the calendar */ 97 RECT titlebtnnext; /* the `next month' button in the header */ 98 RECT titlebtnprev; /* the `prev month' button in the header */ 99 RECT titlemonth; /* the `month name' txt in the header */ 100 RECT titleyear; /* the `year number' txt in the header */ 101 RECT wdays; /* week days at top */ 102 RECT days; /* calendar area */ 103 RECT weeknums; /* week numbers at left side */ 104 RECT todayrect; /* `today: xx/xx/xx' text rect */ 105 105 HWND hWndYearEdit; /* Window Handle of edit box to handle years */ 106 106 HWND hWndYearUpDown;/* Window Handle of updown box to handle years */ … … 141 141 142 142 /* make sure that time is valid */ 143 static int MONTHCAL_ValidateTime(SYSTEMTIME time) 143 static int MONTHCAL_ValidateTime(SYSTEMTIME time) 144 144 { 145 145 if(time.wMonth > 12) return FALSE; 146 146 if(time.wDayOfWeek > 6) return FALSE; 147 147 if(time.wDay > MONTHCAL_MonthLength(time.wMonth, time.wYear)) 148 return FALSE;148 return FALSE; 149 149 if(time.wHour > 23) return FALSE; 150 150 if(time.wMinute > 59) return FALSE; … … 156 156 157 157 158 void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) 158 void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) 159 159 { 160 160 to->wYear = from->wYear; … … 169 169 170 170 171 /* Note:Depending on DST, this may be offset by a day. 171 /* Note:Depending on DST, this may be offset by a day. 172 172 Need to find out if we're on a DST place & adjust the clock accordingly. 173 173 Above function assumes we have a valid data. … … 182 182 year-=(month < 3); 183 183 184 return((year + year/4 - year/100 + year/400 + 184 return((year + year/4 - year/100 + year/400 + 185 185 DayOfWeekTable[month-1] + day - 1 ) % 7); 186 186 } … … 189 189 and day in the calendar. day== 0 mean the last day of tha last month 190 190 */ 191 static int MONTHCAL_CalcDayFromPos(MONTHCAL_INFO *infoPtr, int x, int y, 192 int *daypos,int *weekpos) 191 static int MONTHCAL_CalcDayFromPos(MONTHCAL_INFO *infoPtr, int x, int y, 192 int *daypos,int *weekpos) 193 193 { 194 194 int retval, firstDay; … … 202 202 *daypos = (x - infoPtr->days.left ) / infoPtr->width_increment; 203 203 *weekpos = (y - infoPtr->days.top ) / infoPtr->height_increment; 204 204 205 205 firstDay = (MONTHCAL_CalculateDayOfWeek(1, infoPtr->currentMonth, infoPtr->currentYear)+6 - infoPtr->firstDay)%7; 206 206 retval = *daypos + (7 * *weekpos) - firstDay; … … 211 211 /* sets x and y to be the position of the day */ 212 212 /* x == day, y == week where(0,0) == firstDay, 1st week */ 213 static void MONTHCAL_CalcDayXY(MONTHCAL_INFO *infoPtr, int day, int month, 213 static void MONTHCAL_CalcDayXY(MONTHCAL_INFO *infoPtr, int day, int month, 214 214 int *x, int *y) 215 215 { … … 227 227 if(prevMonth==0) 228 228 prevMonth = 12; 229 229 230 230 *x = (MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear) - firstDay) % 7; 231 231 *y = 0; … … 240 240 241 241 /* x: column(day), y: row(week) */ 242 static void MONTHCAL_CalcDayRect(MONTHCAL_INFO *infoPtr, RECT *r, int x, int y) 242 static void MONTHCAL_CalcDayRect(MONTHCAL_INFO *infoPtr, RECT *r, int x, int y) 243 243 { 244 244 r->left = infoPtr->days.left + x * infoPtr->width_increment; … … 252 252 /* day is the day value of the month(1 == 1st), month is the month */ 253 253 /* value(january == 1, december == 12) */ 254 static inline void MONTHCAL_CalcPosFromDay(MONTHCAL_INFO *infoPtr, 254 static inline void MONTHCAL_CalcPosFromDay(MONTHCAL_INFO *infoPtr, 255 255 int day, int month, RECT *r) 256 256 { … … 278 278 x = day_rect.left; 279 279 y = day_rect.top; 280 280 281 281 points[0].x = x; 282 282 points[0].y = y - 1; … … 287 287 points[3].x = x + infoPtr->width_increment; 288 288 points[3].y = y + 0.5 * infoPtr->height_increment; 289 289 290 290 points[4].x = x + infoPtr->width_increment; 291 291 points[4].y = y + 0.9 * infoPtr->height_increment; … … 294 294 points[6].x = x + 0.5 * infoPtr->width_increment; 295 295 points[6].y = y + 0.9 * infoPtr->height_increment; /* bring the bottom up just 296 a hair to fit inside the day rectangle */297 296 a hair to fit inside the day rectangle */ 297 298 298 points[7].x = x + 0.2 * infoPtr->width_increment; 299 299 points[7].y = y + 0.8 * infoPtr->height_increment; … … 309 309 points[12].x = x + 0.4 * infoPtr->width_increment; 310 310 points[12].y = y + 0.2 * infoPtr->height_increment; 311 311 312 312 PolyBezier(hdc, points, 13); 313 313 DeleteObject(hRedPen); … … 329 329 sprintf(buf, "%d", day); 330 330 331 /* No need to check styles: when selection is not valid, it is set to zero. 331 /* No need to check styles: when selection is not valid, it is set to zero. 332 332 * 1<day<31, so evertyhing's OK. 333 333 */ … … 349 349 350 350 /* FIXME: this may need to be changed now b/c of the other 351 drawing changes 11/3/99 CMM */351 drawing changes 11/3/99 CMM */ 352 352 r2.left = r.left - 0.25 * infoPtr->textWidth; 353 353 r2.top = r.top; … … 390 390 391 391 /* CHECKME: For `todays date', do we need to check the locale?*/ 392 static void MONTHCAL_Refresh(HWND hwnd, HDC hdc, PAINTSTRUCT* ps) 392 static void MONTHCAL_Refresh(HWND hwnd, HDC hdc, PAINTSTRUCT* ps) 393 393 { 394 394 MONTHCAL_INFO *infoPtr=MONTHCAL_GetInfoPtr(hwnd); … … 425 425 hbr = CreateSolidBrush (infoPtr->bk); 426 426 FillRect(hdc, rcClient, hbr); 427 DeleteObject(hbr); 427 DeleteObject(hbr); 428 428 429 429 /* draw header */ … … 434 434 DeleteObject(hbr); 435 435 } 436 436 437 437 /* if the previous button is pressed draw it depressed */ 438 438 if(IntersectRect(&rcTemp, &(ps->rcPaint), prev)) 439 { 439 { 440 440 if((infoPtr->status & MC_PREVPRESSED)) 441 441 DrawFrameControl(hdc, prev, DFC_SCROLL, 442 DFCS_SCROLLLEFT | DFCS_PUSHED |442 DFCS_SCROLLLEFT | DFCS_PUSHED | 443 443 (dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0)); 444 444 else /* if the previous button is pressed draw it depressed */ 445 445 DrawFrameControl(hdc, prev, DFC_SCROLL, 446 DFCS_SCROLLLEFT |(dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0));447 } 448 449 /* if next button is depressed draw it depressed */ 446 DFCS_SCROLLLEFT |(dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0)); 447 } 448 449 /* if next button is depressed draw it depressed */ 450 450 if(IntersectRect(&rcTemp, &(ps->rcPaint), next)) 451 451 { 452 452 if((infoPtr->status & MC_NEXTPRESSED)) 453 453 DrawFrameControl(hdc, next, DFC_SCROLL, 454 DFCS_SCROLLRIGHT | DFCS_PUSHED |454 DFCS_SCROLLRIGHT | DFCS_PUSHED | 455 455 (dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0)); 456 456 else /* if the next button is pressed draw it depressed */ … … 466 466 titlemonth->left = title->left; 467 467 titlemonth->right = title->right; 468 468 469 469 GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+infoPtr->currentMonth -1, 470 buf1,sizeof(buf1));470 buf1,sizeof(buf1)); 471 471 sprintf(buf, "%s %ld", buf1, infoPtr->currentYear); 472 472 473 473 if(IntersectRect(&rcTemp, &(ps->rcPaint), titlemonth)) 474 474 { 475 DrawTextA(hdc, buf, strlen(buf), titlemonth, 475 DrawTextA(hdc, buf, strlen(buf), titlemonth, 476 476 DT_CENTER | DT_VCENTER | DT_SINGLELINE); 477 477 } … … 481 481 /* titlemonth left/right contained rect for whole titletxt('June 1999') 482 482 * MCM_HitTestInfo wants month & year rects, so prepare these now. 483 *(no, we can't draw them separately; the whole text is centered) 483 *(no, we can't draw them separately; the whole text is centered) 484 484 */ 485 485 GetTextExtentPoint32A(hdc, buf, strlen(buf), &size); … … 489 489 titlemonth->right = titlemonth->left + size.cx; 490 490 titleyear->left = titlemonth->right; 491 491 492 492 /* draw month area */ 493 493 rcTemp.top=infoPtr->wdays.top; … … 501 501 DeleteObject(hbr); 502 502 } 503 503 504 504 /* draw line under day abbreviatons */ 505 505 506 506 MoveToEx(hdc, infoPtr->days.left + 3, title->bottom + textHeight + 1, NULL); 507 507 508 508 LineTo(hdc, rcDraw->right - 3, title->bottom + textHeight + 1); 509 509 510 510 prevMonth = infoPtr->currentMonth - 1; 511 511 if(prevMonth == 0) /* if currentMonth is january(1) prevMonth is */ … … 529 529 for(j=0; j<7; j++) { 530 530 GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SABBREVDAYNAME1 + (i +j)%7, 531 buf,sizeof(buf));531 buf,sizeof(buf)); 532 532 DrawTextA(hdc, buf, strlen(buf), days, 533 533 DT_CENTER | DT_VCENTER | DT_SINGLELINE ); … … 537 537 538 538 /* draw day numbers; first, the previous month */ 539 539 540 540 firstDay = MONTHCAL_CalculateDayOfWeek(1, infoPtr->currentMonth, infoPtr->currentYear); 541 542 day = MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear) + 541 542 day = MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear) + 543 543 (infoPtr->firstDay + 7 - firstDay)%7 + 1; 544 544 if (day > MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear)) … … 553 553 if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay)) 554 554 { 555 MONTHCAL_DrawDay(hdc, infoPtr, day, prevMonth, i, 0, 555 MONTHCAL_DrawDay(hdc, infoPtr, day, prevMonth, i, 0, 556 556 infoPtr->monthdayState[m] & mask); 557 557 } … … 577 577 { 578 578 579 MONTHCAL_DrawDay(hdc, infoPtr, day, infoPtr->currentMonth, i, 0, 580 infoPtr->monthdayState[m] & mask);579 MONTHCAL_DrawDay(hdc, infoPtr, day, infoPtr->currentMonth, i, 0, 580 infoPtr->monthdayState[m] & mask); 581 581 582 582 if((infoPtr->currentMonth==infoPtr->todaysDate.wMonth) && 583 583 (day==infoPtr->todaysDate.wDay) && 584 (infoPtr->currentYear == infoPtr->todaysDate.wYear)) {584 (infoPtr->currentYear == infoPtr->todaysDate.wYear)) { 585 585 if(!(dwStyle & MCS_NOTODAYCIRCLE)) 586 MONTHCAL_CircleDay(hdc, infoPtr, day, infoPtr->currentMonth);586 MONTHCAL_CircleDay(hdc, infoPtr, day, infoPtr->currentMonth); 587 587 } 588 588 } … … 595 595 j = 1; /* move to the 2nd week of the current month */ 596 596 i = 0; /* move back to sunday */ 597 while(day <= MONTHCAL_MonthLength(infoPtr->currentMonth, infoPtr->currentYear)) { 597 while(day <= MONTHCAL_MonthLength(infoPtr->currentMonth, infoPtr->currentYear)) { 598 598 MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, j); 599 599 if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay)) … … 604 604 if((infoPtr->currentMonth==infoPtr->todaysDate.wMonth) && 605 605 (day==infoPtr->todaysDate.wDay) && 606 (infoPtr->currentYear == infoPtr->todaysDate.wYear)) 607 if(!(dwStyle & MCS_NOTODAYCIRCLE)) 608 MONTHCAL_CircleDay(hdc, infoPtr, day, infoPtr->currentMonth);606 (infoPtr->currentYear == infoPtr->todaysDate.wYear)) 607 if(!(dwStyle & MCS_NOTODAYCIRCLE)) 608 MONTHCAL_CircleDay(hdc, infoPtr, day, infoPtr->currentMonth); 609 609 } 610 610 mask<<=1; … … 627 627 MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, j); 628 628 if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay)) 629 { 629 { 630 630 MONTHCAL_DrawDay(hdc, infoPtr, day, infoPtr->currentMonth + 1, i, j, 631 infoPtr->monthdayState[m] & mask);631 infoPtr->monthdayState[m] & mask); 632 632 } 633 633 634 634 mask<<=1; 635 635 day++; 636 i++; 636 i++; 637 637 if(i==7) { /* past saturday, go to next week's sunday */ 638 638 i = 0; … … 650 650 if(!(dwStyle & MCS_NOTODAYCIRCLE)) { 651 651 /*day is the number of days from nextmonth we put on the calendar */ 652 MONTHCAL_CircleDay(hdc, infoPtr, 653 day+MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear), 654 infoPtr->currentMonth);652 MONTHCAL_CircleDay(hdc, infoPtr, 653 day+MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear), 654 infoPtr->currentMonth); 655 655 offset+=textWidth; 656 656 } 657 657 if (!LoadStringA(COMCTL32_hModule,IDM_TODAY,buf1,sizeof(buf1))) 658 658 { 659 WARN("Can't load resource\n");660 strcpy(buf1,"Today:");659 WARN("Can't load resource\n"); 660 strcpy(buf1,"Today:"); 661 661 } 662 662 MONTHCAL_CalcDayRect(infoPtr, &rtoday, 1, 6); … … 674 674 } 675 675 676 /*eventually draw week numbers*/ 676 /*eventually draw week numbers*/ 677 677 if(dwStyle & MCS_WEEKNUMBERS) { 678 678 /* display weeknumbers*/ … … 682 682 LOCALE_IFIRSTWEEKOFYEAR == 0 (e.g US?): 683 683 The week containing Jan 1 is the first week of year 684 LOCALE_IFIRSTWEEKOFYEAR == 2 (e.g. Germany): 684 LOCALE_IFIRSTWEEKOFYEAR == 2 (e.g. Germany): 685 685 First week of year must contain 4 days of the new year 686 686 LOCALE_IFIRSTWEEKOFYEAR == 1 (what contries?) … … 688 688 */ 689 689 GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR, 690 buf, sizeof(buf));690 buf, sizeof(buf)); 691 691 sscanf(buf, "%d", &weeknum); 692 692 switch (weeknum) 693 693 { 694 694 case 1: mindays = 6; 695 break;695 break; 696 696 case 2: mindays = 3; 697 break;697 break; 698 698 case 0: 699 699 default: 700 mindays = 0;700 mindays = 0; 701 701 } 702 702 if (infoPtr->currentMonth < 2) 703 703 { 704 /* calculate all those exceptions for january */705 weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear);706 if ((infoPtr->firstDay +7 - weeknum1)%7 > mindays) 707 weeknum =1;708 else709 {710 weeknum = 0;711 for(i=0; i<11; i++) 712 weeknum+=MONTHCAL_MonthLength(i+1, infoPtr->currentYear-1);713 weeknum +=startofprescal+ 7;714 weeknum /=7;715 weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear-1);716 if ((infoPtr->firstDay + 7 - weeknum1)%7 > mindays)717 weeknum++;718 }704 /* calculate all those exceptions for january */ 705 weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear); 706 if ((infoPtr->firstDay +7 - weeknum1)%7 > mindays) 707 weeknum =1; 708 else 709 { 710 weeknum = 0; 711 for(i=0; i<11; i++) 712 weeknum+=MONTHCAL_MonthLength(i+1, infoPtr->currentYear-1); 713 weeknum +=startofprescal+ 7; 714 weeknum /=7; 715 weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear-1); 716 if ((infoPtr->firstDay + 7 - weeknum1)%7 > mindays) 717 weeknum++; 718 } 719 719 } 720 720 else 721 721 { 722 weeknum = 0;723 for(i=0; i<prevMonth-1; i++) 724 weeknum+=MONTHCAL_MonthLength(i+1, infoPtr->currentYear);725 weeknum +=startofprescal+ 7;726 weeknum /=7;727 weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear);728 if ((infoPtr->firstDay + 7 - weeknum1)%7 > mindays)729 weeknum++;722 weeknum = 0; 723 for(i=0; i<prevMonth-1; i++) 724 weeknum+=MONTHCAL_MonthLength(i+1, infoPtr->currentYear); 725 weeknum +=startofprescal+ 7; 726 weeknum /=7; 727 weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear); 728 if ((infoPtr->firstDay + 7 - weeknum1)%7 > mindays) 729 weeknum++; 730 730 } 731 731 days->left = infoPtr->weeknums.left; … … 735 735 for(i=0; i<6; i++) { 736 736 if((i==0)&&(weeknum>50)) 737 {738 sprintf(buf, "%d", weeknum);739 weeknum=0;740 }737 { 738 sprintf(buf, "%d", weeknum); 739 weeknum=0; 740 } 741 741 else if((i==5)&&(weeknum>47)) 742 {743 sprintf(buf, "%d", 1);744 }742 { 743 sprintf(buf, "%d", 1); 744 } 745 745 else 746 sprintf(buf, "%d", weeknum + i);746 sprintf(buf, "%d", weeknum + i); 747 747 DrawTextA(hdc, buf, -1, days, DT_CENTER | DT_VCENTER | DT_SINGLELINE ); 748 748 days->top+=infoPtr->height_increment; 749 749 days->bottom+=infoPtr->height_increment; 750 750 } 751 751 752 752 MoveToEx(hdc, infoPtr->weeknums.right, infoPtr->weeknums.top + 3 , NULL); 753 753 LineTo(hdc, infoPtr->weeknums.right, infoPtr->weeknums.bottom ); 754 754 755 755 } 756 756 /* currentFont was font at entering Refresh */ 757 757 758 758 SetBkColor(hdc, oldBkColor); 759 SelectObject(hdc, currentFont); 759 SelectObject(hdc, currentFont); 760 760 SetTextColor(hdc, oldTextColor); 761 761 } 762 762 763 763 764 static LRESULT 764 static LRESULT 765 765 MONTHCAL_GetMinReqRect(HWND hwnd, WPARAM wParam, LPARAM lParam) 766 766 { … … 768 768 LPRECT lpRect = (LPRECT) lParam; 769 769 TRACE("%x %lx\n", wParam, lParam); 770 770 771 771 /* validate parameters */ 772 772 … … 781 781 782 782 783 static LRESULT 783 static LRESULT 784 784 MONTHCAL_GetColor(HWND hwnd, WPARAM wParam, LPARAM lParam) 785 785 { … … 807 807 808 808 809 static LRESULT 809 static LRESULT 810 810 MONTHCAL_SetColor(HWND hwnd, WPARAM wParam, LPARAM lParam) 811 811 { … … 847 847 848 848 849 static LRESULT 849 static LRESULT 850 850 MONTHCAL_GetMonthDelta(HWND hwnd, WPARAM wParam, LPARAM lParam) 851 851 { … … 853 853 854 854 TRACE("%x %lx\n", wParam, lParam); 855 855 856 856 if(infoPtr->delta) 857 857 return infoPtr->delta; … … 861 861 862 862 863 static LRESULT 863 static LRESULT 864 864 MONTHCAL_SetMonthDelta(HWND hwnd, WPARAM wParam, LPARAM lParam) 865 865 { … … 868 868 869 869 TRACE("%x %lx\n", wParam, lParam); 870 870 871 871 infoPtr->delta = (int)wParam; 872 872 return prev; … … 874 874 875 875 876 static LRESULT 876 static LRESULT 877 877 MONTHCAL_GetFirstDayOfWeek(HWND hwnd, WPARAM wParam, LPARAM lParam) 878 878 { 879 879 MONTHCAL_INFO *infoPtr = MONTHCAL_GetInfoPtr(hwnd); 880 880 881 881 return infoPtr->firstDay; 882 882 } … … 887 887 /* FIXME: this needs to be implemented properly in MONTHCAL_Refresh() */ 888 888 /* FIXME: we need more error checking here */ 889 static LRESULT 889 static LRESULT 890 890 MONTHCAL_SetFirstDayOfWeek(HWND hwnd, WPARAM wParam, LPARAM lParam) 891 891 { … … 903 903 { 904 904 GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, 905 buf, sizeof(buf));905 buf, sizeof(buf)); 906 906 TRACE("%s %d\n", buf, strlen(buf)); 907 907 if(sscanf(buf, "%d", &day) == 1) 908 infoPtr->firstDay = day;908 infoPtr->firstDay = day; 909 909 else 910 infoPtr->firstDay = 0;910 infoPtr->firstDay = 0; 911 911 } 912 912 return prev; … … 916 916 /* FIXME: fill this in */ 917 917 static LRESULT 918 MONTHCAL_GetMonthRange(HWND hwnd, WPARAM wParam, LPARAM lParam) 918 MONTHCAL_GetMonthRange(HWND hwnd, WPARAM wParam, LPARAM lParam) 919 919 { 920 920 MONTHCAL_INFO *infoPtr = MONTHCAL_GetInfoPtr(hwnd); … … 937 937 938 938 /* FIXME: are validated times taken from current date/time or simply 939 * copied? 939 * copied? 940 940 * FIXME: check whether MCM_GETMONTHRANGE shows correct result after 941 941 * adjusting range with MCM_SETRANGE … … 950 950 951 951 TRACE("%x %lx\n", wParam, lParam); 952 952 953 953 if(wParam & GDTR_MAX) { 954 954 if(MONTHCAL_ValidateTime(lprgSysTimeArray[1])){ … … 973 973 infoPtr->monthRange = infoPtr->maxDate.wMonth - infoPtr->minDate.wMonth; 974 974 975 if(infoPtr->monthRange!=prev) { 976 COMCTL32_ReAlloc(infoPtr->monthdayState, 977 infoPtr->monthRange * sizeof(MONTHDAYSTATE));975 if(infoPtr->monthRange!=prev) { 976 COMCTL32_ReAlloc(infoPtr->monthdayState, 977 infoPtr->monthRange * sizeof(MONTHDAYSTATE)); 978 978 } 979 979 … … 983 983 984 984 /* CHECKME: At the moment, we copy ranges anyway,regardless of 985 * infoPtr->rangeValid; a invalid range is simply filled with zeros in 985 * infoPtr->rangeValid; a invalid range is simply filled with zeros in 986 986 * SetRange. Is this the right behavior? 987 987 */ … … 1015 1015 if(iMonths!=infoPtr->monthRange) return 0; 1016 1016 1017 for(i=0; i<iMonths; i++) 1017 for(i=0; i<iMonths; i++) 1018 1018 infoPtr->monthdayState[i] = dayStates[i]; 1019 1019 return 1; 1020 1020 } 1021 1021 1022 static LRESULT 1022 static LRESULT 1023 1023 MONTHCAL_GetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam) 1024 1024 { … … 1036 1036 /* FIXME: if the specified date is not visible, make it visible */ 1037 1037 /* FIXME: redraw? */ 1038 static LRESULT 1038 static LRESULT 1039 1039 MONTHCAL_SetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam) 1040 1040 { … … 1057 1057 1058 1058 1059 static LRESULT 1059 static LRESULT 1060 1060 MONTHCAL_GetMaxSelCount(HWND hwnd, WPARAM wParam, LPARAM lParam) 1061 1061 { … … 1067 1067 1068 1068 1069 static LRESULT 1069 static LRESULT 1070 1070 MONTHCAL_SetMaxSelCount(HWND hwnd, WPARAM wParam, LPARAM lParam) 1071 1071 { … … 1081 1081 1082 1082 1083 static LRESULT 1083 static LRESULT 1084 1084 MONTHCAL_GetSelRange(HWND hwnd, WPARAM wParam, LPARAM lParam) 1085 1085 { … … 1100 1100 return TRUE; 1101 1101 } 1102 1102 1103 1103 return FALSE; 1104 1104 } 1105 1105 1106 1106 1107 static LRESULT 1107 static LRESULT 1108 1108 MONTHCAL_SetSelRange(HWND hwnd, WPARAM wParam, LPARAM lParam) 1109 1109 { … … 1124 1124 return TRUE; 1125 1125 } 1126 1126 1127 1127 return FALSE; 1128 1128 } 1129 1129 1130 1130 1131 static LRESULT 1131 static LRESULT 1132 1132 MONTHCAL_GetToday(HWND hwnd, WPARAM wParam, LPARAM lParam) 1133 1133 { … … 1145 1145 1146 1146 1147 static LRESULT 1147 static LRESULT 1148 1148 MONTHCAL_SetToday(HWND hwnd, WPARAM wParam, LPARAM lParam) 1149 1149 { … … 1170 1170 DWORD retval; 1171 1171 int day,wday,wnum; 1172 1173 1172 1173 1174 1174 x = lpht->pt.x; 1175 1175 y = lpht->pt.y; 1176 1176 retval = MCHT_NOWHERE; 1177 1178 1179 /* Comment in for debugging... 1180 TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y, 1181 infoPtr->wdays.left, infoPtr->wdays.right,1182 infoPtr->wdays.top, infoPtr->wdays.bottom,1183 infoPtr->days.left, infoPtr->days.right,1184 infoPtr->days.top, infoPtr->days.bottom,1185 infoPtr->todayrect.left, infoPtr->todayrect.right,1186 infoPtr->todayrect.top, infoPtr->todayrect.bottom,1187 infoPtr->weeknums.left, infoPtr->weeknums.right,1188 infoPtr->weeknums.top, infoPtr->weeknums.bottom);1177 1178 1179 /* Comment in for debugging... 1180 TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y, 1181 infoPtr->wdays.left, infoPtr->wdays.right, 1182 infoPtr->wdays.top, infoPtr->wdays.bottom, 1183 infoPtr->days.left, infoPtr->days.right, 1184 infoPtr->days.top, infoPtr->days.bottom, 1185 infoPtr->todayrect.left, infoPtr->todayrect.right, 1186 infoPtr->todayrect.top, infoPtr->todayrect.bottom, 1187 infoPtr->weeknums.left, infoPtr->weeknums.right, 1188 infoPtr->weeknums.top, infoPtr->weeknums.bottom); 1189 1189 */ 1190 1190 1191 1191 /* are we in the header? */ 1192 1192 1193 1193 if(PtInRect(&infoPtr->title, lpht->pt)) { 1194 1194 if(PtInRect(&infoPtr->titlebtnprev, lpht->pt)) { … … 1208 1208 goto done; 1209 1209 } 1210 1210 1211 1211 retval = MCHT_TITLE; 1212 1212 goto done; 1213 1213 } 1214 1214 1215 1215 day = MONTHCAL_CalcDayFromPos(infoPtr,x,y,&wday,&wnum); 1216 1216 if(PtInRect(&infoPtr->wdays, lpht->pt)) { … … 1218 1218 lpht->st.wYear = infoPtr->currentYear; 1219 1219 lpht->st.wMonth = (day < 1)? infoPtr->currentMonth -1 : infoPtr->currentMonth; 1220 lpht->st.wDay = (day < 1)? 1220 lpht->st.wDay = (day < 1)? 1221 1221 MONTHCAL_MonthLength(infoPtr->currentMonth-1,infoPtr->currentYear) -day : day; 1222 1222 goto done; 1223 1223 } 1224 if(PtInRect(&infoPtr->weeknums, lpht->pt)) { 1225 retval = MCHT_CALENDARWEEKNUM; 1224 if(PtInRect(&infoPtr->weeknums, lpht->pt)) { 1225 retval = MCHT_CALENDARWEEKNUM; 1226 1226 lpht->st.wYear = infoPtr->currentYear; 1227 lpht->st.wMonth = (day < 1) ? infoPtr->currentMonth -1 : 1228 (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) ? 1227 lpht->st.wMonth = (day < 1) ? infoPtr->currentMonth -1 : 1228 (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) ? 1229 1229 infoPtr->currentMonth +1 :infoPtr->currentMonth; 1230 lpht->st.wDay = (day < 1 ) ? 1231 MONTHCAL_MonthLength(infoPtr->currentMonth-1,infoPtr->currentYear) -day : 1232 (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) ? 1230 lpht->st.wDay = (day < 1 ) ? 1231 MONTHCAL_MonthLength(infoPtr->currentMonth-1,infoPtr->currentYear) -day : 1232 (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) ? 1233 1233 day - MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear) : day; 1234 goto done; 1235 } 1236 if(PtInRect(&infoPtr->days, lpht->pt)) 1234 goto done; 1235 } 1236 if(PtInRect(&infoPtr->days, lpht->pt)) 1237 1237 { 1238 1238 lpht->st.wYear = infoPtr->currentYear; 1239 if ( day < 1) 1240 {1241 retval = MCHT_CALENDARDATEPREV;1242 lpht->st.wMonth = infoPtr->currentMonth - 1;1243 if (lpht->st.wMonth <1)1244 {1245 lpht->st.wMonth = 12;1246 lpht->st.wYear--;1247 }1248 lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth,lpht->st.wYear) -day;1249 }1239 if ( day < 1) 1240 { 1241 retval = MCHT_CALENDARDATEPREV; 1242 lpht->st.wMonth = infoPtr->currentMonth - 1; 1243 if (lpht->st.wMonth <1) 1244 { 1245 lpht->st.wMonth = 12; 1246 lpht->st.wYear--; 1247 } 1248 lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth,lpht->st.wYear) -day; 1249 } 1250 1250 else if (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) 1251 {1252 retval = MCHT_CALENDARDATENEXT;1253 lpht->st.wMonth = infoPtr->currentMonth + 1;1254 if (lpht->st.wMonth <12)1255 {1256 lpht->st.wMonth = 1;1257 lpht->st.wYear++;1258 }1259 lpht->st.wDay = day - MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear) ;1260 }1251 { 1252 retval = MCHT_CALENDARDATENEXT; 1253 lpht->st.wMonth = infoPtr->currentMonth + 1; 1254 if (lpht->st.wMonth <12) 1255 { 1256 lpht->st.wMonth = 1; 1257 lpht->st.wYear++; 1258 } 1259 lpht->st.wDay = day - MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear) ; 1260 } 1261 1261 else { 1262 retval = MCHT_CALENDARDATE;1263 lpht->st.wMonth = infoPtr->currentMonth;1264 lpht->st.wDay = day;1262 retval = MCHT_CALENDARDATE; 1263 lpht->st.wMonth = infoPtr->currentMonth; 1264 lpht->st.wDay = day; 1265 1265 } 1266 1266 goto done; 1267 1267 } 1268 1268 if(PtInRect(&infoPtr->todayrect, lpht->pt)) { 1269 retval = MCHT_TODAYLINK; 1269 retval = MCHT_TODAYLINK; 1270 1270 goto done; 1271 1271 } 1272 1273 1272 1273 1274 1274 /* Hit nothing special? What's left must be background :-) */ 1275 1276 retval = MCHT_CALENDARBK; 1277 done: 1275 1276 retval = MCHT_CALENDARBK; 1277 done: 1278 1278 lpht->uHit = retval; 1279 1279 return retval; … … 1300 1300 nmds.nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID); 1301 1301 nmds.nmhdr.code = MCN_GETDAYSTATE; 1302 nmds.cDayState = infoPtr->monthRange;1303 nmds.prgDayState = COMCTL32_Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));1302 nmds.cDayState = infoPtr->monthRange; 1303 nmds.prgDayState = COMCTL32_Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE)); 1304 1304 1305 1305 SendMessageA(GetParent(hwnd), WM_NOTIFY, … … 1330 1330 nmds.nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID); 1331 1331 nmds.nmhdr.code = MCN_GETDAYSTATE; 1332 nmds.cDayState = infoPtr->monthRange;1333 nmds.prgDayState = COMCTL32_Alloc1332 nmds.cDayState = infoPtr->monthRange; 1333 nmds.prgDayState = COMCTL32_Alloc 1334 1334 (infoPtr->monthRange * sizeof(MONTHDAYSTATE)); 1335 1335 … … 1348 1348 POINT menupoint; 1349 1349 char buf[32]; 1350 1350 1351 1351 hMenu = CreatePopupMenu(); 1352 1352 if (!LoadStringA(COMCTL32_hModule,IDM_GOTODAY,buf,sizeof(buf))) … … 1360 1360 ClientToScreen(hwnd, &menupoint); 1361 1361 if( TrackPopupMenu(hMenu,TPM_RIGHTBUTTON| TPM_NONOTIFY|TPM_RETURNCMD, 1362 menupoint.x,menupoint.y,0,hwnd,NULL))1362 menupoint.x,menupoint.y,0,hwnd,NULL)) 1363 1363 { 1364 1364 infoPtr->currentMonth=infoPtr->todaysDate.wMonth; 1365 1365 infoPtr->currentYear=infoPtr->todaysDate.wYear; 1366 1366 InvalidateRect(hwnd, NULL, FALSE); 1367 } 1367 } 1368 1368 return 0; 1369 1369 } … … 1381 1381 POINT menupoint; 1382 1382 TRACE("%x %lx\n", wParam, lParam); 1383 1383 1384 1384 if (infoPtr->hWndYearUpDown) 1385 1385 { 1386 1386 infoPtr->currentYear=SendMessageA( infoPtr->hWndYearUpDown, UDM_SETPOS, (WPARAM) 0,(LPARAM)0); 1387 1387 if(!DestroyWindow(infoPtr->hWndYearUpDown)) 1388 {1389 FIXME("Can't destroy Updown Control\n");1390 }1388 { 1389 FIXME("Can't destroy Updown Control\n"); 1390 } 1391 1391 else 1392 infoPtr->hWndYearUpDown=0;1392 infoPtr->hWndYearUpDown=0; 1393 1393 if(!DestroyWindow(infoPtr->hWndYearEdit)) 1394 {1395 FIXME("Can't destroy Updown Control\n");1396 }1394 { 1395 FIXME("Can't destroy Updown Control\n"); 1396 } 1397 1397 else 1398 infoPtr->hWndYearEdit=0;1398 infoPtr->hWndYearEdit=0; 1399 1399 InvalidateRect(hwnd, NULL, FALSE); 1400 1400 } 1401 1401 1402 1402 ht.pt.x = (INT)LOWORD(lParam); 1403 1403 ht.pt.y = (INT)HIWORD(lParam); … … 1414 1414 return TRUE; 1415 1415 } 1416 if(hit == MCHT_TITLEBTNPREV){ 1416 if(hit == MCHT_TITLEBTNPREV){ 1417 1417 MONTHCAL_GoToPrevMonth(hwnd, infoPtr); 1418 1418 infoPtr->status = MC_PREVPRESSED; … … 1424 1424 if(hit == MCHT_TITLEMONTH) { 1425 1425 hMenu = CreatePopupMenu(); 1426 1426 1427 1427 for (i=0; i<12;i++) 1428 1428 { 1429 GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+i,1430 buf,sizeof(buf));1431 AppendMenuA(hMenu, MF_STRING|MF_ENABLED,i+1, buf);1429 GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+i, 1430 buf,sizeof(buf)); 1431 AppendMenuA(hMenu, MF_STRING|MF_ENABLED,i+1, buf); 1432 1432 } 1433 1433 menupoint.x=infoPtr->titlemonth.right; … … 1435 1435 ClientToScreen(hwnd, &menupoint); 1436 1436 i= TrackPopupMenu(hMenu,TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON | TPM_RETURNCMD, 1437 menupoint.x,menupoint.y,0,hwnd,NULL);1437 menupoint.x,menupoint.y,0,hwnd,NULL); 1438 1438 if ((i>0) && (i<13)) 1439 1439 { 1440 infoPtr->currentMonth=i;1441 InvalidateRect(hwnd, NULL, FALSE);1440 infoPtr->currentMonth=i; 1441 InvalidateRect(hwnd, NULL, FALSE); 1442 1442 } 1443 1443 } 1444 1444 if(hit == MCHT_TITLEYEAR) { 1445 1445 infoPtr->hWndYearEdit=CreateWindowExA(0, 1446 "EDIT",1447 0,1448 WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT,1449 infoPtr->titleyear.left+3,infoPtr->titlebtnnext.top,1450 infoPtr->titleyear.right-infoPtr->titleyear.left,1451 infoPtr->textHeight,1452 hwnd,1453 (HMENU)NULL, 1454 (HINSTANCE)NULL, 1455 NULL);1446 "EDIT", 1447 0, 1448 WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT, 1449 infoPtr->titleyear.left+3,infoPtr->titlebtnnext.top, 1450 infoPtr->titleyear.right-infoPtr->titleyear.left, 1451 infoPtr->textHeight, 1452 hwnd, 1453 (HMENU)NULL, 1454 (HINSTANCE)NULL, 1455 NULL); 1456 1456 infoPtr->hWndYearUpDown=CreateWindowExA(0, 1457 UPDOWN_CLASSA,1458 0,1459 WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT|UDS_NOTHOUSANDS|UDS_ARROWKEYS,1460 infoPtr->titleyear.right+6,infoPtr->titlebtnnext.top,1461 20,1462 infoPtr->textHeight,1463 hwnd,1464 (HMENU)NULL, 1465 (HINSTANCE)NULL, 1466 NULL);1457 UPDOWN_CLASSA, 1458 0, 1459 WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT|UDS_NOTHOUSANDS|UDS_ARROWKEYS, 1460 infoPtr->titleyear.right+6,infoPtr->titlebtnnext.top, 1461 20, 1462 infoPtr->textHeight, 1463 hwnd, 1464 (HMENU)NULL, 1465 (HINSTANCE)NULL, 1466 NULL); 1467 1467 SendMessageA( infoPtr->hWndYearUpDown, UDM_SETRANGE, (WPARAM) 0, MAKELONG (9999, 1753)); 1468 1468 SendMessageA( infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM) infoPtr->hWndYearEdit, (LPARAM)0 ); 1469 1469 SendMessageA( infoPtr->hWndYearUpDown, UDM_SETPOS, (WPARAM) 0,(LPARAM)infoPtr->currentYear ); 1470 1470 return TRUE; 1471 1471 1472 1472 } 1473 1473 if(hit == MCHT_TODAYLINK) { … … 1487 1487 MONTHCAL_CopyTime(&nmsc.stSelStart, &infoPtr->minSel); 1488 1488 MONTHCAL_CopyTime(&nmsc.stSelEnd, &infoPtr->maxSel); 1489 1489 1490 1490 SendMessageA(GetParent(hwnd), WM_NOTIFY, 1491 1491 (WPARAM)nmsc.nmhdr.idFrom,(LPARAM)&nmsc); … … 1493 1493 MONTHCAL_CopyTime(&ht.st, &selArray[0]); 1494 1494 MONTHCAL_CopyTime(&ht.st, &selArray[1]); 1495 MONTHCAL_SetSelRange(hwnd,0,(LPARAM) &selArray); 1495 MONTHCAL_SetSelRange(hwnd,0,(LPARAM) &selArray); 1496 1496 1497 1497 /* redraw both old and new days if the selected day changed */ … … 1546 1546 return TRUE; 1547 1547 } 1548 if(hit == MCHT_CALENDARDATEPREV){ 1548 if(hit == MCHT_CALENDARDATEPREV){ 1549 1549 MONTHCAL_GoToPrevMonth(hwnd, infoPtr); 1550 1550 InvalidateRect(hwnd, NULL, FALSE); … … 1564 1564 MONTHCAL_CopyTime(&nmsc.stSelStart, &infoPtr->minSel); 1565 1565 MONTHCAL_CopyTime(&nmsc.stSelEnd, &infoPtr->maxSel); 1566 1566 1567 1567 SendMessageA(GetParent(hwnd), WM_NOTIFY, 1568 1568 (WPARAM)nmsc.nmhdr.idFrom, (LPARAM)&nmsc); 1569 1569 1570 1570 /* redraw if necessary */ 1571 1571 if(redraw) 1572 1572 InvalidateRect(hwnd, NULL, FALSE); 1573 1573 1574 1574 return 0; 1575 1575 } … … 1586 1586 1587 1587 switch(wParam) { 1588 case MC_NEXTMONTHTIMER: 1588 case MC_NEXTMONTHTIMER: 1589 1589 redraw = TRUE; 1590 1590 MONTHCAL_GoToNextMonth(hwnd, infoPtr); … … 1618 1618 ht.pt.x = LOWORD(lParam); 1619 1619 ht.pt.y = HIWORD(lParam); 1620 1620 1621 1621 hit = MONTHCAL_HitTest(hwnd, (LPARAM)&ht); 1622 1622 1623 1623 /* not on the calendar date numbers? bail out */ 1624 1624 TRACE("hit:%x\n",hit); … … 1638 1638 if(infoPtr->firstSelDay==selArray[0].wDay) i=1; 1639 1639 TRACE("oldRange:%d %d %d %d\n", infoPtr->firstSelDay, selArray[0].wDay, selArray[1].wDay, i); 1640 if(infoPtr->firstSelDay==selArray[1].wDay) { 1640 if(infoPtr->firstSelDay==selArray[1].wDay) { 1641 1641 /* 1st time we get here: selArray[0]=selArray[1]) */ 1642 1642 /* if we're still at the first selected date, return */ … … 1644 1644 if(selday<infoPtr->firstSelDay) i = 0; 1645 1645 } 1646 1646 1647 1647 if(abs(infoPtr->firstSelDay - selday) >= infoPtr->maxSelCount) { 1648 1648 if(selday>infoPtr->firstSelDay) … … 1651 1651 selday = infoPtr->firstSelDay - infoPtr->maxSelCount; 1652 1652 } 1653 1653 1654 1654 if(selArray[i].wDay!=selday) { 1655 1655 TRACE("newRange:%d %d %d %d\n", infoPtr->firstSelDay, selArray[0].wDay, selArray[1].wDay, i); 1656 1656 1657 1657 selArray[i].wDay = selday; 1658 1658 … … 1712 1712 { 1713 1713 TRACE("\n"); 1714 1714 1715 1715 InvalidateRect(hwnd, NULL, FALSE); 1716 1716 … … 1769 1769 1770 1770 /* recalculate the height and width increments and offsets */ 1771 /* FIXME: We use up all available width. This will inhibit having multiple 1772 calendars in a row, like win doesn 1771 /* FIXME: We use up all available width. This will inhibit having multiple 1772 calendars in a row, like win doesn 1773 1773 */ 1774 1774 if(dwStyle & MCS_WEEKNUMBERS) … … 1776 1776 else 1777 1777 xdiv=7.0; 1778 infoPtr->width_increment = (infoPtr->rcDraw.right - infoPtr->rcDraw.left) / xdiv; 1779 infoPtr->height_increment = (infoPtr->rcDraw.bottom - infoPtr->rcDraw.top) / 10.0; 1778 infoPtr->width_increment = (infoPtr->rcDraw.right - infoPtr->rcDraw.left) / xdiv; 1779 infoPtr->height_increment = (infoPtr->rcDraw.bottom - infoPtr->rcDraw.top) / 10.0; 1780 1780 infoPtr->left_offset = (infoPtr->rcDraw.right - infoPtr->rcDraw.left) - (infoPtr->width_increment * xdiv); 1781 1781 infoPtr->top_offset = (infoPtr->rcDraw.bottom - infoPtr->rcDraw.top) - (infoPtr->height_increment * 10.0); … … 1790 1790 rcDraw->bottom = rcDraw->top + 9 * infoPtr->textHeight + 5; 1791 1791 }*/ 1792 1792 1793 1793 /* calculate title area */ 1794 1794 title->top = rcClient->top; … … 1805 1805 next->right = title->right - 6; 1806 1806 next->left = next->right - (title->bottom - title->top); 1807 1807 1808 1808 /* titlemonth->left and right change based upon the current month */ 1809 1809 /* and are recalculated in refresh as the current month may change */ … … 1811 1811 titlemonth->top = titleyear->top = title->top + (infoPtr->height_increment)/2; 1812 1812 titlemonth->bottom = titleyear->bottom = title->bottom - (infoPtr->height_increment)/2; 1813 1813 1814 1814 /* setup the dimensions of the rectangle we draw the names of the */ 1815 1815 /* days of the week in */ 1816 1816 weeknumrect->left =infoPtr->left_offset; 1817 if(dwStyle & MCS_WEEKNUMBERS) 1817 if(dwStyle & MCS_WEEKNUMBERS) 1818 1818 weeknumrect->right=prev->right; 1819 1819 else … … 1823 1823 wdays->top = title->bottom ; 1824 1824 wdays->bottom = wdays->top + infoPtr->height_increment; 1825 1825 1826 1826 days->top = weeknumrect->top = wdays->bottom ; 1827 1827 days->bottom = weeknumrect->bottom = days->top + 6 * infoPtr->height_increment; 1828 1828 1829 1829 todayrect->left = rcClient->left; 1830 1830 todayrect->right = rcClient->right; … … 1832 1832 todayrect->bottom = days->bottom + infoPtr->height_increment; 1833 1833 1834 /* uncomment for excessive debugging 1834 /* uncomment for excessive debugging 1835 1835 TRACE("dx=%d dy=%d rcC[%d %d %d %d] t[%d %d %d %d] wd[%d %d %d %d] w[%d %d %d %d] t[%d %d %d %d]\n", 1836 infoPtr->width_increment,infoPtr->height_increment,1837 rcClient->left, rcClient->right, rcClient->top, rcClient->bottom,1838 title->left, title->right, title->top, title->bottom,1839 wdays->left, wdays->right, wdays->top, wdays->bottom,1840 days->left, days->right, days->top, days->bottom,1841 todayrect->left,todayrect->right,todayrect->top,todayrect->bottom);1836 infoPtr->width_increment,infoPtr->height_increment, 1837 rcClient->left, rcClient->right, rcClient->top, rcClient->bottom, 1838 title->left, title->right, title->top, title->bottom, 1839 wdays->left, wdays->right, wdays->top, wdays->bottom, 1840 days->left, days->right, days->top, days->bottom, 1841 todayrect->left,todayrect->right,todayrect->top,todayrect->bottom); 1842 1842 */ 1843 1843 1844 1844 /* restore the originally selected font */ 1845 SelectObject(hdc, currentFont); 1845 SelectObject(hdc, currentFont); 1846 1846 1847 1847 ReleaseDC(hwnd, hdc); … … 1865 1865 { 1866 1866 MONTHCAL_INFO *infoPtr; 1867 LOGFONTA logFont;1867 LOGFONTA logFont; 1868 1868 1869 1869 /* allocate memory for info structure */ … … 1900 1900 infoPtr->maxSelCount = 7; 1901 1901 infoPtr->monthRange = 3; 1902 infoPtr->monthdayState = COMCTL32_Alloc 1902 infoPtr->monthdayState = COMCTL32_Alloc 1903 1903 (infoPtr->monthRange * sizeof(MONTHDAYSTATE)); 1904 1904 infoPtr->titlebk = GetSysColor(COLOR_ACTIVECAPTION); … … 1907 1907 infoPtr->trailingtxt = GetSysColor(COLOR_GRAYTEXT); 1908 1908 infoPtr->bk = GetSysColor(COLOR_WINDOW); 1909 infoPtr->txt = GetSysColor(COLOR_WINDOWTEXT);1909 infoPtr->txt = GetSysColor(COLOR_WINDOWTEXT); 1910 1910 1911 1911 /* call MONTHCAL_UpdateSize to set all of the dimensions */ … … 2062 2062 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 2063 2063 wndClass.lpszClassName = MONTHCAL_CLASSA; 2064 2064 2065 2065 RegisterClassA(&wndClass); 2066 2066 }
Note:
See TracChangeset
for help on using the changeset viewer.
