📄 durationcontrol.c
字号:
static LRESULT APIENTRY
sEditHoursProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
DCWndData* pDC = Duration_GetPtr(GetParent (hwnd));
LRESULT lReturn;
UINT u;
u = sCommonEditProc (hwnd, pDC, HOURS, uMsg, wParam, lParam, &lReturn);
switch (u) {
case RETURN_VALUE :
return lReturn;
case NORMAL_PROCESSING :
return CallWindowProc (pDC->wpOrigEditProc[HOURS],
hwnd, uMsg, wParam, lParam);
case MOVE_RIGHT :
SetFocus (pDC->hwndEdit[MINS]);
return 0;
case MOVE_LEFT :
SetFocus (pDC->hwndEdit[DAYS]);
return 0;
default :
return 0;
}
}
static LRESULT APIENTRY
sEditMinsProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
DCWndData* pDC = Duration_GetPtr(GetParent (hwnd));
LRESULT lReturn;
UINT u;
u = sCommonEditProc (hwnd, pDC, MINS, uMsg, wParam, lParam, &lReturn);
switch (u) {
case RETURN_VALUE :
return lReturn;
case NORMAL_PROCESSING :
return CallWindowProc (pDC->wpOrigEditProc[MINS],
hwnd, uMsg, wParam, lParam);
case MOVE_RIGHT :
SetFocus (pDC->hwndEdit[DAYS]);
return 0;
case MOVE_LEFT :
SetFocus (pDC->hwndEdit[HOURS]);
return 0;
default :
return 0;
}
}
// ______________________________________________
//
// static text edit box subclass procedures
static LRESULT APIENTRY
sText0Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
DCWndData* pDC;
switch (uMsg) {
case WM_PAINT :
case WM_ENABLE :
case EM_SETREADONLY :
case WM_NCHITTEST :
case WM_SETTEXT :
case WM_HELP :
pDC = Duration_GetPtr(GetParent (hwnd));
return CallWindowProc(pDC->wpOrigTextProc[DAYS],
hwnd, uMsg, wParam, lParam);
case WM_MOUSEACTIVATE :
pDC = Duration_GetPtr(GetParent (hwnd));
SetFocus (pDC->hwndEdit[DAYS]);
return 0;
default :
return 0;
}
}
static LRESULT APIENTRY
sText1Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
DCWndData* pDC;
switch (uMsg) {
case WM_PAINT :
case WM_ENABLE :
case EM_SETREADONLY :
case WM_NCHITTEST :
case WM_SETTEXT :
case WM_HELP :
pDC = Duration_GetPtr(GetParent (hwnd));
return CallWindowProc(pDC->wpOrigTextProc[HOURS],
hwnd, uMsg, wParam, lParam);
case WM_MOUSEACTIVATE :
pDC = Duration_GetPtr(GetParent (hwnd));
SetFocus (pDC->hwndEdit[HOURS]);
return 0;
default :
return 0;
}
}
static LRESULT APIENTRY
sText2Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
DCWndData* pDC;
switch (uMsg) {
case WM_PAINT :
case WM_ENABLE :
case EM_SETREADONLY :
case WM_NCHITTEST :
case WM_SETTEXT :
case WM_HELP :
pDC = Duration_GetPtr(GetParent (hwnd));
return CallWindowProc(pDC->wpOrigTextProc[MINS],
hwnd, uMsg, wParam, lParam);
case WM_MOUSEACTIVATE :
pDC = Duration_GetPtr(GetParent (hwnd));
SetFocus (pDC->hwndEdit[MINS]);
return 0;
default :
return 0;
}
}
// ____________________________________
//
// Message processing function for Duration class
static LRESULT WINAPI
sDurationMsgProc (
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
DCWndData* pDC = Duration_GetPtr(hwnd);
if (pDC == NULL) {
if (msg == WM_NCCREATE)
{
pDC = (DCWndData*)sAlloc (sizeof(DCWndData));
if (pDC == NULL) return 0L;
Duration_SetPtr (hwnd, pDC);
}
else
return DefWindowProc (hwnd, msg, wParam, lParam);
}
if (msg == WM_NCDESTROY)
{
sFree (pDC);
pDC = NULL;
Duration_SetPtr (hwnd, NULL);
}
switch (msg) {
case WM_CREATE :
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
pDC->hwnd = hwnd;
pDC->hwndParent = lpcs->hwndParent;
pDC->iID = (INT)(lpcs->hMenu);
pDC->dwStyle = lpcs->style & ES_READONLY;
pDC->hFont = GetStockObject (DEFAULT_GUI_FONT);
pDC->iFocused = -1;
pDC->iPrevFocused = 0;
pDC->bFirstKey = TRUE;
pDC->iHeight = lpcs->cy;
pDC->iRangeLo[DAYS] = 0;
pDC->iRangeLo[HOURS] = 0;
pDC->iRangeLo[MINS] = 0;
pDC->iRangeHi[DAYS] = 99;
pDC->iRangeHi[HOURS] = 23;
pDC->iRangeHi[MINS] = 59;
pDC->ulDuration = 0;
pDC->ulMinDuration = 0;
pDC->ulMaxDuration = 8553600 + 82800 + 3540; // 99d + 23h + 59m
lstrcpy (&pDC->szText[DAYS][0], "d, ");
lstrcpy (&pDC->szText[HOURS][0], "h, ");
lstrcpy (&pDC->szText[MINS][0], "m");
// create the up/down control
pDC->hwndUpDown = CreateWindowEx (0L, UPDOWN_CLASS, "",
WS_CHILD|WS_VISIBLE|pDC->dwStyle,
0, 0, 0, 0, hwnd, NULL, 0, NULL);
// create edit controls
// days
pDC->hwndEdit[DAYS] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_RIGHT|pDC->dwStyle,
0, 0, 0, 0, hwnd, (HMENU)IDC_EDITDAYS, 0, NULL);
SendMessage (pDC->hwndEdit[DAYS],
WM_SETFONT, (WPARAM)pDC->hFont, FALSE);
SendMessage (pDC->hwndEdit[DAYS],
EM_SETLIMITTEXT, 2, 0);
pDC->wpOrigEditProc[DAYS] =
(WNDPROC) SetWindowLong (pDC->hwndEdit[DAYS],
GWL_WNDPROC, (LONG)sEditDaysProc);
pDC->hwndText[DAYS] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_VISIBLE|ES_LEFT|pDC->dwStyle,
0, 0, 0, 0, hwnd, (HMENU)IDC_TEXTDAYS, 0, NULL);
SendMessage (pDC->hwndText[DAYS],
WM_SETFONT, (WPARAM)pDC->hFont, FALSE);
pDC->wpOrigTextProc[DAYS] =
(WNDPROC) SetWindowLong (pDC->hwndText[DAYS],
GWL_WNDPROC, (LONG)sText0Proc);
// hours
pDC->hwndEdit[HOURS] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_RIGHT|pDC->dwStyle,
0, 0, 0, 0, hwnd, (HMENU)IDC_EDITHOURS, 0, NULL);
SendMessage (pDC->hwndEdit[HOURS],
WM_SETFONT, (WPARAM)pDC->hFont, FALSE);
SendMessage (pDC->hwndEdit[HOURS],
EM_SETLIMITTEXT, 2, 0);
pDC->wpOrigEditProc[HOURS] =
(WNDPROC) SetWindowLong (pDC->hwndEdit[HOURS],
GWL_WNDPROC, (LONG)sEditHoursProc);
pDC->hwndText[HOURS] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_VISIBLE|ES_LEFT|pDC->dwStyle,
0, 0, 0, 0, hwnd, (HMENU)IDC_TEXTHOURS, 0, NULL);
SendMessage (pDC->hwndText[HOURS],
WM_SETFONT, (WPARAM)pDC->hFont, FALSE);
pDC->wpOrigTextProc[HOURS] =
(WNDPROC) SetWindowLong (pDC->hwndText[HOURS],
GWL_WNDPROC, (LONG)sText1Proc);
// minutes
pDC->hwndEdit[MINS] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_RIGHT|pDC->dwStyle,
0, 0, 0, 0, hwnd, (HMENU)IDC_EDITMINS, 0, NULL);
SendMessage (pDC->hwndEdit[MINS],
WM_SETFONT, (WPARAM)pDC->hFont, FALSE);
SendMessage (pDC->hwndEdit[MINS],
EM_SETLIMITTEXT, 2, 0);
pDC->wpOrigEditProc[MINS] =
(WNDPROC) SetWindowLong (pDC->hwndEdit[MINS],
GWL_WNDPROC, (LONG)sEditMinsProc);
pDC->hwndText[MINS] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_VISIBLE|ES_LEFT|pDC->dwStyle,
0, 0, 0, 0, hwnd, (HMENU)IDC_TEXTMINS, 0, NULL);
SendMessage (pDC->hwndText[MINS],
WM_SETFONT, (WPARAM)pDC->hFont, FALSE);
pDC->wpOrigTextProc[MINS] =
(WNDPROC) SetWindowLong (pDC->hwndText[MINS],
GWL_WNDPROC, (LONG)sText2Proc);
sSetControls (hwnd, pDC);
break;
}
case WM_GETDLGCODE :
return DLGC_WANTMESSAGE;
case WM_NOTIFY :
{
LPNMHDR pnmhdr = (LPNMHDR)lParam;
if (pnmhdr->hwndFrom == pDC->hwndUpDown)
{
LPNMUPDOWN pnmud = (LPNMUPDOWN)lParam;
sScrollUnit (pDC, -1*pnmud->iDelta);
}
break;
}
case WM_PAINT :
// paint background, if necessary
if (pDC->dwStyle & (WS_DISABLED | ES_READONLY))
{
PAINTSTRUCT ps;
HDC hdc;
RECT rc;
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rc);
FillRect (hdc, &rc, (HBRUSH)(COLOR_3DFACE+1));
EndPaint (hwnd, &ps);
}
break;
case WM_SETFOCUS :
SetFocus (pDC->hwndEdit[pDC->iPrevFocused]);
break;
case WM_DESTROY :
SetWindowLong (pDC->hwndText[DAYS],
GWL_WNDPROC, (LONG)pDC->wpOrigTextProc[DAYS]);
SetWindowLong (pDC->hwndText[HOURS],
GWL_WNDPROC, (LONG)pDC->wpOrigTextProc[HOURS]);
SetWindowLong (pDC->hwndText[MINS],
GWL_WNDPROC, (LONG)pDC->wpOrigTextProc[MINS]);
DestroyWindow (pDC->hwndText[DAYS]);
DestroyWindow (pDC->hwndText[HOURS]);
DestroyWindow (pDC->hwndText[MINS]);
SetWindowLong (pDC->hwndEdit[DAYS],
GWL_WNDPROC, (LONG)pDC->wpOrigEditProc[DAYS]);
SetWindowLong (pDC->hwndEdit[HOURS],
GWL_WNDPROC, (LONG)pDC->wpOrigEditProc[HOURS]);
SetWindowLong (pDC->hwndEdit[MINS],
GWL_WNDPROC, (LONG)pDC->wpOrigEditProc[MINS]);
DestroyWindow (pDC->hwndEdit[DAYS]);
DestroyWindow (pDC->hwndEdit[HOURS]);
DestroyWindow (pDC->hwndEdit[MINS]);
DestroyWindow (pDC->hwndUpDown);
break;
case EM_SETREADONLY :
if (wParam)
pDC->dwStyle |= ES_READONLY;
else
pDC->dwStyle &= ~ES_READONLY;
SendMessage (pDC->hwndText[DAYS], msg, wParam, lParam);
SendMessage (pDC->hwndText[HOURS], msg, wParam, lParam);
SendMessage (pDC->hwndText[MINS], msg, wParam, lParam);
SendMessage (pDC->hwndEdit[DAYS], msg, wParam, lParam);
SendMessage (pDC->hwndEdit[HOURS], msg, wParam, lParam);
SendMessage (pDC->hwndEdit[MINS], msg, wParam, lParam);
InvalidateRect (hwnd, NULL, TRUE);
break;
case WM_HELP :
{
LPHELPINFO lphi = (LPHELPINFO)lParam;
lphi->iCtrlId = pDC->iID;
lphi->hItemHandle = pDC->hwnd;
break;
}
case WM_ENABLE :
if (wParam)
{
pDC->dwStyle &= ~WS_DISABLED;
EnableWindow (pDC->hwndUpDown, TRUE);
}
else
{
pDC->dwStyle |= WS_DISABLED;
EnableWindow (pDC->hwndUpDown, FALSE);
}
SendMessage (pDC->hwndText[DAYS], msg, wParam, lParam);
SendMessage (pDC->hwndText[HOURS], msg, wParam, lParam);
SendMessage (pDC->hwndText[MINS], msg, wParam, lParam);
SendMessage (pDC->hwndEdit[DAYS], msg, wParam, lParam);
SendMessage (pDC->hwndEdit[HOURS], msg, wParam, lParam);
SendMessage (pDC->hwndEdit[MINS], msg, wParam, lParam);
InvalidateRect (hwnd, NULL, TRUE);
return 0;
case PGP_DCM_SETDURATION :
pDC->ulDuration = lParam;
sDisplayDuration (pDC);
break;
case PGP_DCM_GETDURATION :
*(PULONG)lParam = pDC->ulDuration;
break;
case PGP_DCM_SETMINDURATION :
pDC->ulMinDuration = (ULONG)lParam;
break;
case PGP_DCM_SETMAXDURATION :
pDC->ulMaxDuration = (ULONG)lParam;
break;
case PGP_DCM_SETTEXT :
lstrcpyn (&pDC->szText[wParam][0], (LPSTR)lParam, MAXTEXTLEN);
sSetControls (hwnd, pDC);
InvalidateRect (hwnd, NULL, TRUE);
break;
}
return (DefWindowProc (hwnd, msg, wParam, lParam));
}
// ____________________________________
//
// load and initialize control
VOID WINAPI
InitPGPDurationControl (VOID)
{
WNDCLASS wc;
InitCommonControls ();
// register new window class
wc.style = CS_DBLCLKS | CS_GLOBALCLASS | CS_PARENTDC; // Class style(s).
wc.lpfnWndProc = (WNDPROC) sDurationMsgProc;
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = sizeof (DCWndData*); // pointer to extra data
// structure
wc.hInstance = 0;
wc.hIcon = NULL;
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); // Background color
wc.lpszMenuName = NULL; // No menu
wc.lpszClassName = WC_PGPDURATION; // Name used in CreateWindow
RegisterClass (&wc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -