📄 tempest.c
字号:
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 + -