|
|
/* File: \wacker\tdll\banner.h (created 16-Mar-94)
* * Copyright 1996 by Hilgraeve, Inc -- Monroe, MI * All rights reserved * * $Revision: 14 $ * $Date: 4/16/02 2:36p $ */ #include <windows.h>
#pragma hdrstop
#include <commctrl.h>
#include <term\res.h>
#include "globals.h"
#include "tdll.h"
#include "stdtyp.h"
#include "assert.h"
#include "file_msc.h"
#include "errorbox.h"
#include "banner.h"
#include "misc.h"
#include "upgrddlg.h"
#include "stdtyp.h"
#include <emu\emu.h>
#include "term.hh" // This must be after emu.h
LRESULT CALLBACK BannerProc(HWND, UINT, WPARAM, LPARAM); STATIC_FUNC void banner_WM_PAINT(HWND hwnd); STATIC_FUNC void banner_WM_CREATE(HWND hwnd, LPCREATESTRUCT lpstCreate);
#define IDC_PB_UPGRADEINFO 101
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: bannerRegisterClass * * DESCRIPTION: * This function registers the window class for the banner window. * * ARGUEMENTS: * The task instance handle. * * RETURNS: * The usual TRUE/FALSE from a registration function. * */ BOOL bannerRegisterClass(HANDLE hInstance) { ATOM bRet = TRUE; WNDCLASSEX wnd;
memset(&wnd, 0, sizeof(WNDCLASSEX)); wnd.cbSize = sizeof(WNDCLASSEX);
if (GetClassInfoEx(hInstance, BANNER_DISPLAY_CLASS, &wnd) == FALSE) { wnd.style = CS_HREDRAW | CS_VREDRAW; wnd.lpfnWndProc = BannerProc; wnd.cbClsExtra = 0; wnd.cbWndExtra = sizeof(HANDLE); wnd.hInstance = hInstance; wnd.hIcon = extLoadIcon(MAKEINTRESOURCE(IDI_HYPERTERMINAL)); wnd.hCursor = LoadCursor(NULL, IDC_ARROW); wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wnd.lpszMenuName = NULL; wnd.lpszClassName = BANNER_DISPLAY_CLASS; wnd.hIconSm = extLoadIcon(MAKEINTRESOURCE(IDI_HYPERTERMINAL));
bRet = RegisterClassEx(&wnd); }
return bRet; }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: bannerCreateBanner * * DESCRIPTION: * This function is called to creat the banner window. The banner window is * a short lived window that the program can run without. * * ARGUEMENTS: * The task instance handle. * * RETURNS: * The handle of the banner window. * */ HWND bannerCreateBanner(HANDLE hInstance, LPTSTR pszTitle) { HWND hwndBanner = NULL; hwndBanner = CreateWindow(BANNER_DISPLAY_CLASS, pszTitle, BANNER_WINDOW_STYLE, 0, 0, 100, 100, NULL, NULL, hInstance, NULL); return hwndBanner; }
#define BANNER_FILE 1
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: BannerProc * * DESCRIPTION: * This is the window procedure for the initial banner window. * * ARGUEMENTS: * The usual stuff that a window proc gets. * * RETURNS: * All sorts of different stuff. * */ LRESULT CALLBACK BannerProc(HWND hwnd, UINT wMsg, WPARAM wPar, LPARAM lPar) { HBITMAP hBitmap = (HBITMAP)0; HWND hwndParent; #ifdef USE_PRIVATE_EDITION_3_BANNER
HWND hwndButton = 0; #endif
LPCREATESTRUCT lpstCreate = (LPCREATESTRUCT)lPar;
hwndParent = 0;
switch (wMsg) { case WM_CREATE: banner_WM_CREATE(hwnd, lpstCreate); break;
case WM_PAINT: banner_WM_PAINT(hwnd); break;
#ifdef USE_PRIVATE_EDITION_3_BANNER
case WM_SETFOCUS: // When we are displaying the "Upgrade" button, it is the only
// control in the banner. So we always want to have the focus
// on it. - cab:12/02/96
//
hwndButton = GetDlgItem(hwnd, IDC_PB_UPGRADEINFO); assert(hwndButton); SetFocus(hwndButton); break;
case WM_COMMAND: switch(wPar) { case IDC_PB_UPGRADEINFO: DoUpgradeDialog(hwnd); break;
default: break; } break; #endif
case WM_CHAR: case WM_KEYDOWN: case WM_KILLFOCUS: case WM_LBUTTONDOWN: hwndParent = (HWND)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (hwndParent) SendMessage(hwnd, WM_CLOSE, 0, 0); break;
case WM_DESTROY: hBitmap = (HBITMAP)GetWindowLongPtr(hwnd, 0); hwndParent = (HWND)GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (hBitmap != (HBITMAP)0) DeleteObject(hBitmap);
if (hwndParent) SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)0L);
break;
default: return DefWindowProc(hwnd, wMsg, wPar, lPar); }
return 0L; }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: utilDrawBitmap * * DESCRIPTION: * This function draws a bitmap in a window. * * ARGUMENTS: * hWnd -- handle of the window to draw in * hBitmap -- bitmap to be drawn * xStart -- starting coordinate * yStart -- starting coordinate * * RETURNS: * */ VOID FAR PASCAL utilDrawBitmap(HWND hWnd, HDC hDC, HBITMAP hBitmap, SHORT xStart, SHORT yStart) { BITMAP bm; HDC hdcMem; POINT ptSize, ptOrg;
if (hWnd && !hDC) hDC = GetDC(hWnd);
hdcMem = CreateCompatibleDC(hDC); SelectObject(hdcMem, hBitmap); SetMapMode(hdcMem, GetMapMode(hDC));
GetObject(hBitmap, sizeof(BITMAP), (LPTSTR)&bm);
// Convert device coordintes into logical coordinates.
//
ptSize.x = bm.bmWidth; ptSize.y = bm.bmHeight; DPtoLP(hDC, &ptSize, 1);
ptOrg.x = 0; ptOrg.y = 0; DPtoLP(hdcMem, &ptOrg, 1);
BitBlt(hDC, xStart, yStart, ptSize.x, ptSize.y, hdcMem, ptOrg.x, ptOrg.y, SRCCOPY);
DeleteDC(hdcMem);
if (hWnd && !hDC) ReleaseDC(hWnd, hDC);
return; }
// TODO:cab,11/29/96 put this where it belongs
//
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: * fontSetWindowFont * * DESCRIPTION: * Changes the font for the given window to the one specified. * * ARGUMENTS: * hwnd - Handle of the window. * pszFontName - Name of the new font. * iPointSize - The new font's point size. * * RETURNS: * 0 if successful, -1 if error * * AUTHOR: C. Baumgartner, 11/29/96 */ int fontSetWindowFont(HWND hwnd, LPCTSTR pszFontName, int iPointSize) { int iPixPerLogicalInch = 0; HDC hDC = 0; HFONT hFont = 0; LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT));
assert(hwnd); assert(pszFontName);
// Get the pixels per logical inch in the y direction.
//
hDC = GetDC(hwnd); iPixPerLogicalInch = GetDeviceCaps(hDC, LOGPIXELSY); ReleaseDC(hwnd, hDC);
// Compute the height of the font in logical units.
// This is simply: (iPointSize * iPixPerLogicalInch) / 72,
// don't ask me to derive that equation, I just got it from
// Charles Petzold's book.
//
lf.lfHeight = -MulDiv(iPointSize, iPixPerLogicalInch, 72);
// Set the font name.
//
//mpt:1-28-98 changed from strcpy so that it will handle dbcs font names
lstrcpy(lf.lfFaceName, pszFontName);
// Create the desired font.
//
hFont = CreateFontIndirect(&lf); if ( !hFont ) { assert(hFont); return -1; }
// Tell the window what it's new font is.
//
SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE,0));
return 0; }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: * * DESCRIPTION: * * ARGUMENTS: * * RETURNS: * */ STATIC_FUNC void banner_WM_CREATE(HWND hwnd, LPCREATESTRUCT lpstCreate) { RECT rc; HBITMAP hBitmap = (HBITMAP)0; BITMAP bm; INT x, y, cx, cy; #ifdef USE_PRIVATE_EDITION_3_BANNER
TCHAR achUpgradeInfo[100]; TCHAR ach[80]; INT nSize1; #endif
DWORD ExStyle;
ExStyle = (DWORD)GetWindowLongPtr(hwnd, GWL_EXSTYLE);
#if(WINVER >= 0x0500)
//
// [mhamid]: if it is mirrored then turn off mirroing.
//
if (ExStyle & WS_EX_LAYOUTRTL) { SetWindowLongPtr(hwnd, GWL_EXSTYLE, (LONG_PTR)(ExStyle & ~WS_EX_LAYOUTRTL)); } #endif // WINVER >= 0x0500
if (lpstCreate->hwndParent) SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lpstCreate->hwndParent);
//mpt:03-12-98 Changed the bitmap and avi to use system colors
//hBitmap = LoadBitmap(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_BM_BANNER));
hBitmap = (HBITMAP)LoadImage(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_BM_BANNER), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS); SetWindowLongPtr(hwnd, 0, (LONG_PTR)hBitmap);
GetObject(hBitmap, sizeof(BITMAP), (LPTSTR)&bm);
SetRect(&rc, 0, 0, bm.bmWidth, bm.bmHeight); AdjustWindowRect(&rc, BANNER_WINDOW_STYLE, FALSE);
cx = rc.right - rc.left; cy = rc.bottom - rc.top;
x = (GetSystemMetrics(SM_CXSCREEN) - cx) / 2; y = (GetSystemMetrics(SM_CYSCREEN) - cy) / 2;
MoveWindow(hwnd, x, y, cx, cy, TRUE);
if (lpstCreate->hwndParent) mscCenterWindowOnWindow(hwnd, lpstCreate->hwndParent);
// Create an "Upgrade Information" button. - cab:11/29/96
//
#ifdef USE_PRIVATE_EDITION_3_BANNER
{ HWND hwndButton = 0;
// Create the button, but don't put any text in it yet. We'll
// do that after we change the font.
//
hwndButton = CreateWindow("button", "", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, IDN_UPGRADE_BUTTON_X, IDN_UPGRADE_BUTTON_Y, IDN_UPGRADE_BUTTON_W, IDN_UPGRADE_BUTTON_H, hwnd, (HMENU)IDC_PB_UPGRADEINFO, glblQueryDllHinst(), NULL);
assert(hwndButton);
// Set the text font in the button to 8 point MS Sans Serif.
// mpt:1-21-98 moved font and size to resources
if (LoadString(glblQueryDllHinst(), IDS_UPGRADE_FONT_SIZE, ach, sizeof(ach)/sizeof(TCHAR))) { nSize1 = atoi(ach); } else { nSize1 = -8; }
LoadString(glblQueryDllHinst(), IDS_UPGRADE_FONT, ach, sizeof(ach)/sizeof(TCHAR));
if ( fontSetWindowFont(hwndButton, ach, nSize1) != 0 ) { assert(0); }
// Set the button text.
LoadString(glblQueryDllHinst(), IDS_UPGRADE_INFO, achUpgradeInfo, sizeof(achUpgradeInfo)/sizeof(TCHAR));
SetWindowText(hwndButton, achUpgradeInfo); } #endif
#if defined(INCL_SPINNING_GLOBE)
// Create an animation control and play spinning globe.
//
{ HWND hwndAnimate; //mpt:03-12-98 Changed the bitmap and avi to use system colors
hwndAnimate = Animate_Create(hwnd, 100, WS_VISIBLE | WS_CHILD | ACS_TRANSPARENT, glblQueryDllHinst());
MoveWindow(hwndAnimate, 177, 37, 118, 101, TRUE); Animate_Open(hwndAnimate, MAKEINTRESOURCE(IDR_GLOBE_AVI)); if (!IsTerminalServicesEnabled()) { Animate_Play(hwndAnimate, 0, -1, 1); } } #endif
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: * * DESCRIPTION: * * ARGUMENTS: * * RETURNS: * */ STATIC_FUNC void banner_WM_PAINT(HWND hwnd) { HDC hDC; HBITMAP hBitmap; PAINTSTRUCT ps; LOGFONT lf; HFONT hFont;
hDC = BeginPaint(hwnd, &ps); hBitmap = (HBITMAP)GetWindowLongPtr(hwnd, 0);
#ifdef USE_PRIVATE_EDITION_3_BANNER
// Don't draw over the button. - cab:11/29/96
//
ExcludeClipRect(hDC, IDN_UPGRADE_BUTTON_X, IDN_UPGRADE_BUTTON_Y, IDN_UPGRADE_BUTTON_X + IDN_UPGRADE_BUTTON_W, IDN_UPGRADE_BUTTON_Y + IDN_UPGRADE_BUTTON_H); #endif
if (hBitmap) utilDrawBitmap((HWND)0, hDC, hBitmap, 0, 0);
// In the HTPE 3 banner, the version # and lot # are now in the
// lower left corner of the bitmap. - cab:11/29/96
//
// Here's a mean trick. The HwndFrame guy doesn't get set until
// long after the banner goes up. Since we don't want the version
// number on the opening banner but do want it in the about portion
// this works. - mrw:3/17/95
//
//if (glblQueryHwndFrame())
{ memset(&lf, 0, sizeof(LOGFONT));
#ifndef NT_EDITION
lf.lfHeight = 14; #else
lf.lfHeight = 12; #endif
lf.lfCharSet = ANSI_CHARSET; //lf.lfWeight = FW_SEMIBOLD;
strcpy(lf.lfFaceName, "Arial");
hFont = CreateFontIndirect(&lf);
if (hFont) { hFont = SelectObject(hDC, hFont); //SetBkColor(hDC, RGB(0,255,0));
SetBkMode( hDC, TRANSPARENT ); #ifndef NT_EDITION
TextOut(hDC, 19, 230, "Build Date", 10); TextOut(hDC, 19, 242, __DATE__, strlen(__DATE__)); TextOut(hDC, 225, 230, "Copyright� 2001", 15); TextOut(hDC, 225, 242, "Hilgraeve Inc.", 14); #else
TextOut(hDC, 19, 260, "Copyright� 2001 Microsoft Corporation. All rights reserved.", 59); TextOut(hDC, 19, 272, "Portions Copyright� 1995-2001 Hilgraeve, Inc. All Rights reserved.", 66); #endif
DeleteObject(SelectObject(hDC, hFont)); } }
EndPaint(hwnd, &ps); }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* FUNCTION: bannerUnregisterClass * * DESCRIPTION: * This function unregisters the window class for the banner window. * * ARGUEMENTS: * The task instance handle. * * RETURNS: * The usual TRUE/FALSE from a registration function. * */ BOOL bannerUnregisterClass(HANDLE hInstance) { return UnregisterClass(BANNER_DISPLAY_CLASS, hInstance); }
|