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

📄 tempest.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 2 页
字号:

	if(gtv->hAlphaBmp!=NULL)
		DeleteObject(gtv->hAlphaBmp);
	gtv->hAlphaBmp=NULL;

	if(gtv->hTempABmp!=NULL)
		DeleteObject(gtv->hTempABmp);
	if(gtv->hTempBBmp!=NULL)
		DeleteObject(gtv->hTempBBmp);
	if(gtv->hTempCBmp!=NULL)
		DeleteObject(gtv->hTempCBmp);
	if(gtv->hTempDBmp!=NULL)
		DeleteObject(gtv->hTempDBmp);

	gtv->hTempABmp=gtv->hTempBBmp=gtv->hTempCBmp=gtv->hTempDBmp=NULL;
}

// Render the font bitmaps (either normal or tempest)
// if they aren't done already. Create the background 
// brush, and set the text and background colors.
void InitFontBitmap(HWND hwnd,GTV *gtv)
{
	LOGFONT lf;
	TEXTMETRIC tm;
	HDC hdc,hdcMem;

	// Get rid of all drawing elements to clean up
	UninitFontBitmap(gtv);

	// **** Create either normal or load tempest fonts ****
	SystemParametersInfo (SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0);
	strcpy(lf.lfFaceName,"Courier");  // as per prz
	lf.lfPitchAndFamily=FF_MODERN|FIXED_PITCH;

	gtv->hFixedWidthFont = CreateFontIndirect (&lf);

    hdc=GetDC(gtv->hdlg); // Get DC
	hdcMem=CreateCompatibleDC(hdc);

	SelectObject (hdcMem, gtv->hFixedWidthFont); // Font for non Tempest
	GetTextMetrics (hdcMem, &tm);

	if(gtv->bDoTempest)
	{
		if(tm.tmHeight>=19)
		{
			gtv->hTempABmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MA13X24));; // Tempest Font
			gtv->hTempBBmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MB13X24));; // Tempest Font
			gtv->hTempCBmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MC13X24));; // Tempest Font
			gtv->hTempDBmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MD13X24));; // Tempest Font

			gtv->LtrX=13;
			gtv->LtrY=24;
		}
		else
		{
			gtv->hTempABmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MA8X14));; // Tempest Font
			gtv->hTempBBmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MB8X14));; // Tempest Font
			gtv->hTempCBmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MC8X14));; // Tempest Font
			gtv->hTempDBmp = LoadBitmap (g_hinst, 
				MAKEINTRESOURCE (IDB_MD8X14));; // Tempest Font

			
			gtv->LtrX=8;
			gtv->LtrY=14;
		}

		gtv->TextColor=RGB(0,0,0); // White

		SelectObject(hdcMem,gtv->hTempABmp);  // Bitmap for hdcMem

		gtv->BackColor=GetPixel(hdcMem,0,0);
		gtv->hBackBrush=CreateSolidBrush(gtv->BackColor); // Create the brush needed
	}
	else
	{
		unsigned char myChar;
		RECT rc;
		int i,pos;

		gtv->TextColor=GetSysColor (COLOR_WINDOWTEXT); // Text Color
		gtv->BackColor=GetSysColor (COLOR_WINDOW); // Window Color

		gtv->hBackBrush=CreateSolidBrush(gtv->BackColor); // Create the brush needed

		gtv->LtrX=tm.tmMaxCharWidth;
		gtv->LtrY=tm.tmHeight;

		rc.top=rc.left=0;
		rc.right=MODX*gtv->LtrX; // 16 x 16 for 256 characters
		rc.bottom=MODX*gtv->LtrY;

		gtv->hAlphaBmp=CreateCompatibleBitmap(hdc,rc.right,rc.bottom); 
	    SelectObject(hdcMem,gtv->hAlphaBmp);  // Bitmap for hdcMem

		SetBkColor (hdcMem, gtv->BackColor);
		SetTextColor (hdcMem, gtv->TextColor);

		FillRect(hdcMem,&rc,gtv->hBackBrush);

		pos=0;

		for(i=32;i<=127;i++) // Draw standard charset in first 6 lines
		{
			myChar=(unsigned char)i;

			TextOut(hdcMem,
				(pos%MODX)*gtv->LtrX,
				(pos/MODX)*gtv->LtrY,
				&myChar,
				1);

			pos++;
		}

		for(i=160;i<=255;i++) // Draw high order charset in next 6 lines
		{
			myChar=(char)i;

			TextOut(hdcMem,
				(pos%MODX)*gtv->LtrX,
				(pos/MODX)*gtv->LtrY,
				&myChar,
				1);

			pos++;
		}
	}

	ReleaseDC(hwnd,hdc); // Release DC
	DeleteDC(hdcMem);

	RedoTempestList(gtv);
}

BOOL WINAPI TempestDlgProc(HWND hdlg, UINT uMsg, 
                             WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
        { 
			GTV *gtv;

			gtv=(GTV *)lParam;
			SetWindowLong(hdlg,GWL_USERDATA,(long)lParam);

			// Save some of our window handles
			gtv->hdlg=hdlg;
			gtv->hwndLB=GetDlgItem(hdlg,IDC_TEMPESTLIST);

			InitFontBitmap(gtv->hdlg,gtv);
			RedoTempestList(gtv);

			// Stick text into owner drawn list box and setup checkbox
			Button_SetCheck(GetDlgItem(hdlg,IDC_TEMPESTFONT),gtv->bDoTempest);

			// Force window to the foreground
			SetForegroundWindow(hdlg);
			SetFocus(gtv->hwndLB);
            return FALSE;
        }

		case WM_GETMINMAXINFO:
		{
			MINMAXINFO* lpmmi;

		    lpmmi = (MINMAXINFO*) lParam;
    		lpmmi->ptMinTrackSize.x = MINDLGX;
    		lpmmi->ptMinTrackSize.y = MINDLGY;
            break;
		}

        case WM_SIZE:
        {
			unsigned short Width, Height;
			Width = LOWORD(lParam);  // width of client area 
			Height = HIWORD(lParam); // height of client area 

			SizeTempest(hdlg,Width,Height);
			break;
        }

		// Make sure we set color to white/black for Tempest
		case WM_CTLCOLORLISTBOX:
		{          
			HDC hdcLB;
			HWND hwndLB;
			GTV *gtv;

			gtv=(GTV *)GetWindowLong(hdlg,GWL_USERDATA);

			hdcLB = (HDC) wParam;
			hwndLB = (HWND) lParam;

			SetTextColor(hdcLB,gtv->TextColor);
			SetBkColor(hdcLB, gtv->BackColor);
	
		  	return (BOOL)gtv->hBackBrush;
		}

        case WM_SYSCOLORCHANGE:
		{
			GTV *gtv;

			gtv=(GTV *)GetWindowLong(hdlg,GWL_USERDATA);
			InitFontBitmap(hdlg,gtv);
            break;
        }

        case WM_DRAWITEM: 
        {
			GTV *gtv;

			gtv=(GTV *)GetWindowLong(hdlg,GWL_USERDATA);

            Main_OnDrawItem(gtv,(LPDRAWITEMSTRUCT) lParam);
            return TRUE;
        }

        case WM_MEASUREITEM:
		{
			GTV *gtv;

			gtv=(GTV *)GetWindowLong(hdlg,GWL_USERDATA);

            Main_OnMeasureItem(gtv,(LPMEASUREITEMSTRUCT) lParam);
            return TRUE;
		}

		case WM_ACTIVATE:
		{
			if(LOWORD(wParam)==WA_INACTIVE)
			{
				// Killing the window right away _really_ irks
				// Win95, so we delay 50 ms (basically till everything
				// gets cleaned up in the OS)
				SetTimer(hdlg,DEACTIVATETIMERID,DEACTIVATETIME,NULL);
			}
			break;
		}

		// Here we kill the window from the timer...
		case WM_TIMER:
		case WM_CLOSE:
		case WM_DESTROY:
		case WM_QUIT:
		{
			EndDialog(hdlg, FALSE);
			break;
		}

        case WM_COMMAND:
        {
            switch(wParam)
            {
				case IDC_TEMPESTFONT:
				{
					GTV *gtv;

					gtv=(GTV *)GetWindowLong(hdlg,GWL_USERDATA);

					gtv->bDoTempest=!gtv->bDoTempest;

					InitFontBitmap(hdlg,gtv);

					InvalidateRect(gtv->hwndLB,NULL,TRUE);
					UpdateWindow(gtv->hwndLB);
				    break;
				}
						
				case IDCANCEL:
				{
					EndDialog(hdlg, FALSE);
					break;
				}
            }
            return TRUE;
        }

    }
    return FALSE;
}


UINT TempestViewer(void *PGPsc,HWND hwnd,char *pInput,DWORD dwInSize,BOOL bWarn)
{
	UINT ReturnValue = FALSE;
	BOOL DialogReturn = FALSE;
	WNDCLASS wndclass;
	PGPContextRef context;
	PGPMemoryMgrRef	memmgr;
	GTV *gtv;
	int Response;
	char szCaption[100];
	char szMessage[256];
	char *pWrappedInput;
	
	if(bWarn)
	{
		LoadString (g_hinst, IDS_FYEOCAPTION, szCaption, sizeof(szCaption));
		LoadString (g_hinst, IDS_FYEOMSG, szMessage, sizeof(szMessage));

		Response=MessageBox(hwnd,szMessage,szCaption,
			MB_OKCANCEL|MB_SETFOREGROUND|MB_ICONEXCLAMATION);
	
		if(Response==IDCANCEL)
			return FALSE;
	}

	assert(pInput);

	context=(PGPContextRef)PGPsc;
	memmgr = PGPGetContextMemoryMgr (context);

 	memset(&wndclass,0x00,sizeof(WNDCLASS));

    wndclass.style = CS_HREDRAW | CS_VREDRAW;                              
    wndclass.lpfnWndProc = (WNDPROC)DefDlgProc; 
    wndclass.cbClsExtra = 0;              
    wndclass.cbWndExtra = DLGWINDOWEXTRA;              
    wndclass.hInstance = g_hinst;       
    wndclass.hIcon = LoadIcon (g_hinst, MAKEINTRESOURCE(IDI_FYEO));
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = "PGPtempestClass";

    RegisterClass (&wndclass);

	// Globals structure for re-entrancy
	gtv=(GTV *)malloc(sizeof(GTV));
	memset(gtv,0x00,sizeof(GTV));

	// We always wrap tempest viewer at 70
	PGPtempestWrapBuffer (context,
		pInput,70,&pWrappedInput);

	gtv->pInput=pWrappedInput;
	gtv->bDoTempest=TRUE; // Always use Tempest font by default

	DialogReturn = DialogBoxParam(g_hinst, 
		MAKEINTRESOURCE(IDD_TEMPEST), hwnd, 
		TempestDlgProc, (LPARAM) gtv);

	UninitFontBitmap(gtv);

	free(gtv);

	// Free the word wrapped data
	PGPFreeData(pWrappedInput);

	return DialogReturn;
}

/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

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