icqwiz.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 515 行

C
515
字号
/*__________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: ICQwiz.c,v 1.4 2002/08/06 20:09:42 dallen Exp $
__________________________________________________________________________*/
#include "precomp.h"

// constant definitions
#define ICQWIZ_INTRO	0
#define ICQWIZ_INFO		1
#define ICQWIZ_DONE		2
#define NUM_WIZ_PAGES	3

//	____________________________________
//
//  set font of heading text

static HFONT
sLoadHeadingFont (
		BOOL	bInterior)
{
	LOGFONT		lf;

	memset (&lf, 0, sizeof(lf));

	if (bInterior)
	{
		LoadString (g_hinst, IDS_INTERIORWIZFONT,
				lf.lfFaceName, sizeof(lf.lfFaceName));
		lf.lfHeight = 8;
		lf.lfWeight = FW_BOLD;
	}
	else
	{
		LoadString (g_hinst, IDS_INTROWIZFONT,
				lf.lfFaceName, sizeof(lf.lfFaceName));
		lf.lfWeight = FW_BOLD;
	}

	return (CreateFontIndirect (&lf));
}

//	______________________________________________
//
//  Dialog procedure for "Finish" dialog

static LRESULT WINAPI
sICQWizardDoneDlgProc (
		HWND	hwnd,
		UINT	uMsg,
		WPARAM	wParam,
		LPARAM	lParam)
{
	ICQWIZINFO			*iwi;
	BOOL			bReturnCode = FALSE;

	switch (uMsg) {
	case WM_INITDIALOG:
	{
		PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;

		iwi = (ICQWIZINFO *) ppspMsgRec->lParam;
		SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)iwi);

		SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
				(WPARAM)iwi->hfontIntro, (LPARAM)FALSE);
		break;
	}

	case WM_PAINT :
		iwi = (ICQWIZINFO *)GetWindowLong (hwnd, GWL_USERDATA);

		if (iwi->hpaletteDone)
		{
			PAINTSTRUCT ps;
			HDC			hDC = BeginPaint (hwnd, &ps);

			SelectPalette (hDC, iwi->hpaletteDone, FALSE);
			RealizePalette (hDC);
			EndPaint (hwnd, &ps);
		}
		break;

	case WM_NOTIFY:
	{
		LPNMHDR pnmh = (LPNMHDR) lParam;

		switch (pnmh->code) {
		case PSN_SETACTIVE:
			iwi = (ICQWIZINFO *)GetWindowLong (hwnd, GWL_USERDATA);

			PostMessage (GetParent (hwnd),
				PSM_SETWIZBUTTONS, 0, PSWIZB_FINISH);

			SendDlgItemMessage (hwnd, IDC_WIZBITMAP, STM_SETIMAGE,
					IMAGE_BITMAP, (LPARAM) iwi->hbitmapDone);

			SetWindowLong (hwnd, DWL_MSGRESULT, 0L);
			bReturnCode = TRUE;
			break;

		case PSN_WIZFINISH:
		{
			iwi = (ICQWIZINFO *)GetWindowLong (hwnd, GWL_USERDATA);

			SetWindowLong(hwnd, DWL_MSGRESULT, 0L);
			bReturnCode = TRUE;
			break;
		}
		}
		break;
	}
	}

	return bReturnCode;
}


//	______________________________________________
//
//  Dialog procedure for getting name and email address
//  from user

static LRESULT WINAPI
sICQWizardInfoDlgProc (
		HWND	hwnd,
		UINT	uMsg,
		WPARAM	wParam,
		LPARAM	lParam)
{
	ICQWIZINFO			*iwi;
	BOOL			bReturnCode = FALSE;

	switch (uMsg) {
	case WM_INITDIALOG:
		{
			PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;

			iwi = (ICQWIZINFO *) ppspMsgRec->lParam;
			SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)iwi);

			SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
					(WPARAM)iwi->hfontInterior, (LPARAM)FALSE);

			SetWindowText(GetDlgItem(hwnd,IDC_ICQNAME), iwi->NameBuff);
			SetWindowText(GetDlgItem(hwnd,IDC_ICQNUM), iwi->NumBuff);
			break;
		}

	case WM_NOTIFY:
	{
		LPNMHDR pnmh = (LPNMHDR) lParam;

		switch(pnmh->code) {
		case PSN_SETACTIVE:
			PostMessage(GetParent(hwnd),
				PSM_SETWIZBUTTONS, 0, PSWIZB_BACK|PSWIZB_NEXT);
			SetWindowLong(hwnd, DWL_MSGRESULT, 0L);
			bReturnCode = TRUE;
			break;

		case PSN_WIZNEXT:
		{
			iwi = (ICQWIZINFO *)GetWindowLong (hwnd, GWL_USERDATA);

			GetWindowText(GetDlgItem(hwnd,IDC_ICQNAME), 
				iwi->NameBuff, 255);

			GetWindowText(GetDlgItem(hwnd,IDC_ICQNUM), 
				iwi->NumBuff, 255);

			if(!CreateUserID(hwnd,iwi))
				SetWindowLong(hwnd,DWL_MSGRESULT,-1);

			iwi->bResult=TRUE;

			return TRUE;
		}
		}
	}
	}

	return bReturnCode;
}

//	______________________________________________
//
//  Dialog procedure for handling beginning introductory
//  dialog.

static LRESULT WINAPI
sICQWizardIntroDlgProc (
		HWND	hwnd,
		UINT	uMsg,
		WPARAM	wParam,
		LPARAM	lParam)
{
	BOOL			bReturnCode = FALSE;
	ICQWIZINFO			*iwi			= NULL;

	switch (uMsg) {
	case WM_INITDIALOG:
	{
		PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;

		iwi = (ICQWIZINFO *) ppspMsgRec->lParam;
		SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)iwi);

		// center dialog on screen
		PGPclCenterWindowOnMonitor (GetParent(hwnd), kPGPclWindowMonitor);

		SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
				(WPARAM)iwi->hfontIntro, (LPARAM)FALSE);
		break;
	}

	case WM_ACTIVATE :
		InvalidateRect (hwnd, NULL, TRUE);
		break;

	case WM_PAINT :
		iwi = (ICQWIZINFO *)GetWindowLong (hwnd, GWL_USERDATA);

		if (iwi->hpaletteIntro)
		{
			PAINTSTRUCT ps;
			HDC			hDC = BeginPaint (hwnd, &ps);

			SelectPalette (hDC, iwi->hpaletteIntro, FALSE);
			RealizePalette (hDC);
			EndPaint (hwnd, &ps);
		}
		break;

	case WM_NOTIFY:
	{
		LPNMHDR pnmh = (LPNMHDR) lParam;

		switch(pnmh->code) {
		case PSN_SETACTIVE:
			iwi = (ICQWIZINFO *)GetWindowLong (hwnd, GWL_USERDATA);

			PostMessage(GetParent(hwnd),
					PSM_SETWIZBUTTONS, 0, PSWIZB_NEXT);
			SendDlgItemMessage(hwnd, IDC_WIZBITMAP, STM_SETIMAGE,
					IMAGE_BITMAP, (LPARAM) iwi->hbitmapIntro);

			SetWindowLong(hwnd, DWL_MSGRESULT, 0L);
			bReturnCode = TRUE;
			break;
		}

		break;
	}
	}

	return bReturnCode;
}


//	______________________________________________
//
// Load DIB bitmap and associated palette

static HPALETTE
sCreateDIBPalette (
		LPBITMAPINFO	lpbmi,
		LPINT			lpiNumColors)
{
	LPBITMAPINFOHEADER lpbi;
	LPLOGPALETTE lpPal;
	HANDLE hLogPal;
	HPALETTE hPal = NULL;
	INT i;

	lpbi = (LPBITMAPINFOHEADER)lpbmi;
	if (lpbi->biBitCount <= 8)
		*lpiNumColors = (1 << lpbi->biBitCount);
	else
		*lpiNumColors = 0;  // No palette needed for 24 BPP DIB

	if (*lpiNumColors)
	{
		hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) +
                             sizeof (PALETTEENTRY) * (*lpiNumColors));
		lpPal = (LPLOGPALETTE) GlobalLock (hLogPal);
		lpPal->palVersion = 0x300;
		lpPal->palNumEntries = *lpiNumColors;

		for (i = 0;  i < *lpiNumColors;  i++)
		{
			lpPal->palPalEntry[i].peRed   = lpbmi->bmiColors[i].rgbRed;
			lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
			lpPal->palPalEntry[i].peBlue  = lpbmi->bmiColors[i].rgbBlue;
			lpPal->palPalEntry[i].peFlags = 0;
		}
		hPal = CreatePalette (lpPal);
		GlobalUnlock (hLogPal);
		GlobalFree (hLogPal);
   }
   return hPal;
}


static HBITMAP
sLoadResourceBitmap (
		HINSTANCE	hInstance,
		LPSTR		lpString,
		HPALETTE*	phpalette)
{
	HRSRC  hRsrc;
	HGLOBAL hGlobal;
	HBITMAP hbitmapFinal = NULL;
	LPBITMAPINFOHEADER lpbi;
	HDC hdc;
    INT iNumColors;

	if (hRsrc = FindResource (hInstance, lpString, RT_BITMAP))
	{
		hGlobal = LoadResource (hInstance, hRsrc);
		lpbi = (LPBITMAPINFOHEADER)LockResource (hGlobal);

		hdc = GetDC(NULL);
		*phpalette =  sCreateDIBPalette ((LPBITMAPINFO)lpbi, &iNumColors);
		if (*phpalette)
		{
			SelectPalette (hdc,*phpalette,FALSE);
			RealizePalette (hdc);
		}

		hbitmapFinal = CreateDIBitmap (hdc,
                   (LPBITMAPINFOHEADER)lpbi,
                   (LONG)CBM_INIT,
                   (LPSTR)lpbi + lpbi->biSize + iNumColors * sizeof(RGBQUAD),
                   (LPBITMAPINFO)lpbi,
                   DIB_RGB_COLORS );

		ReleaseDC (NULL,hdc);
		UnlockResource (hGlobal);
		FreeResource (hGlobal);
	}
	return (hbitmapFinal);
}

#define ICQREGPATH "Software\\Mirabilis\\ICQ\\Owners"

DWORD ReadICQRegKey(void)
{
	DWORD dwICQ;
	HKEY hKey;

	dwICQ=0;

	if(RegOpenKeyEx(HKEY_CURRENT_USER,
						ICQREGPATH, 
						0, 
						KEY_ALL_ACCESS, 
						&hKey) == ERROR_SUCCESS) 
	{
		DWORD  size = sizeof(dwICQ);
		DWORD  type = 0;

		RegQueryValueEx(hKey, 
					"LastOwner", 
					0, 
					&type, 
					(LPBYTE)&dwICQ, 
					&size);
		RegCloseKey (hKey);
	}

	return dwICQ;
}

//	______________________________________________
//
//  Create wizard data structures and call PropertySheet
//  to actually create wizard

BOOL ICQUserIDWizard(HWND hwndParent,PGPContextRef Context,
					 PGPtlsContextRef tlsContext,
					 PGPKeyDBObjRef DefaultKey,PGPKeyDBRef KeyDB)
{
	ICQWIZINFO				*iwi;
	PROPSHEETPAGE		pspWiz[NUM_WIZ_PAGES];
	PROPSHEETHEADER		pshWiz;
	INT					iIndex;
	INT					iNumBits, iBitmap;
	HDC					hDC;
	LOGFONT				lf;
	DWORD				dwICQ;
	DWORD				u;
	char				*truncate;
	BOOL				RetVal;

	iwi=(ICQWIZINFO *)malloc(sizeof(ICQWIZINFO));
	memset(iwi,0x00,sizeof(ICQWIZINFO));

	iwi->Context=Context;
	iwi->tlsContext=tlsContext;
	iwi->DefaultKey=DefaultKey;
	iwi->KeyDB=KeyDB;

	dwICQ=ReadICQRegKey();

	if(dwICQ==0)
		strcpy(iwi->NumBuff,"");
	else
		sprintf(iwi->NumBuff,"%d",dwICQ);

	PGPclGetPrimaryUserIDName(DefaultKey,
		iwi->NameBuff, sizeof(iwi->NameBuff), &u);

	truncate=strstr(iwi->NameBuff," <");

	if(truncate!=0)
		*truncate=0;

	// set some convenient globals
	iwi->defaultfont = GetStockObject(DEFAULT_GUI_FONT);

	GetObject(iwi->defaultfont, sizeof(LOGFONT), &lf);

	lf.lfWeight = FW_BOLD;

	iwi->boldfont = CreateFontIndirect(&lf);

	// Determine which bitmap will be displayed in the wizard
	hDC = GetDC (NULL);	 // DC for desktop
	iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES);
	ReleaseDC (NULL, hDC);

	if (iNumBits <= 1)
		iBitmap = IDB_KEYWIZ1;
	else if (iNumBits <= 4)
		iBitmap = IDB_KEYWIZ4;
	else
		iBitmap = IDB_KEYWIZ8;

	iwi->hbitmapIntro = sLoadResourceBitmap (g_hinst,
			MAKEINTRESOURCE (iBitmap), &iwi->hpaletteIntro);
	iwi->hbitmapDone = sLoadResourceBitmap (g_hinst,
			MAKEINTRESOURCE (iBitmap), &iwi->hpaletteDone);

	// load special fonts
	iwi->hfontIntro = sLoadHeadingFont (FALSE);
	iwi->hfontInterior = sLoadHeadingFont (TRUE);

	// Set the values common to all pages
	for (iIndex=0; iIndex<NUM_WIZ_PAGES; iIndex++)
	{
		pspWiz[iIndex].dwSize		= sizeof(PROPSHEETPAGE);
		pspWiz[iIndex].dwFlags		= PSP_DEFAULT;
		pspWiz[iIndex].hInstance	= g_hinst;
		pspWiz[iIndex].pszTemplate  = NULL;
		pspWiz[iIndex].hIcon		= NULL;
		pspWiz[iIndex].pszTitle		= NULL;
		pspWiz[iIndex].pfnDlgProc   = NULL;
		pspWiz[iIndex].lParam		= (LPARAM) iwi;
		pspWiz[iIndex].pfnCallback  = NULL;
		pspWiz[iIndex].pcRefParent  = NULL;
	}

	// Set up the intro page
	pspWiz[ICQWIZ_INTRO].pszTemplate = MAKEINTRESOURCE(IDD_ICQWIZ_INTRO);
	pspWiz[ICQWIZ_INTRO].pfnDlgProc = sICQWizardIntroDlgProc;

	// Set up the gather drive page
	pspWiz[ICQWIZ_INFO].pszTemplate = MAKEINTRESOURCE(IDD_ICQWIZ_INFO);
	pspWiz[ICQWIZ_INFO].pfnDlgProc = sICQWizardInfoDlgProc;

	// Set up the final page
	pspWiz[ICQWIZ_DONE].pszTemplate = MAKEINTRESOURCE(IDD_ICQWIZ_DONE);
	pspWiz[ICQWIZ_DONE].pfnDlgProc = sICQWizardDoneDlgProc;

	// Create the header
	pshWiz.dwSize		= sizeof(PROPSHEETHEADER);
	pshWiz.dwFlags		= PSH_WIZARD | PSH_PROPSHEETPAGE;
	pshWiz.hwndParent   = hwndParent;
	pshWiz.hInstance	= g_hinst;
	pshWiz.hIcon		= NULL;
	pshWiz.pszCaption   = NULL;
	pshWiz.nPages		= NUM_WIZ_PAGES;
	pshWiz.nStartPage   = ICQWIZ_INTRO;

	pshWiz.ppsp			= pspWiz;
	pshWiz.pfnCallback  = NULL;

	// Execute the Wizard - doesn't return until Cancel or Save
	PropertySheet(&pshWiz);

	DeleteObject (iwi->hbitmapIntro);
	DeleteObject (iwi->hbitmapDone);
	DeleteObject (iwi->hfontIntro);
	DeleteObject (iwi->hfontInterior);
	DeleteObject (iwi->defaultfont);
	DeleteObject (iwi->boldfont);

	RetVal=iwi->bResult;

	free(iwi);

	return RetVal;
}

/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	iwi: ts=4 sw=4
	iwim: si
_____________________*/

⌨️ 快捷键说明

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