Skip to content
Snippets Groups Projects
Commit 087ba42b authored by Chris Morgan's avatar Chris Morgan Committed by Alexandre Julliard
Browse files

Added 3D border around control. Fixed monthcal control popup. Added

WM_SIZE support.  Optimized drawing.  Added WM_LBUTTONUP handling.
Handle DTS_RIGHTALIGN style.  Fixed handling of formatting styles,
date is now displayed properly for DTS_SHORTDATEFORMAT.
parent 043c3e79
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@
*
* Copyright 1998, 1999 Eric Kohl
* Copyright 1999, 2000 Alex Priem <alexp@sci.kun.nl>
* Copyright 2000 Chris Morgan <cmorgan@wpi.edu>
*
*
* TODO:
......@@ -16,6 +17,7 @@
#include <stdio.h>
#include "winbase.h"
#include "wingdi.h"
#include "commctrl.h"
#include "datetime.h"
#include "monthcal.h"
......@@ -80,6 +82,7 @@ DATETIME_GetMonthCalColor (HWND hwnd, WPARAM wParam)
return SendMessageA (infoPtr->hMonthCal, MCM_GETCOLOR, wParam, 0);
}
static LRESULT
DATETIME_SetMonthCalColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
......@@ -90,7 +93,6 @@ DATETIME_SetMonthCalColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
/* FIXME: need to get way to force font into monthcal structure */
static LRESULT
DATETIME_GetMonthCal (HWND hwnd)
{
......@@ -110,6 +112,7 @@ DATETIME_GetMonthCalFont (HWND hwnd)
return 0;
}
static LRESULT
DATETIME_SetMonthCalFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
......@@ -118,7 +121,6 @@ DATETIME_SetMonthCalFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
/*
Split up a formattxt in actions.
See ms documentation for the meaning of the letter codes/'specifiers'.
......@@ -132,7 +134,6 @@ DATETIME_SetMonthCalFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
*/
static void
DATETIME_UseFormat (DATETIME_INFO *infoPtr, const char *formattxt)
{
......@@ -195,24 +196,26 @@ DATETIME_UseFormat (DATETIME_INFO *infoPtr, const char *formattxt)
} /* for i */
if (infoPtr->fieldspec[*nrFields]!=0) (*nrFields)++;
TRACE("\n");
if (infoPtr->fieldspec[*nrFields]!=0) (*nrFields)++;
}
static LRESULT
DATETIME_SetFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr= DATETIME_GetInfoPtr (hwnd);
if (!lParam) {
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
if (dwStyle & DTS_SHORTDATEFORMAT)
DATETIME_UseFormat (infoPtr, "M/d/yy");
if (dwStyle & DTS_LONGDATEFORMAT)
DATETIME_UseFormat (infoPtr, "dddd, MMMM dd, yyy");
if (dwStyle & DTS_TIMEFORMAT)
DATETIME_UseFormat (infoPtr, "h:mm:ss tt");
DATETIME_UseFormat (infoPtr, "dddd, MMMM dd, yyy");
else if (dwStyle & DTS_TIMEFORMAT)
DATETIME_UseFormat (infoPtr, "h:mm:ss tt");
else /* DTS_SHORTDATEFORMAT */
DATETIME_UseFormat (infoPtr, "M/d/yy");
}
else
DATETIME_UseFormat (infoPtr, (char *) lParam);
......@@ -220,6 +223,7 @@ DATETIME_SetFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
return infoPtr->nrFields;
}
static LRESULT
DATETIME_SetFormatW (HWND hwnd, WPARAM wParam, LPARAM lParam)
......@@ -240,6 +244,7 @@ DATETIME_SetFormatW (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
static void
DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result)
{
......@@ -264,8 +269,8 @@ DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result)
TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
return;
}
switch (spec) {
case DT_END_FORMAT:
*result=0;
......@@ -354,6 +359,7 @@ DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result)
TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
}
static void
DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number)
{
......@@ -366,7 +372,6 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number)
spec=infoPtr->fieldspec[number];
if ((spec & DTHT_DATEFIELD)==0) return;
switch (spec) {
case ONEDIGITDAY:
case TWODIGITDAY:
......@@ -418,6 +423,7 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number)
}
static void
DATETIME_DecreaseField (DATETIME_INFO *infoPtr, int number)
{
......@@ -427,7 +433,7 @@ DATETIME_DecreaseField (DATETIME_INFO *infoPtr, int number)
TRACE ("%d\n",number);
if ((number>infoPtr->nrFields) || (number<0)) return;
spec=infoPtr->fieldspec[number];
spec = infoPtr->fieldspec[number];
if ((spec & DTHT_DATEFIELD)==0) return;
TRACE ("%x\n",spec);
......@@ -503,7 +509,7 @@ DATETIME_ResetFieldDown (DATETIME_INFO *infoPtr, int number)
TRACE ("%d\n",number);
if ((number>infoPtr->nrFields) || (number<0)) return;
spec=infoPtr->fieldspec[number];
spec = infoPtr->fieldspec[number];
if ((spec & DTHT_DATEFIELD)==0) return;
......@@ -512,7 +518,7 @@ DATETIME_ResetFieldDown (DATETIME_INFO *infoPtr, int number)
case TWODIGITDAY:
case THREECHARDAY:
case FULLDAY:
date->wDay=1;
date->wDay = 1;
break;
case ONEDIGIT12HOUR:
case TWODIGIT12HOUR:
......@@ -520,38 +526,43 @@ DATETIME_ResetFieldDown (DATETIME_INFO *infoPtr, int number)
case TWODIGIT24HOUR:
case ONELETTERAMPM:
case TWOLETTERAMPM:
date->wHour=0;
date->wHour = 0;
break;
case ONEDIGITSECOND:
case TWODIGITSECOND:
date->wSecond=0;
date->wSecond = 0;
break;
case ONEDIGITMINUTE:
case TWODIGITMINUTE:
date->wMinute=0;
date->wMinute = 0;
break;
case ONEDIGITMONTH:
case TWODIGITMONTH:
case THREECHARMONTH:
case FULLMONTH:
date->wMonth=1;
date->wMonth = 1;
case FORMATCALLBACK:
FIXME ("Not implemented\n");
break;
case ONEDIGITYEAR:
case TWODIGITYEAR:
/* FYI: On 9/14/1752 the calender changed and England and the American */
/* colonies changed to the Gregorian calender. This change involved */
/* having September 14th following September 2nd. So no date algorithms */
/* work before that date. */
case FULLYEAR:
date->wSecond=0;
date->wMinute=0;
date->wHour=0;
date->wDay=14; /* overactive ms-programmers..*/
date->wMonth=9;
date->wYear=1752;
date->wSecond = 0;
date->wMinute = 0;
date->wHour = 0;
date->wDay = 14; /* overactive ms-programmers..*/
date->wMonth = 9;
date->wYear = 1752;
break;
}
}
static void
DATETIME_ResetFieldUp (DATETIME_INFO *infoPtr, int number)
{
......@@ -611,157 +622,168 @@ static void DATETIME_Refresh (HWND hwnd, HDC hdc)
int i,prevright;
RECT *field;
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
RECT *rect = &infoPtr->rect;
RECT *calbutton= &infoPtr->calbutton;
RECT *checkbox= &infoPtr->checkbox;
RECT *rcDraw = &infoPtr->rcDraw;
RECT *rcClient = &infoPtr->rcClient;
RECT *calbutton = &infoPtr->calbutton;
RECT *checkbox = &infoPtr->checkbox;
HBRUSH hbr;
SIZE size;
BOOL prssed=FALSE;
COLORREF oldBk, oldTextColor;
/* draw control edge */
hbr = CreateSolidBrush(RGB(255, 255, 255));
FillRect(hdc, rcClient, hbr);
DrawEdge(hdc, rcClient, EDGE_SUNKEN, BF_RECT);
DeleteObject(hbr);
if (infoPtr->dateValid) {
char txt[80];
HFONT oldFont;
oldFont = SelectObject (hdc, infoPtr->hFont);
GetClientRect (hwnd, rect);
hbr = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
FillRect(hdc, rect, hbr);
DeleteObject(hbr);
DATETIME_ReturnTxt (infoPtr, 0, txt);
GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
rect->bottom=size.cy+2;
checkbox->left = 0;
checkbox->right = 0;
checkbox->top = rect->top;
checkbox->bottom= rect->bottom;
if (dwStyle & DTS_SHOWNONE) checkbox->right=18;
prevright=checkbox->right;
for (i=0; i<infoPtr->nrFields; i++) {
DATETIME_ReturnTxt (infoPtr, i, txt);
GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
field = & infoPtr->fieldRect[i];
field->left = prevright;
field->right = prevright+size.cx;
field->top = rect->top;
field->bottom= rect->bottom;
prevright=field->right;
if ((infoPtr->haveFocus) && (i==infoPtr->select)) {
hbr=CreateSolidBrush (GetSysColor (COLOR_ACTIVECAPTION));
FillRect(hdc, field, hbr);
oldBk=SetBkColor (hdc, GetSysColor(COLOR_ACTIVECAPTION));
oldTextColor=SetTextColor (hdc, GetSysColor(COLOR_WINDOW));
DeleteObject (hbr);
DrawTextA ( hdc, txt, strlen(txt), field,
DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
SetBkColor (hdc, oldBk);
HFONT oldFont;
oldFont = SelectObject (hdc, infoPtr->hFont);
DATETIME_ReturnTxt (infoPtr, 0, txt);
GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
rcDraw->bottom = size.cy+2;
if (dwStyle & DTS_SHOWNONE) checkbox->right = 18;
prevright = checkbox->right;
for (i=0; i<infoPtr->nrFields; i++) {
DATETIME_ReturnTxt (infoPtr, i, txt);
GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
field = & infoPtr->fieldRect[i];
field->left = prevright;
field->right = prevright+size.cx;
field->top = rcDraw->top;
field->bottom = rcDraw->bottom;
prevright = field->right;
if ((infoPtr->haveFocus) && (i==infoPtr->select)) {
hbr = CreateSolidBrush (GetSysColor (COLOR_ACTIVECAPTION));
FillRect(hdc, field, hbr);
oldBk = SetBkColor (hdc, GetSysColor(COLOR_ACTIVECAPTION));
oldTextColor = SetTextColor (hdc, GetSysColor(COLOR_WINDOW));
DeleteObject (hbr);
DrawTextA ( hdc, txt, strlen(txt), field,
DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
SetBkColor (hdc, oldBk);
SetTextColor (hdc, oldTextColor);
}
else
DrawTextA ( hdc, txt, strlen(txt), field,
}
else
DrawTextA ( hdc, txt, strlen(txt), field,
DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
}
SelectObject (hdc, oldFont);
}
if (!(dwStyle & DTS_UPDOWN)) {
calbutton->right = rect->right;
calbutton->left = rect->right-15;
calbutton->top = rect->top;
calbutton->bottom= rect->bottom;
}
DrawFrameControl(hdc, calbutton, DFC_SCROLL,
DFCS_SCROLLDOWN | (prssed ? DFCS_PUSHED : 0) |
(dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );
}
SelectObject (hdc, oldFont);
}
if (!(dwStyle & DTS_UPDOWN)) {
DrawFrameControl(hdc, calbutton, DFC_SCROLL,
DFCS_SCROLLDOWN | (infoPtr->bCalDepressed ? DFCS_PUSHED : 0) |
(dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );
}
}
static LRESULT
DATETIME_HitTest (HWND hwnd, DATETIME_INFO *infoPtr, POINT pt)
{
int i,retval;
int i, retval;
TRACE ("%ld, %ld\n",pt.x,pt.y);
retval=DTHT_NONE;
if (PtInRect (&infoPtr->calbutton, pt)) {retval=DTHT_MCPOPUP; goto done; }
if (PtInRect (&infoPtr->checkbox, pt)) {retval=DTHT_CHECKBOX; goto done; }
retval = DTHT_NONE;
if (PtInRect (&infoPtr->calbutton, pt))
{retval = DTHT_MCPOPUP; TRACE("Hit in calbutton(DTHT_MCPOPUP)\n"); goto done; }
if (PtInRect (&infoPtr->checkbox, pt))
{retval = DTHT_CHECKBOX; TRACE("Hit in checkbox(DTHT_CHECKBOX)\n"); goto done; }
for (i=0; i<infoPtr->nrFields; i++) {
if (PtInRect (&infoPtr->fieldRect[i], pt)) {
retval=i;
break;
}
if (PtInRect (&infoPtr->fieldRect[i], pt)) {
retval = i;
TRACE("Hit in date text in field %d\n", i);
break;
}
}
done:
TRACE ("%x\n",retval);
return retval;
}
static LRESULT
DATETIME_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
int old, new;
POINT pt;
int old,new;
TRACE ("\n");
old=infoPtr->select;
pt.x=(INT)LOWORD(lParam);
pt.y=(INT)HIWORD(lParam);
old = infoPtr->select;
pt.x = (INT)LOWORD(lParam);
pt.y = (INT)HIWORD(lParam);
new=DATETIME_HitTest (hwnd, infoPtr, pt);
new = DATETIME_HitTest (hwnd, infoPtr, pt);
if ((new & DT_STRING)==0) infoPtr->select=new;
/* FIXME: might be conditions where we don't want to update infoPtr->select */
infoPtr->select = new;
if (infoPtr->select!=old) {
HDC hdc;
SetFocus (hwnd);
hdc=GetDC (hwnd);
DATETIME_Refresh (hwnd,hdc);
infoPtr->haveFocus=DTHT_GOTFOCUS;
ReleaseDC (hwnd, hdc);
if (infoPtr->select != old) {
infoPtr->haveFocus = DTHT_GOTFOCUS;
}
if (infoPtr->select==DTHT_MCPOPUP) {
POINT pt;
pt.x=8;
pt.y=infoPtr->rect.bottom+5;
ClientToScreen (hwnd, &pt);
infoPtr->hMonthCal=CreateWindowExA (0,"SysMonthCal32", 0,
WS_POPUP | WS_BORDER,
pt.x,pt.y,145,150,
GetParent (hwnd),
0,0,0);
TRACE ("dt:%x mc:%x mc parent:%x, desktop:%x, mcpp:%x\n",
hwnd,infoPtr->hMonthCal,
GetParent (infoPtr->hMonthCal),
GetDesktopWindow (),
GetParent (GetParent (infoPtr->hMonthCal)));
SetFocus (hwnd);
DATETIME_SendSimpleNotify (hwnd, DTN_DROPDOWN);
return 0;
}
if (infoPtr->select == DTHT_MCPOPUP) {
/* FIXME: button actually is only depressed during dropdown of the */
/* calender control and when the mouse is over the button window */
infoPtr->bCalDepressed = TRUE;
/* recalculate the position of the monthcal popup */
if(dwStyle & DTS_RIGHTALIGN)
infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right -
infoPtr->calbutton.left) + 145);
else
infoPtr->monthcal_pos.x = 8;
infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom;
ClientToScreen (hwnd, &(infoPtr->monthcal_pos));
SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x,
infoPtr->monthcal_pos.y, 145, 150, 0);
if(IsWindowVisible(infoPtr->hMonthCal))
ShowWindow(infoPtr->hMonthCal, SW_HIDE);
else
ShowWindow(infoPtr->hMonthCal, SW_SHOW);
TRACE ("dt:%x mc:%x mc parent:%x, desktop:%x, mcpp:%x\n",
hwnd,infoPtr->hMonthCal,
GetParent (infoPtr->hMonthCal),
GetDesktopWindow (),
GetParent (GetParent (infoPtr->hMonthCal)));
DATETIME_SendSimpleNotify (hwnd, DTN_DROPDOWN);
}
InvalidateRect(hwnd, NULL, FALSE);
return 0;
return 0;
}
static LRESULT
DATETIME_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
TRACE("\n");
if(infoPtr->bCalDepressed == TRUE) {
infoPtr->bCalDepressed = FALSE;
RedrawWindow(hwnd, &(infoPtr->calbutton), NULL, RDW_ERASE|RDW_INVALIDATE);
}
return 0;
}
......@@ -778,11 +800,12 @@ DATETIME_Paint (HWND hwnd, WPARAM wParam)
return 0;
}
static LRESULT
DATETIME_ParentNotify (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
LPNMHDR lpnmh=(LPNMHDR) lParam;
LPNMHDR lpnmh = (LPNMHDR) lParam;
TRACE ("%x,%lx\n",wParam, lParam);
TRACE ("Got notification %x from %x\n", lpnmh->code, lpnmh->hwndFrom);
......@@ -790,12 +813,13 @@ DATETIME_ParentNotify (HWND hwnd, WPARAM wParam, LPARAM lParam)
return 0;
}
static LRESULT
DATETIME_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
LPNMHDR lpnmh=(LPNMHDR) lParam;
LPNMHDR lpnmh = (LPNMHDR) lParam;
TRACE ("%x,%lx\n",wParam, lParam);
TRACE ("Got notification %x from %x\n", lpnmh->code, lpnmh->hwndFrom);
......@@ -804,17 +828,15 @@ DATETIME_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
static LRESULT
DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
HDC hdc;
int FieldNum,wrap=0;
TRACE("%x %lx %x\n",wParam, lParam, infoPtr->select);
FieldNum=infoPtr->select & DTHT_DATEFIELD;
FieldNum = infoPtr->select & DTHT_DATEFIELD;
if (!(infoPtr->haveFocus)) return 0;
if ((FieldNum==0) && (infoPtr->select)) return 0;
......@@ -845,7 +867,7 @@ DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
case VK_LEFT:
do {
if (infoPtr->select==0) {
infoPtr->select=infoPtr->nrFields-1;
infoPtr->select = infoPtr->nrFields - 1;
wrap++;
} else
infoPtr->select--;
......@@ -856,7 +878,7 @@ DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
do {
infoPtr->select++;
if (infoPtr->select==infoPtr->nrFields) {
infoPtr->select=0;
infoPtr->select = 0;
wrap++;
}
}
......@@ -864,9 +886,7 @@ DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
break;
}
hdc = GetDC (hwnd);
DATETIME_Refresh (hwnd, hdc);
ReleaseDC (hwnd, hdc);
InvalidateRect(hwnd, NULL, FALSE);
return 0;
}
......@@ -876,7 +896,6 @@ static LRESULT
DATETIME_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
HDC hdc;
TRACE ("\n");
......@@ -884,9 +903,7 @@ DATETIME_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
DATETIME_SendSimpleNotify (hwnd, NM_KILLFOCUS);
infoPtr->haveFocus = 0;
}
hdc = GetDC (hwnd);
DATETIME_Refresh (hwnd, hdc);
ReleaseDC (hwnd, hdc);
InvalidateRect (hwnd, NULL, TRUE);
return 0;
......@@ -897,17 +914,15 @@ static LRESULT
DATETIME_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
HDC hdc;
TRACE ("\n");
if (infoPtr->haveFocus==0) {
DATETIME_SendSimpleNotify (hwnd, NM_SETFOCUS);
infoPtr->haveFocus=DTHT_GOTFOCUS;
infoPtr->haveFocus = DTHT_GOTFOCUS;
}
hdc = GetDC (hwnd);
DATETIME_Refresh (hwnd, hdc);
ReleaseDC (hwnd, hdc);
InvalidateRect(hwnd, NULL, FALSE);
return 0;
}
......@@ -926,9 +941,9 @@ DATETIME_SendDateTimeChangeNotify (HWND hwnd)
dtdtc.nmhdr.code = DTN_DATETIMECHANGE;
if ((GetWindowLongA (hwnd, GWL_STYLE) & DTS_SHOWNONE))
dtdtc.dwFlags = GDT_NONE;
dtdtc.dwFlags = GDT_NONE;
else
dtdtc.dwFlags = GDT_VALID;
dtdtc.dwFlags = GDT_VALID;
MONTHCAL_CopyTime (&infoPtr->date, &dtdtc.st);
return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
......@@ -950,57 +965,107 @@ DATETIME_SendSimpleNotify (HWND hwnd, UINT code)
(WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
}
static LRESULT
DATETIME_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr(hwnd);
DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE);
/* set size */
infoPtr->rcClient.bottom = HIWORD(lParam);
infoPtr->rcClient.right = LOWORD(lParam);
TRACE("Height=%d, Width=%d\n", infoPtr->rcClient.bottom, infoPtr->rcClient.right);
/* use DrawEdge to adjust the size of rcEdge to get rcDraw */
memcpy((&infoPtr->rcDraw), (&infoPtr->rcClient), sizeof(infoPtr->rcDraw));
DrawEdge((HDC)NULL, &(infoPtr->rcDraw), EDGE_SUNKEN, BF_RECT | BF_ADJUST);
static LRESULT
DATETIME_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr;
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
/* set the size of the button that drops the calender down */
/* FIXME: account for style that allows button on left side */
infoPtr->calbutton.top = infoPtr->rcDraw.top;
infoPtr->calbutton.bottom= infoPtr->rcDraw.bottom;
infoPtr->calbutton.left = infoPtr->rcDraw.right-15;
infoPtr->calbutton.right = infoPtr->rcDraw.right;
/* allocate memory for info structure */
infoPtr = (DATETIME_INFO *)COMCTL32_Alloc (sizeof(DATETIME_INFO));
if (infoPtr == NULL) {
ERR("could not allocate info memory!\n");
return 0;
}
/* set enable/disable button size for show none style being enabled */
/* FIXME: these dimensions are completely incorrect */
infoPtr->checkbox.top = infoPtr->rcDraw.top;
infoPtr->checkbox.bottom = infoPtr->rcDraw.bottom;
infoPtr->checkbox.left = infoPtr->rcDraw.left;
infoPtr->checkbox.right = infoPtr->rcDraw.left + 10;
SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
/* update the position of the monthcal control */
if(dwStyle & DTS_RIGHTALIGN)
infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right -
infoPtr->calbutton.left) + 145);
else
infoPtr->monthcal_pos.x = 8;
if (dwStyle & DTS_SHOWNONE) {
infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0,
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
2,2,13,13,
hwnd,
0, GetWindowLongA (hwnd, GWL_HINSTANCE), 0);
SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0);
}
infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom;
ClientToScreen (hwnd, &(infoPtr->monthcal_pos));
SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x,
infoPtr->monthcal_pos.y,
145, 150, 0);
if (dwStyle & DTS_UPDOWN) {
InvalidateRect(hwnd, NULL, FALSE);
infoPtr->hUpdown=CreateUpDownControl (
WS_CHILD | WS_BORDER | WS_VISIBLE,
120,1,20,20,
hwnd,1,0,0,
UD_MAXVAL, UD_MINVAL, 0);
}
return 0;
}
infoPtr->fieldspec=(int *) COMCTL32_Alloc (32*sizeof(int));
infoPtr->fieldRect=(RECT *) COMCTL32_Alloc (32*sizeof(RECT));
infoPtr->buflen=(int *) COMCTL32_Alloc (32*sizeof(int));
infoPtr->nrFieldsAllocated=32;
DATETIME_SetFormat (hwnd, 0, 0);
static LRESULT
DATETIME_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
DATETIME_INFO *infoPtr;
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
/* initialize info structure */
infoPtr->hMonthCal=0;
GetSystemTime (&infoPtr->date);
infoPtr->dateValid = TRUE;
infoPtr->hFont = GetStockObject(DEFAULT_GUI_FONT);
/* allocate memory for info structure */
infoPtr = (DATETIME_INFO *)COMCTL32_Alloc (sizeof(DATETIME_INFO));
if (infoPtr == NULL) {
ERR("could not allocate info memory!\n");
return 0;
}
SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
if (dwStyle & DTS_SHOWNONE) {
infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0,
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
2,2,13,13,
hwnd,
0, GetWindowLongA (hwnd, GWL_HINSTANCE), 0);
SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0);
}
if (dwStyle & DTS_UPDOWN) {
infoPtr->hUpdown=CreateUpDownControl (
WS_CHILD | WS_BORDER | WS_VISIBLE,
120,1,20,20,
hwnd,1,0,0,
UD_MAXVAL, UD_MINVAL, 0);
}
infoPtr->fieldspec = (int *) COMCTL32_Alloc (32*sizeof(int));
infoPtr->fieldRect = (RECT *) COMCTL32_Alloc (32*sizeof(RECT));
infoPtr->buflen = (int *) COMCTL32_Alloc (32*sizeof(int));
infoPtr->nrFieldsAllocated = 32;
DATETIME_SetFormat (hwnd, 0, 0);
/* create the monthcal control */
infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0,
WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
0, 0, 0, 0,
GetParent(hwnd),
0, 0, 0);
/* initialize info structure */
GetSystemTime (&infoPtr->date);
infoPtr->dateValid = TRUE;
infoPtr->hFont = GetStockObject(DEFAULT_GUI_FONT);
return 0;
}
......@@ -1014,13 +1079,9 @@ DATETIME_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
static LRESULT WINAPI
DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
......@@ -1080,9 +1141,15 @@ DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_SETFOCUS:
return DATETIME_SetFocus (hwnd, wParam, lParam);
case WM_SIZE:
return DATETIME_Size (hwnd, wParam, lParam);
case WM_LBUTTONDOWN:
return DATETIME_LButtonDown (hwnd, wParam, lParam);
case WM_LBUTTONUP:
return DATETIME_LButtonUp (hwnd, wParam, lParam);
case WM_CREATE:
return DATETIME_Create (hwnd, wParam, lParam);
......@@ -1122,4 +1189,3 @@ DATETIME_Unregister (void)
{
UnregisterClassA (DATETIMEPICK_CLASSA, (HINSTANCE)NULL);
}
......@@ -18,9 +18,11 @@ typedef struct tagDATETIME_INFO
SYSTEMTIME date;
BOOL dateValid;
HWND hwndCheckbut;
RECT rect;
RECT checkbox;
RECT calbutton;
RECT rcClient; /* rect around the edge of the window */
RECT rcDraw; /* rect inside of the border */
RECT checkbox; /* checkbox allowing the control to be enabled/disabled */
RECT calbutton; /* button that toggles the dropdown of the monthcal control */
BOOL bCalDepressed; /* TRUE = cal button is depressed */
int select;
HFONT hFont;
int nrFieldsAllocated;
......@@ -30,6 +32,7 @@ typedef struct tagDATETIME_INFO
RECT *fieldRect;
int *buflen;
char textbuf[256];
POINT monthcal_pos;
} DATETIME_INFO, *LPDATETIME_INFO;
extern VOID DATETIME_Register (VOID);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment