?? metal.cpp
字號:
// Name: univ/themes/metal.cpp
// Purpose: wxUniversal theme implementing Win32-like LNF
// Author: Vadim Zeitlin, Robert Roebling
// Modified by:
// Created: 06.08.00
// RCS-ID: $Id: metal.cpp,v 1.15 2005/05/31 09:28:50 JS Exp $
// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/timer.h"
#include "wx/intl.h"
#include "wx/dc.h"
#include "wx/window.h"
#include "wx/dcmemory.h"
#include "wx/button.h"
#include "wx/listbox.h"
#include "wx/checklst.h"
#include "wx/combobox.h"
#include "wx/scrolbar.h"
#include "wx/slider.h"
#include "wx/textctrl.h"
#include "wx/toolbar.h"
#ifdef __WXMSW__
// for COLOR_* constants
#include "wx/msw/private.h"
#endif
#endif // WX_PRECOMP
#include "wx/notebook.h"
#include "wx/spinbutt.h"
#include "wx/settings.h"
#include "wx/menu.h"
#include "wx/artprov.h"
#include "wx/toplevel.h"
#include "wx/univ/scrtimer.h"
#include "wx/univ/renderer.h"
#include "wx/univ/inphand.h"
#include "wx/univ/colschem.h"
#include "wx/univ/theme.h"
// wxMetalRenderer: draw the GUI elements in Metal style
// ----------------------------------------------------------------------------
class wxMetalRenderer : public wxDelegateRenderer
{
// FIXME cut'n'paste from Win32
enum wxArrowDirection
{
Arrow_Left,
Arrow_Right,
Arrow_Up,
Arrow_Down,
Arrow_Max
};
enum wxArrowStyle
{
Arrow_Normal,
Arrow_Disabled,
Arrow_Pressed,
Arrow_Inverted,
Arrow_InvertedDisabled,
Arrow_StateMax
};
public:
wxMetalRenderer(wxRenderer *renderer, wxColourScheme* scheme);
virtual void DrawButtonSurface(wxDC& dc,
const wxColour& WXUNUSED(col),
const wxRect& rect,
int WXUNUSED(flags))
{ DrawMetal(dc, rect); }
virtual void DrawScrollbarThumb(wxDC& dc,
wxOrientation orient,
const wxRect& rect,
int flags);
virtual void DrawScrollbarShaft(wxDC& dc,
wxOrientation orient,
const wxRect& rectBar,
int flags);
virtual void GetComboBitmaps(wxBitmap *bmpNormal,
wxBitmap *bmpFocus,
wxBitmap *bmpPressed,
wxBitmap *bmpDisabled);
virtual void DrawArrow(wxDC& dc,
wxDirection dir,
const wxRect& rect,
int flags = 0);
protected:
void DrawArrowButton(wxDC& dc,
const wxRect& rectAll,
wxArrowDirection arrowDir,
wxArrowStyle arrowStyle);
void DrawRect(wxDC& dc, wxRect *rect, const wxPen& pen);
void DrawShadedRect(wxDC& dc, wxRect *rect,
const wxPen& pen1, const wxPen& pen2);
void DrawArrowBorder(wxDC& dc, wxRect *rect, bool isPressed = false);
void DrawArrow(wxDC& dc, const wxRect& rect,
wxArrowDirection arrowDir, wxArrowStyle arrowStyle);
void DrawMetal(wxDC &dc, const wxRect &rect );
private:
wxPen m_penBlack,
m_penDarkGrey,
m_penLightGrey,
m_penHighlight;
wxBitmap m_bmpArrows[Arrow_StateMax][Arrow_Max];
};
// ----------------------------------------------------------------------------
// wxMetalTheme
// ----------------------------------------------------------------------------
WX_DEFINE_ARRAY_PTR(wxInputHandler *, wxArrayHandlers);
class wxMetalTheme : public wxTheme
{
public:
wxMetalTheme();
virtual ~wxMetalTheme();
virtual wxRenderer *GetRenderer();
virtual wxArtProvider *GetArtProvider();
virtual wxInputHandler *GetInputHandler(const wxString& control);
virtual wxColourScheme *GetColourScheme();
private:
bool GetOrCreateTheme()
{
if ( !m_win32Theme )
m_win32Theme = wxTheme::Create( wxT("win32") );
return m_win32Theme != NULL;
}
private:
wxTheme *m_win32Theme;
wxMetalRenderer *m_renderer;
WX_DECLARE_THEME(Metal)
};
// ============================================================================
// implementation
// ============================================================================
WX_IMPLEMENT_THEME(wxMetalTheme, Metal, wxTRANSLATE("Metal theme"));
// ----------------------------------------------------------------------------
// wxMetalTheme
// ----------------------------------------------------------------------------
wxMetalTheme::wxMetalTheme()
{
m_win32Theme = NULL;
m_renderer = NULL;
}
wxMetalTheme::~wxMetalTheme()
{
delete m_win32Theme;
delete m_renderer;
}
wxRenderer *wxMetalTheme::GetRenderer()
{
if ( !GetOrCreateTheme() )
return 0;
if ( !m_renderer )
m_renderer = new wxMetalRenderer(m_win32Theme->GetRenderer(),
m_win32Theme->GetColourScheme());
return m_renderer;
}
wxArtProvider *wxMetalTheme::GetArtProvider()
{
if ( !GetOrCreateTheme() )
return 0;
return m_win32Theme->GetArtProvider();
}
wxInputHandler *wxMetalTheme::GetInputHandler(const wxString& control)
{
if ( !GetOrCreateTheme() )
return 0;
return m_win32Theme->GetInputHandler(control);
}
wxColourScheme *wxMetalTheme::GetColourScheme()
{
if ( !GetOrCreateTheme() )
return 0;
return m_win32Theme->GetColourScheme();
}
// ----------------------------------------------------------------------------
// wxMetalRenderer
// ----------------------------------------------------------------------------
wxMetalRenderer::wxMetalRenderer(wxRenderer *renderer, wxColourScheme *scheme)
: wxDelegateRenderer(renderer)
{
// init colours and pens
m_penBlack = wxPen(wxSCHEME_COLOUR(scheme, SHADOW_DARK), 0, wxSOLID);
m_penDarkGrey = wxPen(wxSCHEME_COLOUR(scheme, SHADOW_OUT), 0, wxSOLID);
m_penLightGrey = wxPen(wxSCHEME_COLOUR(scheme, SHADOW_IN), 0, wxSOLID);
m_penHighlight = wxPen(wxSCHEME_COLOUR(scheme, SHADOW_HIGHLIGHT), 0, wxSOLID);
// init the arrow bitmaps
static const size_t ARROW_WIDTH = 7;
static const size_t ARROW_LENGTH = 4;
wxMask *mask;
wxMemoryDC dcNormal,
dcDisabled,
dcInverse;
for ( size_t n = 0; n < Arrow_Max; n++ )
{
bool isVertical = n > Arrow_Right;
int w, h;
if ( isVertical )
{
w = ARROW_WIDTH;
h = ARROW_LENGTH;
}
else
{
h = ARROW_WIDTH;
w = ARROW_LENGTH;
}
// disabled arrow is larger because of the shadow
m_bmpArrows[Arrow_Normal][n].Create(w, h);
m_bmpArrows[Arrow_Disabled][n].Create(w + 1, h + 1);
dcNormal.SelectObject(m_bmpArrows[Arrow_Normal][n]);
dcDisabled.SelectObject(m_bmpArrows[Arrow_Disabled][n]);
dcNormal.SetBackground(*wxWHITE_BRUSH);
dcDisabled.SetBackground(*wxWHITE_BRUSH);
dcNormal.Clear();
dcDisabled.Clear();
dcNormal.SetPen(m_penBlack);
dcDisabled.SetPen(m_penDarkGrey);
// calculate the position of the point of the arrow
wxCoord x1, y1;
if ( isVertical )
{
x1 = (ARROW_WIDTH - 1)/2;
y1 = n == Arrow_Up ? 0 : ARROW_LENGTH - 1;
}
else // horizontal
{
x1 = n == Arrow_Left ? 0 : ARROW_LENGTH - 1;
y1 = (ARROW_WIDTH - 1)/2;
}
wxCoord x2 = x1,
y2 = y1;
if ( isVertical )
x2++;
else
y2++;
for ( size_t i = 0; i < ARROW_LENGTH; i++ )
{
dcNormal.DrawLine(x1, y1, x2, y2);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -