📄 ipaddresscontrol.c
字号:
/*____________________________________________________________________________
Copyright (C) 1998 Network Associates, Inc.
All rights reserved.
IPAddressControl.c - PGPnet ip address custom control
$Id: IPAddressControl.c,v 1.9 1999/04/01 14:53:55 pbj Exp $
____________________________________________________________________________*/
#include <windows.h>
#include <commctrl.h>
#include "IPAddressControl.h"
///>>> these shouldn't be here for a generalized control,
///>>> but they're needed here for getting error message strings
#include "resource.h"
extern HINSTANCE g_hinst;
///<<<
// IPAddress window extra data. Must include window handle field.
typedef struct _IPWndData {
HWND hwnd;
HWND hwndParent;
INT iID;
DWORD dwStyle;
DWORD dwFlags;
HWND hwndEdit[4];
WNDPROC wpOrigEditProc[4];
INT iRangeLo[4];
INT iRangeHi[4];
BOOL bValid[4];
HWND hwndDot[3];
WNDPROC wpOrigDotProc[3];
HFONT hFont;
} IPWndData;
#define IPFLAG_DISABLED 0x0001
#define RETURN_VALUE 0
#define NORMAL_PROCESSING 1
#define MOVE_LEFT 2
#define MOVE_RIGHT 3
#define MOVE_RIGHT_SELECT 4
#define VERTICAL_OFFSET 2
#define IDC_EDIT0 1000
#define IDC_EDIT1 1001
#define IDC_EDIT2 1002
#define IDC_EDIT3 1003
#define IDC_DOT0 1004
#define IDC_DOT1 1005
#define IDC_DOT2 1006
#define IPAddress_GetPtr(hwnd) (IPWndData*)GetWindowLong((hwnd), 0)
#define IPAddress_SetPtr(hwnd, pIP) \
(IPWndData*)SetWindowLong((hwnd), 0, (LONG)(pIP))
// ____________________________________
//
// Private memory allocation routine
VOID*
IPAlloc (LONG size)
{
VOID* p;
p = malloc (size);
if (p)
memset (p, 0, size);
return p;
}
// ____________________________________
//
// Private memory deallocation routine
VOID
IPFree (VOID* p)
{
if (p)
free (p);
}
// ______________________________________________
//
// post error message about number being out of range
static VOID
sErrorMessage (
HWND hwnd,
INT iVal,
INT iRangeLo,
INT iRangeHi)
{
CHAR sz1[256];
CHAR sz2[256];
LoadString (g_hinst, IDS_INVALIDIPFIELD, sz1, sizeof(sz1));
wsprintf (sz2, sz1, iVal, iRangeLo, iRangeHi);
LoadString (g_hinst, IDS_CAPTION, sz1, sizeof(sz1));
MessageBox (hwnd, sz2, sz1, MB_OK|MB_ICONEXCLAMATION);
}
// ______________________________________________
//
// common "edit" edit box subclass procedures
static UINT
sCommonEditProc (
HWND hwnd,
IPWndData* pIP,
INT index,
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
LRESULT* lReturn)
{
INT i, j;
DWORD dwStart;
DWORD dwEnd;
POINT pt;
CHAR sz[8];
UINT uRetVal;
NMHDR nmhdr;
*lReturn = 0;
uRetVal = NORMAL_PROCESSING;
switch (uMsg) {
case WM_GETDLGCODE :
*lReturn = DLGC_WANTARROWS|DLGC_WANTCHARS;
return RETURN_VALUE;
case WM_KEYDOWN :
switch (wParam) {
case VK_DOWN :
wParam = VK_RIGHT;
case VK_RIGHT :
SendMessage (hwnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
if (dwStart == dwEnd)
{
GetCaretPos (&pt);
i = SendMessage (hwnd,
EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));
if (i == GetWindowTextLength (hwnd))
uRetVal = MOVE_RIGHT;
}
break;
case VK_UP :
wParam = VK_LEFT;
case VK_LEFT :
case VK_BACK :
SendMessage (hwnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
if (dwStart == dwEnd)
{
GetCaretPos (&pt);
i = SendMessage (hwnd,
EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));
if (i == 0)
uRetVal = MOVE_LEFT;
}
break;
case VK_HOME :
SetFocus (pIP->hwndEdit[0]);
SendMessage (pIP->hwndEdit[0], EM_SETSEL, 0, 0);
uRetVal = RETURN_VALUE;
break;
case VK_END :
SetFocus (pIP->hwndEdit[3]);
SendMessage (pIP->hwndEdit[3], EM_SETSEL, 3, 3);
uRetVal = RETURN_VALUE;
break;
}
break;
case WM_CHAR :
switch (wParam) {
case '.' :
if (GetWindowTextLength (hwnd) > 0)
uRetVal = MOVE_RIGHT_SELECT;
else
uRetVal = RETURN_VALUE;
break;
default :
CallWindowProc (pIP->wpOrigEditProc[index],
hwnd, uMsg, wParam, lParam);
GetWindowText (hwnd, sz, sizeof(sz));
i = atoi (sz);
if (i > pIP->iRangeHi[index])
{
wsprintf (sz, "%i", pIP->iRangeHi[index]);
SetWindowText (hwnd, sz);
SendMessage (hwnd, EM_SETSEL, 0, 3);
sErrorMessage (hwnd, i,
pIP->iRangeLo[index], pIP->iRangeHi[index]);
uRetVal = RETURN_VALUE;
}
else if (i < pIP->iRangeLo[index])
{
wsprintf (sz, "%i", pIP->iRangeLo[index]);
SetWindowText (hwnd, sz);
SendMessage (hwnd, EM_SETSEL, 0, 3);
sErrorMessage (hwnd, i,
pIP->iRangeLo[index], pIP->iRangeHi[index]);
uRetVal = RETURN_VALUE;
}
else
{
if (GetWindowTextLength (hwnd) >= 3)
uRetVal = MOVE_RIGHT_SELECT;
else
uRetVal = RETURN_VALUE;
}
if (GetWindowTextLength (hwnd) > 0)
pIP->bValid[index] = TRUE;
else
pIP->bValid[index] = FALSE;
j = 0;
for (i=0; i<4; i++)
{
if (pIP->bValid[i])
j++;
}
switch (j) {
case 0 :
nmhdr.code = PGP_IPN_EMPTYADDRESS;
break;
case 1 :
case 2 :
case 3 :
nmhdr.code = PGP_IPN_INVALIDADDRESS;
break;
case 4 :
nmhdr.code = PGP_IPN_VALIDADDRESS;
break;
}
nmhdr.hwndFrom = pIP->hwnd;
nmhdr.idFrom = pIP->iID;
SendMessage (pIP->hwndParent,
WM_NOTIFY, pIP->iID, (LPARAM)&nmhdr);
break;
}
break;
}
return uRetVal;
}
// ______________________________________________
//
// "edit" edit box subclass procedures
static LRESULT APIENTRY
sEdit0Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP = IPAddress_GetPtr(GetParent (hwnd));
LRESULT lReturn;
UINT u;
u = sCommonEditProc (hwnd, pIP, 0, uMsg, wParam, lParam, &lReturn);
switch (u) {
case RETURN_VALUE :
return lReturn;
case NORMAL_PROCESSING :
return CallWindowProc (pIP->wpOrigEditProc[0],
hwnd, uMsg, wParam, lParam);
case MOVE_RIGHT :
SetFocus (pIP->hwndEdit[1]);
return 0;
case MOVE_RIGHT_SELECT :
SetFocus (pIP->hwndEdit[1]);
SendMessage (pIP->hwndEdit[1], EM_SETSEL, 0, 3);
return 0;
case MOVE_LEFT :
return 0;
default :
return 0;
}
}
static LRESULT APIENTRY
sEdit1Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP = IPAddress_GetPtr(GetParent (hwnd));
LRESULT lReturn;
UINT u;
u = sCommonEditProc (hwnd, pIP, 1, uMsg, wParam, lParam, &lReturn);
switch (u) {
case RETURN_VALUE :
return lReturn;
case NORMAL_PROCESSING :
return CallWindowProc (pIP->wpOrigEditProc[1],
hwnd, uMsg, wParam, lParam);
case MOVE_RIGHT :
SetFocus (pIP->hwndEdit[2]);
return 0;
case MOVE_RIGHT_SELECT :
SetFocus (pIP->hwndEdit[2]);
SendMessage (pIP->hwndEdit[2], EM_SETSEL, 0, 3);
return 0;
case MOVE_LEFT :
SetFocus (pIP->hwndEdit[0]);
SendMessage (pIP->hwndEdit[0], EM_SETSEL, 3, 3);
return 0;
default :
return 0;
}
}
static LRESULT APIENTRY
sEdit2Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP = IPAddress_GetPtr(GetParent (hwnd));
LRESULT lReturn;
UINT u;
u = sCommonEditProc (hwnd, pIP, 2, uMsg, wParam, lParam, &lReturn);
switch (u) {
case RETURN_VALUE :
return lReturn;
case NORMAL_PROCESSING :
return CallWindowProc (pIP->wpOrigEditProc[2],
hwnd, uMsg, wParam, lParam);
case MOVE_RIGHT :
SetFocus (pIP->hwndEdit[3]);
return 0;
case MOVE_RIGHT_SELECT :
SetFocus (pIP->hwndEdit[3]);
SendMessage (pIP->hwndEdit[3], EM_SETSEL, 0, 3);
return 0;
case MOVE_LEFT :
SetFocus (pIP->hwndEdit[1]);
SendMessage (pIP->hwndEdit[1], EM_SETSEL, 3, 3);
return 0;
default :
return 0;
}
}
static LRESULT APIENTRY
sEdit3Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP = IPAddress_GetPtr(GetParent (hwnd));
LRESULT lReturn;
UINT u;
u = sCommonEditProc (hwnd, pIP, 3, uMsg, wParam, lParam, &lReturn);
switch (u) {
case RETURN_VALUE :
return lReturn;
case NORMAL_PROCESSING :
return CallWindowProc (pIP->wpOrigEditProc[3],
hwnd, uMsg, wParam, lParam);
case MOVE_RIGHT :
case MOVE_RIGHT_SELECT :
return 0;
case MOVE_LEFT :
SetFocus (pIP->hwndEdit[2]);
SendMessage (pIP->hwndEdit[2], EM_SETSEL, 3, 3);
return 0;
default :
return 0;
}
}
// ______________________________________________
//
// "dot" edit box subclass procedures
static LRESULT APIENTRY
sDot0Proc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
IPWndData* pIP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -