gecko-dev/cmd/winfe/splash.cpp

357 строки
8.6 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
// splash.cpp : implementation file
//
#include "stdafx.h"
#include "splash.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#ifdef EDITOR
#endif
#define STATUS_TEXT_HEIGHT -14
#define COPYRIGHT_TEXT_HEIGHT 10
BEGIN_MESSAGE_MAP(CSplashWnd, CDialog)
//{{AFX_MSG_MAP(CSplashWnd)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BIGSPLASH, OnLogoClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSplashWnd dialog
CSplashWnd::CSplashWnd()
{
m_bNavBusyIniting = TRUE;
}
BOOL CSplashWnd::Create(CWnd* pParent)
{
//{{AFX_DATA_INIT(CSplashWnd)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
if (!CDialog::Create(CSplashWnd::IDD, pParent))
{
TRACE0("Warning: creation of CSplashWnd dialog failed\n");
return FALSE;
}
int frameCX = ::GetSystemMetrics(SM_CXDLGFRAME);
int frameCY = ::GetSystemMetrics(SM_CYDLGFRAME);
#ifdef WIN32
// figure out whether to change for Win 95
if (sysInfo.m_bWin4) {
frameCX = ::GetSystemMetrics(SM_CXFIXEDFRAME);
frameCY = ::GetSystemMetrics(SM_CYFIXEDFRAME);
}
#endif
SetWindowPos(&wndTopMost,
0, 0,
m_sizeBitmap.cx + (frameCX * 2),
m_sizeBitmap.cy + (frameCY * 2),
SWP_NOMOVE);
//Put this after we size the dialog with the bitmap.
CenterWindow();
return TRUE;
}
BOOL CSplashWnd::OnInitDialog()
{
const WORD splashTimeout = 2000;
CDialog::OnInitDialog();
// initialize the big icon control
m_icon.SubclassDlgItem(IDC_BIGSPLASH, this);
m_icon.SizeToContent(m_sizeBitmap);
m_timerID = 55;
m_timerID = SetTimer(m_timerID, splashTimeout, NULL); // N seconds
return TRUE; // return TRUE unless you set the focus to a control
}
/////////////////////////////////////////////////////////////////////////////
// CSplashWnd message handlers
void CSplashWnd::OnLogoClicked()
{
KillTimer(m_timerID);
EndDialog(NULL);
}
void CSplashWnd::OnTimer(UINT uTimerID)
{
if(m_bNavBusyIniting)
return; // wait for next timer interval
OnLogoClicked();
}
void CSplashWnd::NavDoneIniting()
{
m_bNavBusyIniting = FALSE;
DestroyWindow();
m_icon.CleanupResources();
}
void CSplashWnd::SafeHide()
{
if (GetSafeHwnd()) {
ShowWindow(SW_HIDE);
}
}
void CSplashWnd::DisplayStatus(LPCSTR lpszStatus)
{
ASSERT(lpszStatus);
m_icon.DisplayStatus(lpszStatus);
SetWindowText(lpszStatus);
}
/////////////////////////////////////////////////////////////////////////////
// CBigIcon
BEGIN_MESSAGE_MAP(CBigIcon, CButton)
//{{AFX_MSG_MAP(CBigIcon)
ON_WM_DRAWITEM()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBigIcon message handlers
CBigIcon::CBigIcon()
{
HFONT hFont;
LOGFONT lf1, lf2;
int Adjustment = 0;
#if _WIN32 // Try to fix bug #37584 (unicode support)
if( sysInfo.m_bWin4 )
{
hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
Adjustment = 2;
}
else
{
hFont = (HFONT)GetStockObject( OEM_FIXED_FONT );
}
#else
hFont = (HFONT)GetStockObject( OEM_FIXED_FONT );
#endif
VERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf1));
lf1.lfHeight = STATUS_TEXT_HEIGHT + Adjustment;
lf1.lfWidth = 2 + Adjustment;
VERIFY(m_font.CreateFontIndirect(&lf1));
VERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf2));
lf2.lfHeight = COPYRIGHT_TEXT_HEIGHT + Adjustment;
lf2.lfWidth = 2 + Adjustment;
VERIFY(m_copyrightFont.CreateFontIndirect(&lf2));
m_hBitmap = NULL;
}
CBigIcon::~CBigIcon()
{
}
void CBigIcon::CleanupResources(void)
{
if(m_hBitmap)
DeleteObject(m_hBitmap);
m_copyrightFont.DeleteObject();
m_font.DeleteObject();
}
#ifdef XP_WIN16
#define ADMNLIBNAME "adm1640.dll"
#elif defined XP_WIN32
#define ADMNLIBNAME "adm3240.dll"
#endif
void CBigIcon::SizeToContent(CSize& SizeBitmap)
{
// if admin kit library is here, load splash screen bitmap from it
HINSTANCE h = 0;
BOOL bFreeLibrary = FALSE;
#ifdef MOZ_ADMIN_LIB
h = LoadLibrary(ADMNLIBNAME);
#endif
UINT nBitmapID;
if (h < (HINSTANCE)HINSTANCE_ERROR) {
nBitmapID = IDB_PREVIEWSPLASH;
h = AfxGetResourceHandle();
} else {
nBitmapID = IDB_PREVIEWSPLASH;
bFreeLibrary = TRUE;
}
HDC hDC = ::GetDC(m_hWnd);
WFE_InitializeUIPalette(hDC);
HPALETTE hPalette = WFE_GetUIPalette(NULL);
HPALETTE hOldPalette = ::SelectPalette(hDC, hPalette, FALSE);
::RealizePalette(hDC);
m_hBitmap = wfe_LoadBitmap(h, hDC, MAKEINTRESOURCE(nBitmapID));
if (!m_hBitmap && bFreeLibrary) {
m_hBitmap = wfe_LoadBitmap(AfxGetResourceHandle(), hDC, MAKEINTRESOURCE(nBitmapID));
}
::SelectPalette(hDC, hOldPalette, TRUE);
::ReleaseDC(m_hWnd, hDC);
if (bFreeLibrary)
FreeLibrary(h);
BITMAP bm;
::GetObject(m_hBitmap, sizeof(bm), &bm);
m_sizeBitmap = CSize(bm.bmWidth, bm.bmHeight);
SizeBitmap = m_sizeBitmap;
SetWindowPos(NULL, 0, 0, bm.bmWidth, bm.bmHeight,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
}
void CBigIcon::DisplayCopyright(void)
{
CClientDC dc(this);
CFont* pOldFont = dc.SelectObject(&m_copyrightFont);
CRect rect;
LPCSTR lpszCopyright = szLoadString(IDS_COPYRIGHT);
// The splash screen background is black, use light grey text
dc.SetBkColor(RGB(0,0,0));
dc.SetTextColor(RGB(192, 192, 192));
CenterText(dc, lpszCopyright, 237);
// Clean up
dc.SetBkColor(RGB(255,255,255));
dc.SetTextColor(RGB(0,0,0));
dc.SelectObject(pOldFont);
}
void CBigIcon::DisplayStatus(LPCSTR lpszStatus)
{
CClientDC dc(this);
CFont* pOldFont = dc.SelectObject(&m_font);
// The splash screen background is black, so use white text
dc.SetBkColor(RGB(0,0,0));
dc.SetTextColor(RGB(255,255,255));
CenterText(dc, lpszStatus, 219);
// Clean up
dc.SetBkColor(RGB(255,255,255));
dc.SetTextColor(RGB(0,0,0));
dc.SelectObject(pOldFont);
}
void CBigIcon::CenterText(CClientDC &dc, LPCSTR lpszStatus, int top)
{
int nMargin;
CRect rect;
TEXTMETRIC tm;
// Leave a horizontal margin equal to the widest character
VERIFY(dc.GetTextMetrics(&tm));
nMargin = tm.tmMaxCharWidth;
// Compute the opaque rect
rect.left = nMargin;
rect.right = m_sizeBitmap.cx - nMargin;
rect.top = top;
rect.bottom = rect.top + tm.tmHeight;
// We need to compute where to draw the text so it is centered
// horizontally
int x = rect.left;
#ifdef MOZ_NGLAYOUT
// Maybe we should put CIntlWin back in the NGLayout build
// Right now, splash screen won't center text.
#else
CSize extent = CIntlWin::GetTextExtent(0, dc.m_hDC, lpszStatus, XP_STRLEN(lpszStatus));
if (extent.cx < rect.Width())
x += (rect.Width() - extent.cx) / 2;
#endif
// Draw opaquely so we can avoid erasing the old text
dc.ExtTextOut(x, rect.top, ETO_OPAQUE, &rect, lpszStatus, strlen(lpszStatus), NULL);
}
void CBigIcon::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
ASSERT(pDC != NULL);
HPALETTE hPalette = WFE_GetUIPalette(NULL);
HPALETTE hOldPalette = ::SelectPalette(lpDrawItemStruct->hDC, hPalette, FALSE);
::RealizePalette(lpDrawItemStruct->hDC);
CRect rect;
GetClientRect(rect);
int cxClient = rect.Width();
int cyClient = rect.Height();
// draw the bitmap contents
CDC dcMem;
if (!dcMem.CreateCompatibleDC(pDC))
return;
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(dcMem.m_hDC, m_hBitmap);
if (hOldBitmap == NULL)
return;
pDC->BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &dcMem, 0, 0, SRCCOPY);
::SelectObject(dcMem.m_hDC, hOldBitmap);
DisplayCopyright();
::SelectPalette(lpDrawItemStruct->hDC, hOldPalette, TRUE);
ReleaseDC(pDC);
}
BOOL CBigIcon::OnEraseBkgnd(CDC*)
{
return TRUE; // we don't do any erasing...
}
/////////////////////////////////////////////////////////////////////////////