⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipaddresscontrol.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	IPAddressControl.c - PGPnet ip address custom control
	
	$Id: IPAddressControl.c,v 1.3 2002/08/06 20:10:28 dallen Exp $
____________________________________________________________________________*/

#include <windows.h>
#include <commctrl.h>
#include "IPAddressControl.h"

// 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;
	NMIPADDRESS	nmipa;

	*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 '.' :
			uRetVal = RETURN_VALUE;
			if (GetWindowTextLength (hwnd) > 0)
			{
				DWORD	dwSel;
				dwSel = SendMessage (hwnd, EM_GETSEL, 0, 0);

				if (LOWORD (dwSel) == HIWORD (dwSel))
					uRetVal = MOVE_RIGHT_SELECT;
			}
			break;

		default :
			CallWindowProc (pIP->wpOrigEditProc[index], 
									hwnd, uMsg, wParam, lParam); 

			GetWindowText (hwnd, sz, sizeof(sz));
			i = atoi (sz);

			if (GetWindowTextLength (hwnd) > 0)
				pIP->bValid[index] = TRUE;
			else
				pIP->bValid[index] = FALSE;

			if (pIP->bValid[index])
			{
				if (i > pIP->iRangeHi[index])
				{
					nmipa.hdr.code = PGP_IPN_OUTOFRANGE;
					nmipa.hdr.hwndFrom = pIP->hwnd;
					nmipa.hdr.idFrom = pIP->iID;
					nmipa.uField = index;
					nmipa.uValue = i;
					nmipa.uRange = MAKELONG (
							pIP->iRangeLo[index], pIP->iRangeHi[index]);
					SendMessage (pIP->hwndParent, 
							WM_NOTIFY, pIP->iID, (LPARAM)&nmipa);

					wsprintf (sz, "%i", pIP->iRangeHi[index]);
					SetWindowText (hwnd, sz);
					SendMessage (hwnd, EM_SETSEL, 0, 3);

					uRetVal = RETURN_VALUE;
				}
				else if (i < pIP->iRangeLo[index])
				{
					nmipa.hdr.code = PGP_IPN_OUTOFRANGE;
					nmipa.hdr.hwndFrom = pIP->hwnd;
					nmipa.hdr.idFrom = pIP->iID;
					nmipa.uField = index;
					nmipa.uValue = i;
					nmipa.uRange = MAKELONG (
							pIP->iRangeLo[index], pIP->iRangeHi[index]);
					SendMessage (pIP->hwndParent, 
							WM_NOTIFY, pIP->iID, (LPARAM)&nmipa);

					wsprintf (sz, "%i", pIP->iRangeLo[index]);
					SetWindowText (hwnd, sz);
					SendMessage (hwnd, EM_SETSEL, 0, 3);

					uRetVal = RETURN_VALUE;
				}
				else 
				{
					if (GetWindowTextLength (hwnd) >= 3)
						uRetVal = MOVE_RIGHT_SELECT;
					else
						uRetVal = RETURN_VALUE;
				}
			}

			j = 0;
			for (i=0; i<4; i++)
			{
				if (pIP->bValid[i])
					j++;
			}

			switch (j) {
			case 0 :
				nmipa.hdr.code = PGP_IPN_EMPTYADDRESS;
				break;
			case 1 :
			case 2 :
			case 3 :
				nmipa.hdr.code = PGP_IPN_INVALIDADDRESS;
				break;
			
			case 4 :
				nmipa.hdr.code = PGP_IPN_VALIDADDRESS;
				break;
			}

			nmipa.hdr.hwndFrom = pIP->hwnd;
			nmipa.hdr.idFrom = pIP->iID;
			SendMessage (pIP->hwndParent, 
							WM_NOTIFY, pIP->iID, (LPARAM)&nmipa);

			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;
	}
} 

//	______________________________________________
//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -