зеркало из https://github.com/mozilla/gecko-dev.git
323 строки
7.4 KiB
C++
Executable File
323 строки
7.4 KiB
C++
Executable File
/* -*- 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.
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "animbar.h"
|
|
|
|
#define ANIMATION_WIDTH 20
|
|
#define ANIMATION_HEIGHT 20
|
|
#undef ANIMATION_PERIOD
|
|
#define ANIMATION_PERIOD (4000)
|
|
|
|
CAnimation::CAnimation(CWnd *pParent ): CWnd()
|
|
{
|
|
m_uAnimationClock = 0;
|
|
m_bInited = FALSE;
|
|
m_bCaptured = FALSE;
|
|
m_bDepressed = FALSE;
|
|
m_hAnimBitmap = NULL;
|
|
m_iAnimationCount = 0;
|
|
|
|
m_iconSize.cx = ANIMATION_WIDTH;
|
|
m_iconSize.cy = ANIMATION_HEIGHT;
|
|
|
|
CreateEx(0, NULL, _T("NSAnimation"),
|
|
WS_CHILD|WS_VISIBLE,
|
|
0, 0,
|
|
m_iconSize.cx + 4,
|
|
m_iconSize.cy + 4,
|
|
pParent->GetSafeHwnd(), (HMENU) 101);
|
|
|
|
//Changed AfxGetInstanceHandle to AfxGetResourceHandle to insure loading bitmaps
|
|
//from the LANG DLL and not netscape.exe benito
|
|
if (!m_bInited) {
|
|
CDC *pDC = GetDC();
|
|
|
|
m_hAnimBitmap = wfe_LoadBitmap(AfxGetResourceHandle(), pDC->m_hDC, MAKEINTRESOURCE(IDB_ANIMSMALL_0));
|
|
BITMAP bm;
|
|
GetObject( m_hAnimBitmap, sizeof(BITMAP), &bm );
|
|
m_iFrameCount = bm.bmWidth / m_iconSize.cx;
|
|
|
|
ReleaseDC( pDC );
|
|
|
|
m_bInited = TRUE;
|
|
}
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAnimation, CWnd)
|
|
ON_WM_PAINT()
|
|
ON_WM_TIMER()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_DESTROY()
|
|
END_MESSAGE_MAP()
|
|
|
|
void CAnimation::OnPaint()
|
|
{
|
|
CPaintDC dc(this);
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
WFE_Draw3DButtonRect( dc.m_hDC, &rect, m_bDepressed );
|
|
AnimateIcon();
|
|
}
|
|
|
|
|
|
void CAnimation::OnTimer(UINT nID)
|
|
{
|
|
CWnd::OnTimer(nID);
|
|
if (nID == WIN_ANIMATE_ICON_TIMER) {
|
|
if(m_bInited)
|
|
{
|
|
m_iAnimationCount = ( m_iAnimationCount % m_iFrameCount ) + 1;
|
|
AnimateIcon();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAnimation::OnLButtonDown( UINT nFlags, CPoint point )
|
|
{
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
m_bDepressed = ::PtInRect(&rect, point);
|
|
if (m_bDepressed) {
|
|
SetCapture();
|
|
m_bCaptured = TRUE;
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CAnimation::OnMouseMove( UINT nFlags, CPoint point )
|
|
{
|
|
if (m_bCaptured) {
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
BOOL bDepressed = ::PtInRect(&rect, point);
|
|
if (bDepressed != m_bDepressed) {
|
|
m_bDepressed = bDepressed;
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAnimation::OnLButtonUp( UINT nFlags, CPoint point )
|
|
{
|
|
|
|
if (m_bCaptured) {
|
|
ReleaseCapture();
|
|
m_bCaptured = FALSE;
|
|
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
BOOL bDepressed = ::PtInRect(&rect, point);
|
|
GetParentFrame()->SendMessage( WM_COMMAND, (WPARAM) ID_ANIMATION_BONK, (LPARAM) 0 );
|
|
}
|
|
|
|
m_bDepressed = FALSE;
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
|
|
void CAnimation::OnDestroy()
|
|
{
|
|
if (m_hAnimBitmap)
|
|
VERIFY(DeleteObject( m_hAnimBitmap ));
|
|
// Right now, the context has already been deleted, since
|
|
// it's not a true COM object.
|
|
// m_pIMWContext->Release();
|
|
}
|
|
|
|
void CAnimation::StopAnimation()
|
|
{
|
|
m_iAnimationCount = 0;
|
|
if (m_uAnimationClock)
|
|
KillTimer(m_uAnimationClock);
|
|
m_uAnimationClock = 0;
|
|
AnimateIcon();
|
|
}
|
|
|
|
void CAnimation::StartAnimation()
|
|
{
|
|
m_iAnimationCount = 1;
|
|
m_uAnimationClock = SetTimer(WIN_ANIMATE_ICON_TIMER, ANIMATION_PERIOD/m_iFrameCount, NULL);
|
|
}
|
|
|
|
void CAnimation::AnimateIcon()
|
|
{
|
|
CClientDC dc(this);
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
|
|
// check if our application level CDC exists
|
|
if(!theApp.pIconDC) {
|
|
theApp.pIconDC = new CDC;
|
|
theApp.pIconDC->CreateCompatibleDC(&dc);
|
|
}
|
|
|
|
HBITMAP hOldBitmap = (HBITMAP) theApp.pIconDC->SelectObject( m_hAnimBitmap );
|
|
|
|
dc.BitBlt( 2, 2,
|
|
m_iconSize.cx, m_iconSize.cy,
|
|
theApp.pIconDC,
|
|
m_iconSize.cx * m_iAnimationCount, // X offset into the strip
|
|
0,
|
|
SRCCOPY);
|
|
|
|
// Reselect the old object
|
|
theApp.pIconDC->SelectObject( hOldBitmap );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAnimationBar toolbar derived class
|
|
|
|
CAnimationBar::CAnimationBar( ): CAnimationBarParent ()
|
|
{
|
|
m_iconPt.x = 0;
|
|
m_iconPt.y = 0;
|
|
|
|
m_wndAnimation = NULL;
|
|
}
|
|
|
|
CAnimationBar::~CAnimationBar()
|
|
{
|
|
if ( m_wndAnimation ) {
|
|
m_wndAnimation->DestroyWindow();
|
|
}
|
|
}
|
|
|
|
void CAnimationBar::StartAnimation()
|
|
{
|
|
if (m_wndAnimation)
|
|
m_wndAnimation->StartAnimation();
|
|
}
|
|
|
|
void CAnimationBar::StopAnimation()
|
|
{
|
|
if (m_wndAnimation)
|
|
m_wndAnimation->StopAnimation();
|
|
}
|
|
|
|
#ifdef XP_WIN32
|
|
CSize CAnimationBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
|
|
{
|
|
CSize size = CAnimationBarParent::CalcFixedLayout(bStretch, bHorz);
|
|
if (m_wndAnimation) {
|
|
CRect rectAnimation;
|
|
m_wndAnimation->GetWindowRect(&rectAnimation);
|
|
|
|
int cy = rectAnimation.Height() + m_cyTopBorder + m_cyBottomBorder + 4;
|
|
if (size.cy < cy )
|
|
size.cy = cy;
|
|
}
|
|
return size;
|
|
}
|
|
|
|
CSize CAnimationBar::CalcDynamicLayout(int nLength, DWORD dwMode )
|
|
{
|
|
int nToolbarHeight = 0;
|
|
int nAnimationHeight = 0;
|
|
|
|
CRect animationRect;
|
|
|
|
if(m_wndAnimation)
|
|
{
|
|
m_wndAnimation->GetWindowRect(animationRect);
|
|
nAnimationHeight = animationRect.Height() + 4;
|
|
}
|
|
|
|
if(m_pToolbar)
|
|
{
|
|
nToolbarHeight = m_pToolbar->GetHeight() + 4;
|
|
}
|
|
|
|
return CSize(32767,
|
|
(nToolbarHeight > nAnimationHeight) ? nToolbarHeight : nAnimationHeight);
|
|
|
|
}
|
|
#endif
|
|
|
|
void CAnimationBar::PlaceToolbar(void)
|
|
{
|
|
CRect rectAnimation;
|
|
|
|
if ( m_wndAnimation ) {
|
|
m_wndAnimation->GetWindowRect(&rectAnimation);
|
|
CRect rectBar;
|
|
GetClientRect(&rectBar);
|
|
|
|
m_iconPt.x = rectBar.Width() - rectAnimation.Width() - GetSystemMetrics(SM_CXBORDER) - 1;
|
|
m_iconPt.y = rectBar.Height() / 2 - rectAnimation.Height() / 2 + 2;
|
|
|
|
if(m_pToolbar)
|
|
{
|
|
int nHeight = m_pToolbar->GetHeight();
|
|
// m_pToolbar->MoveWindow(0, (rectBar.Height() - nHeight) / 2 + 1, cx - rectAnimation.Width(), nHeight, FALSE);
|
|
m_pToolbar->SetWindowPos(NULL, 0, (rectBar.Height() - nHeight) / 2 + 1, m_iconPt.x, nHeight,
|
|
/*SWP_NOMOVE|*/ SWP_NOREDRAW);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAnimationBar, CAnimationBarParent)
|
|
ON_WM_CREATE()
|
|
ON_WM_SIZE()
|
|
END_MESSAGE_MAP()
|
|
|
|
int CAnimationBar::OnCreate( LPCREATESTRUCT lpCreateStruct )
|
|
{
|
|
int res = CAnimationBarParent::OnCreate( lpCreateStruct );
|
|
|
|
if ( res != -1 ) {
|
|
m_wndAnimation = new CAnimation( this );
|
|
res = m_wndAnimation ? 0 : -1;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
void CAnimationBar::OnSize( UINT nType, int cx, int cy )
|
|
{
|
|
CRect rectAnimation;
|
|
|
|
if ( nType != SIZE_MINIMIZED && m_wndAnimation ) {
|
|
m_wndAnimation->GetWindowRect(&rectAnimation);
|
|
CRect rectBar;
|
|
GetClientRect(&rectBar);
|
|
CClientDC dc( this );
|
|
|
|
m_iconPt.x = rectBar.Width() - rectAnimation.Width() - GetSystemMetrics(SM_CXBORDER) - 1;
|
|
m_iconPt.y = rectBar.Height() / 2 - rectAnimation.Height() / 2 + 2;
|
|
m_wndAnimation->SetWindowPos(NULL, m_iconPt.x, m_iconPt.y, 0, 0,
|
|
SWP_NOZORDER|SWP_NOSIZE);
|
|
|
|
if(m_pToolbar)
|
|
{
|
|
int nHeight = m_pToolbar->GetHeight();
|
|
// m_pToolbar->MoveWindow(0, (rectBar.Height() - nHeight) / 2 + 1, cx - rectAnimation.Width(), nHeight, FALSE);
|
|
m_pToolbar->SetWindowPos(NULL, 0, (rectBar.Height() - nHeight) / 2 + 1, m_iconPt.x, nHeight,
|
|
/*SWP_NOMOVE|*/ SWP_NOREDRAW);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|