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

📄 ipaddresscontrol.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*____________________________________________________________________________
	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 + -