📄 ipaddresscontrol.c
字号:
switch (uMsg) {
case WM_PAINT :
case EM_SETREADONLY :
case WM_ENABLE :
case WM_HELP :
pIP = IPAddress_GetPtr(GetParent (hwnd));
return CallWindowProc(pIP->wpOrigDotProc[0],
hwnd, uMsg, wParam, lParam);
default :
return 0;
}
}
static LRESULT APIENTRY
sDot1Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP;
switch (uMsg) {
case WM_PAINT :
case EM_SETREADONLY :
case WM_ENABLE :
case WM_HELP :
pIP = IPAddress_GetPtr(GetParent (hwnd));
return CallWindowProc(pIP->wpOrigDotProc[1],
hwnd, uMsg, wParam, lParam);
default :
return 0;
}
}
static LRESULT APIENTRY
sDot2Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP;
switch (uMsg) {
case WM_PAINT :
case EM_SETREADONLY :
case WM_ENABLE :
case WM_HELP :
pIP = IPAddress_GetPtr(GetParent (hwnd));
return CallWindowProc(pIP->wpOrigDotProc[2],
hwnd, uMsg, wParam, lParam);
default :
return 0;
}
}
// ____________________________________
//
// Message processing function for IPAddress class
static LRESULT WINAPI
sIPAddressMsgProc (
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP = IPAddress_GetPtr(hwnd);
if (pIP == NULL) {
if (msg == WM_NCCREATE)
{
pIP = (IPWndData*)IPAlloc (sizeof(IPWndData));
if (pIP == NULL) return 0L;
IPAddress_SetPtr (hwnd, pIP);
}
else
return DefWindowProc (hwnd, msg, wParam, lParam);
}
if (msg == WM_NCDESTROY)
{
IPFree (pIP);
pIP = NULL;
IPAddress_SetPtr (hwnd, NULL);
}
switch (msg) {
case WM_CREATE :
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
INT iDotWidth = 3;
INT iNumWidth = (lpcs->cx)/4 - iDotWidth;
INT iXPos;
pIP->hwnd = hwnd;
pIP->hwndParent = lpcs->hwndParent;
pIP->iID = (INT)(lpcs->hMenu);
pIP->dwStyle = lpcs->style & ES_READONLY;
pIP->dwFlags = 0;
pIP->hFont = GetStockObject (DEFAULT_GUI_FONT);
pIP->iRangeLo[0] = 0;
pIP->iRangeLo[1] = 0;
pIP->iRangeLo[2] = 0;
pIP->iRangeLo[3] = 0;
pIP->iRangeHi[0] = 255;
pIP->iRangeHi[1] = 255;
pIP->iRangeHi[2] = 255;
pIP->iRangeHi[3] = 255;
pIP->bValid[0] = FALSE;
pIP->bValid[1] = FALSE;
pIP->bValid[2] = FALSE;
pIP->bValid[3] = FALSE;
// create edit controls
iXPos = 0;
pIP->hwndEdit[0] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iNumWidth, lpcs->cy,
hwnd, (HMENU)IDC_EDIT0, 0, NULL);
SendMessage (pIP->hwndEdit[0], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SendMessage (pIP->hwndEdit[0], EM_SETLIMITTEXT, 3, 0);
pIP->wpOrigEditProc[0] = (WNDPROC) SetWindowLong (pIP->hwndEdit[0],
GWL_WNDPROC, (LONG)sEdit0Proc);
iXPos = (lpcs->cx)/4;
pIP->hwndEdit[1] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iNumWidth, lpcs->cy,
hwnd, (HMENU)IDC_EDIT1, 0, NULL);
SendMessage (pIP->hwndEdit[1], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SendMessage (pIP->hwndEdit[1], EM_SETLIMITTEXT, 3, 0);
pIP->wpOrigEditProc[1] = (WNDPROC) SetWindowLong (pIP->hwndEdit[1],
GWL_WNDPROC, (LONG)sEdit1Proc);
iXPos = (lpcs->cx)/2;
pIP->hwndEdit[2] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iNumWidth, lpcs->cy,
hwnd, (HMENU)IDC_EDIT2, 0, NULL);
SendMessage (pIP->hwndEdit[2], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SendMessage (pIP->hwndEdit[2], EM_SETLIMITTEXT, 3, 0);
pIP->wpOrigEditProc[2] = (WNDPROC) SetWindowLong (pIP->hwndEdit[2],
GWL_WNDPROC, (LONG)sEdit2Proc);
iXPos = 3*(lpcs->cx)/4;
pIP->hwndEdit[3] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_NUMBER|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iNumWidth, lpcs->cy,
hwnd, (HMENU)IDC_EDIT3, 0, NULL);
SendMessage (pIP->hwndEdit[3], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SendMessage (pIP->hwndEdit[3], EM_SETLIMITTEXT, 3, 0);
pIP->wpOrigEditProc[3] = (WNDPROC) SetWindowLong (pIP->hwndEdit[3],
GWL_WNDPROC, (LONG)sEdit3Proc);
// create "dot" controls
iXPos = (lpcs->cx)/4 - iDotWidth;
pIP->hwndDot[0] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_VISIBLE|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iDotWidth, lpcs->cy,
hwnd, (HMENU)IDC_DOT0, 0, NULL);
SendMessage (pIP->hwndDot[0], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SetWindowText (pIP->hwndDot[0], ".");
pIP->wpOrigDotProc[0] = (WNDPROC) SetWindowLong (pIP->hwndDot[0],
GWL_WNDPROC, (LONG)sDot0Proc);
iXPos = (lpcs->cx)/2 - iDotWidth;
pIP->hwndDot[1] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_VISIBLE|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iDotWidth, lpcs->cy,
hwnd, (HMENU)IDC_DOT1, 0, NULL);
SendMessage (pIP->hwndDot[1], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SetWindowText (pIP->hwndDot[1], ".");
pIP->wpOrigDotProc[1] = (WNDPROC) SetWindowLong (pIP->hwndDot[1],
GWL_WNDPROC, (LONG)sDot1Proc);
iXPos = 3*(lpcs->cx)/4 - iDotWidth;
pIP->hwndDot[2] = CreateWindowEx (0L, "EDIT", "",
WS_CHILD|WS_VISIBLE|ES_CENTER|pIP->dwStyle,
iXPos, VERTICAL_OFFSET, iDotWidth, lpcs->cy,
hwnd, (HMENU)IDC_DOT2, 0, NULL);
SendMessage (pIP->hwndDot[2], WM_SETFONT, (WPARAM)pIP->hFont, FALSE);
SetWindowText (pIP->hwndDot[2], ".");
pIP->wpOrigDotProc[2] = (WNDPROC) SetWindowLong (pIP->hwndDot[2],
GWL_WNDPROC, (LONG)sDot2Proc);
break;
}
case WM_PAINT :
// paint background, if necessary
if ((pIP->dwStyle & ES_READONLY) ||
(pIP->dwFlags & IPFLAG_DISABLED))
{
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 :
SendMessage (pIP->hwndEdit[0], EM_SETSEL, 0, (LPARAM)-1);
SetFocus (pIP->hwndEdit[0]);
break;
case WM_ENABLE :
if (wParam)
pIP->dwFlags &= ~IPFLAG_DISABLED;
else
pIP->dwFlags |= IPFLAG_DISABLED;
SendMessage (pIP->hwndDot[0], msg, wParam, lParam);
SendMessage (pIP->hwndDot[1], msg, wParam, lParam);
SendMessage (pIP->hwndDot[2], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[0], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[1], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[2], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[3], msg, wParam, lParam);
InvalidateRect (hwnd, NULL, TRUE);
return 0;
case WM_DESTROY :
SetWindowLong (pIP->hwndDot[0],
GWL_WNDPROC, (LONG)pIP->wpOrigDotProc[0]);
SetWindowLong (pIP->hwndDot[1],
GWL_WNDPROC, (LONG)pIP->wpOrigDotProc[1]);
SetWindowLong (pIP->hwndDot[2],
GWL_WNDPROC, (LONG)pIP->wpOrigDotProc[2]);
DestroyWindow (pIP->hwndDot[0]);
DestroyWindow (pIP->hwndDot[1]);
DestroyWindow (pIP->hwndDot[2]);
SetWindowLong (pIP->hwndEdit[0],
GWL_WNDPROC, (LONG)pIP->wpOrigEditProc[0]);
SetWindowLong (pIP->hwndEdit[1],
GWL_WNDPROC, (LONG)pIP->wpOrigEditProc[1]);
SetWindowLong (pIP->hwndEdit[2],
GWL_WNDPROC, (LONG)pIP->wpOrigEditProc[2]);
SetWindowLong (pIP->hwndEdit[3],
GWL_WNDPROC, (LONG)pIP->wpOrigEditProc[3]);
DestroyWindow (pIP->hwndEdit[0]);
DestroyWindow (pIP->hwndEdit[1]);
DestroyWindow (pIP->hwndEdit[2]);
DestroyWindow (pIP->hwndEdit[3]);
break;
case WM_HELP :
{
LPHELPINFO lphi = (LPHELPINFO)lParam;
lphi->iCtrlId = pIP->iID;
lphi->hItemHandle = pIP->hwnd;
break;
}
case EM_SETREADONLY :
if (wParam)
pIP->dwStyle |= ES_READONLY;
else
pIP->dwStyle &= ~ES_READONLY;
SendMessage (pIP->hwndDot[0], msg, wParam, lParam);
SendMessage (pIP->hwndDot[1], msg, wParam, lParam);
SendMessage (pIP->hwndDot[2], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[0], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[1], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[2], msg, wParam, lParam);
SendMessage (pIP->hwndEdit[3], msg, wParam, lParam);
InvalidateRect (hwnd, NULL, TRUE);
break;
case PGP_IPM_SETADDRESS :
{
CHAR sz[4];
INT i;
NMHDR nmhdr;
i = HIBYTE(HIWORD(lParam));
wsprintf (sz, "%i", i);
SetWindowText (pIP->hwndEdit[3], sz);
i = LOBYTE(HIWORD(lParam));
wsprintf (sz, "%i", i);
SetWindowText (pIP->hwndEdit[2], sz);
i = HIBYTE(LOWORD(lParam));
wsprintf (sz, "%i", i);
SetWindowText (pIP->hwndEdit[1], sz);
i = LOBYTE(LOWORD(lParam));
wsprintf (sz, "%i", i);
SetWindowText (pIP->hwndEdit[0], sz);
for (i=0; i<4; i++)
pIP->bValid[i] = TRUE;
nmhdr.hwndFrom = pIP->hwnd;
nmhdr.idFrom = pIP->iID;
nmhdr.code = PGP_IPN_VALIDADDRESS;
SendMessage (pIP->hwndParent,
WM_NOTIFY, pIP->iID, (LPARAM)&nmhdr);
break;
}
case PGP_IPM_CLEARADDRESS :
{
NMHDR nmhdr;
INT i;
SetWindowText (pIP->hwndEdit[3], "");
SetWindowText (pIP->hwndEdit[2], "");
SetWindowText (pIP->hwndEdit[1], "");
SetWindowText (pIP->hwndEdit[0], "");
for (i=0; i<4; i++)
pIP->bValid[i] = FALSE;
nmhdr.hwndFrom = pIP->hwnd;
nmhdr.idFrom = pIP->iID;
nmhdr.code = PGP_IPN_INVALIDADDRESS;
SendMessage (pIP->hwndParent,
WM_NOTIFY, pIP->iID, (LPARAM)&nmhdr);
break;
}
case PGP_IPM_GETADDRESS :
{
BOOL bNotValid = FALSE;
CHAR sz[4];
INT i;
DWORD l;
if (lParam == 0)
break;
*(PDWORD)lParam = 0;
for (i=0; i<4; i++)
if (!pIP->bValid[i])
bNotValid = TRUE;
if (bNotValid)
break;
GetWindowText (pIP->hwndEdit[3], sz, 4);
i = atoi (sz);
i &= 0xFF;
l = i;
GetWindowText (pIP->hwndEdit[2], sz, 4);
i = atoi (sz);
i &= 0xFF;
l <<= 8;
l |= i;
GetWindowText (pIP->hwndEdit[1], sz, 4);
i = atoi (sz);
i &= 0xFF;
l <<= 8;
l |= i;
GetWindowText (pIP->hwndEdit[0], sz, 4);
i = atoi (sz);
i &= 0xFF;
l <<= 8;
l |= i;
*(PDWORD)lParam = l;
break;
}
case PGP_IPM_SETRANGE :
if (wParam > 3)
break;
pIP->iRangeLo[wParam] = LOWORD(lParam);
pIP->iRangeHi[wParam] = HIWORD(lParam);
break;
}
return (DefWindowProc (hwnd, msg, wParam, lParam));
}
// ____________________________________
//
// load and initialize control
VOID WINAPI
InitPGPIPAddressControl (VOID)
{
WNDCLASS wc;
InitCommonControls ();
// register new window class
wc.style = CS_DBLCLKS | CS_GLOBALCLASS | CS_PARENTDC; // Class style(s).
wc.lpfnWndProc = (WNDPROC) sIPAddressMsgProc;
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = sizeof (IPWndData*); // 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_PGPIPADDRESS; // Name used in CreateWindow
RegisterClass (&wc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -