⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metal.cpp

📁 Wxpython Implemented on Windows CE, Source code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////
// Name:        src/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.18 2006/06/13 20:44:47 ABX 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
    #include "wx/menu.h"
    #include "wx/settings.h"
    #include "wx/toplevel.h"
#endif // WX_PRECOMP

#include "wx/notebook.h"
#include "wx/spinbutt.h"
#include "wx/artprov.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++ )
        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -