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 + -
显示快捷键?