зеркало из https://github.com/mozilla/gecko-dev.git
357 строки
8.6 KiB
C++
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...
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|