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

📄 newbmpbtn.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        newbmpbtn.cpp// Purpose:     wxNewBitmapButton enhanced bitmap button class.// Author:      Aleksandras Gluchovas// Modified by:// Created:     ??/09/98// RCS-ID:      $Id: newbmpbtn.cpp,v 1.20 2006/01/17 15:04:46 JS Exp $// Copyright:   (c) Aleksandras Gluchovas// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx/wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__#pragma hdrstop#endif#ifndef WX_PRECOMP#include "wx/wx.h"#endif#include "wx/fl/newbmpbtn.h"#include "wx/utils.h"     // import wxMin,wxMax macros#ifdef __WXMSW__#include "wx/msw/private.h"#endif///////////// button-label rendering helpers //////////////////static int* create_array( int width, int height, int fill = 0 ){    int* array = new int[width*height];    int len = width*height;    int i;    for ( i = 0; i != len; ++i )        array[i] = fill;    return array;}#define GET_ELEM(array,x,y) (array[width*(y)+(x)])#define MIN_COLOR_DIFF 10#define IS_IN_ARRAY(x,y) ( (x) < width && (y) < height && (x) >= 0 && (y) >= 0 )#define GET_RED(col)    col        & 0xFF#define GET_GREEN(col) (col >> 8)  & 0xFF#define GET_BLUE(col)  (col >> 16) & 0xFF#define MAKE_INT_COLOR(red,green,blue) (     (red)                      | \                                         ( ( (green) << 8 ) & 0xFF00  ) | \                                         ( ( (blue)  << 16) & 0xFF0000) \                                       )#define IS_GREATER(col1,col2) ( ( (GET_RED(col1)  ) > (GET_RED(col2)  ) + MIN_COLOR_DIFF ) && \                                ( (GET_GREEN(col1)) > (GET_GREEN(col2)) + MIN_COLOR_DIFF ) &&  \                                ( (GET_BLUE(col1) ) > (GET_BLUE(col2) ) + MIN_COLOR_DIFF )     \                              )#define MASK_BG    0#define MASK_DARK  1#define MASK_LIGHT 2// helper function, used internallystatic void gray_out_pixmap( int* src, int* dest, int width, int height ){    // assuming the pixels along the edges are of the background color    int x = 0;    int y = 1;    do    {        int cur       = GET_ELEM(src,x,y);        if ( IS_IN_ARRAY(x-1,y-1) )        {            int upperElem = GET_ELEM(src,x-1,y-1);            // if the upper element is lighter than current            if ( IS_GREATER(upperElem,cur) )            {                GET_ELEM(dest,x,y) = MASK_DARK;            }            else            // if the current element is ligher than the upper            if ( IS_GREATER(cur,upperElem) )            {                GET_ELEM(dest,x,y) = MASK_LIGHT;            }            else            {                if ( GET_ELEM(dest,x-1,y-1) == MASK_LIGHT )                    GET_ELEM(dest,x,y) = MASK_BG;                if ( GET_ELEM(dest,x-1,y-1 ) == MASK_DARK )                    GET_ELEM(dest,x,y) = MASK_DARK;                else                    GET_ELEM(dest,x,y) = MASK_BG;            }        }        // go zig-zag        if ( IS_IN_ARRAY(x+1,y-1) )        {            ++x;            --y;        }        else        {            while ( IS_IN_ARRAY(x-1,y+1) )            {                --x;                ++y;            }            if ( IS_IN_ARRAY(x,y+1) )            {                ++y;                continue;            }            else            {                if ( IS_IN_ARRAY(x+1,y) )                {                    ++x;                    continue;                }                else break;            }        }    } while (1);}// algorithm for making the image look "grayed" (e.g. disabled button)// NOTE:: used GetPixel(), which is Windows-Only!void gray_out_image_on_dc( wxDC& dc, int width, int height ){    // assuming the pixels along the edges are of the background color    wxColour bgCol;    dc.GetPixel( 0, 0, &bgCol );    wxPen darkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW),1, wxSOLID );    wxPen lightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT),1, wxSOLID );    wxPen bgPen   ( bgCol,                1, wxSOLID );    int* src  = create_array( width, height, MASK_BG );    int* dest = create_array( width, height, MASK_BG );    int x, y;    for ( y = 0; y != height; ++y )    {        for ( x = 0; x != width; ++x )        {            wxColour col;            dc.GetPixel( x,y, &col );            GET_ELEM(src,x,y) = MAKE_INT_COLOR( col.Red(), col.Green(), col.Blue() );        }    }    gray_out_pixmap( src, dest, width, height );    for ( y = 0; y != height; ++y )    {        for ( x = 0; x != width; ++x )        {            int mask = GET_ELEM(dest,x,y);            switch (mask)            {                case MASK_BG    : { dc.SetPen( bgPen );                                    dc.DrawPoint( x,y ); break;                                  }                case MASK_DARK  : { dc.SetPen( darkPen );                                    dc.DrawPoint( x,y ); break;                                  }                case MASK_LIGHT : { dc.SetPen( lightPen );                                    dc.DrawPoint( x,y ); break;                                  }                default : break;            }        }    }    delete [] src;    delete [] dest;}////////////////////////////////***** Implementation for class wxNewBitmapButton *****/IMPLEMENT_DYNAMIC_CLASS(wxNewBitmapButton, wxPanel)BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel )    EVT_LEFT_DOWN   ( wxNewBitmapButton::OnLButtonDown   )    EVT_LEFT_UP     ( wxNewBitmapButton::OnLButtonUp     )//    EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick )    EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDown )    EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter    )    EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave    )    EVT_SIZE ( wxNewBitmapButton::OnSize  )    EVT_PAINT( wxNewBitmapButton::OnPaint )    //EVT_KILL_FOCUS( wxNewBitmapButton::OnKillFocus )    EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground )    EVT_IDLE(wxNewBitmapButton::OnIdle)END_EVENT_TABLE()wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap,                                      const wxString& labelText,                                      int  alignText,                                      bool isFlat,                                      int  firedEventType,                                      int  marginX,                                      int  marginY,                                      int  textToLabelGap,                                      bool isSticky)    :   mTextToLabelGap  ( textToLabelGap ),        mMarginX( marginX ),        mMarginY( marginY ),        mTextAlignment( alignText ),        mIsSticky( isSticky ),        mIsFlat( isFlat ),        mLabelText( labelText ),        mImageFileType( wxBITMAP_TYPE_INVALID ),        mDepressedBmp( labelBitmap ),        mpDepressedImg( NULL ),        mpPressedImg  ( NULL ),        mpDisabledImg ( NULL ),        mpFocusedImg  ( NULL ),        mDragStarted  ( false ),        mIsPressed    ( false ),        mIsInFocus    ( false ),        mIsToggled    ( false ),        mHasFocusedBmp( false ),        mFiredEventType( firedEventType ),        mBlackPen( wxColour(  0,  0,  0), 1, wxSOLID ),        mDarkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ),        mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),        mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ),        mIsCreated( false ),        mSizeIsSet( false ){}wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName,                                      const wxBitmapType  bitmapFileType,                                      const wxString& labelText,                                      int  alignText,                                      bool isFlat,                                      int  WXUNUSED(firedEventType),                                      int  WXUNUSED(marginX),                                      int  WXUNUSED(marginY),                                      int  WXUNUSED(textToLabelGap),                                      bool WXUNUSED(isSticky))    :   mTextToLabelGap  ( 2 ),        mMarginX( 2 ),        mMarginY( 2 ),        mTextAlignment( alignText ),        mIsSticky( false ),        mIsFlat( isFlat ),        mLabelText( labelText ),        mImageFileName( bitmapFileName ),        mImageFileType( bitmapFileType ),        mpDepressedImg( NULL ),        mpPressedImg  ( NULL ),        mpDisabledImg ( NULL ),        mpFocusedImg  ( NULL ),        mDragStarted  ( false ),        mIsPressed    ( false ),        mIsInFocus    ( false ),        mIsToggled    ( false ),        mHasFocusedBmp( false ),        mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ),        mBlackPen( wxColour(  0,  0,  0), 1, wxSOLID ),        mDarkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ),        mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),        mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ),        mIsCreated( false ),        mSizeIsSet( false ){}wxNewBitmapButton::~wxNewBitmapButton(void){    DestroyLabels();}void wxNewBitmapButton::DrawShade( int outerLevel,                                   wxDC&  dc,                                   wxPen& upperLeftSidePen,                                   wxPen& lowerRightSidePen ){    wxBitmap* pBmp = GetStateLabel();    int x = mMarginX - (outerLevel + 2);    int y = mMarginY - (outerLevel + 2);    int height = pBmp->GetHeight() + (outerLevel + 2)*2 - 1;    int width  = pBmp->GetWidth()  + (outerLevel + 2)*2 - 1;    dc.SetPen( upperLeftSidePen );    dc.DrawLine( x,y, x + width, y  );    dc.DrawLine( x,y, x, y + height );    dc.DrawLine( x,y+1, x + width , y +1 );  // top    dc.DrawLine( x+1,y, x+1, y + height );  // left    dc.SetPen( lowerRightSidePen );    dc.DrawLine( x + width, y, x + width, y + height + 1  );    dc.DrawLine( x, y + height, x + width, y + height );    dc.DrawLine( x + width-1, y+1, x + width-1, y + height +1  );  // right    dc.DrawLine( x +1, y + height-1, x + width, y + height-1 );  // bottom}void wxNewBitmapButton::DestroyLabels(){    if ( mpDepressedImg ) delete mpDepressedImg;    if ( mpPressedImg   ) delete mpPressedImg;    if ( mpDisabledImg  ) delete mpDisabledImg;    if ( mpFocusedImg   ) delete mpFocusedImg;    mpDepressedImg = NULL;    mpPressedImg   = NULL;    mpDisabledImg  = NULL;    mpFocusedImg   = NULL;}wxBitmap* wxNewBitmapButton::GetStateLabel(){    if ( IsEnabled() )    {        if ( mIsPressed )        {            return mpPressedImg;        }        else        {            if ( mIsInFocus )            {                if ( mHasFocusedBmp )                    return mpFocusedImg;                else                    return mpDepressedImg;            }            else                return mpDepressedImg;        }    }    else        return mpDisabledImg;}#ifndef __WXMSW__static const unsigned char _gDisableImage[] = { 0x55,0xAA,0x55,0xAA,                                              0x55,0xAA,0x55,0xAA,                                              0x55,0xAA,0x55,0xAA,                                              0x55,0xAA,0x55,0xAA                                            };#endifvoid wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,                                          bool isEnabled, bool isPressed ){    if ( destBmp != 0 ) return;    // render labels on-demand    wxMemoryDC srcDc;    srcDc.SelectObject( *srcBmp );    bool hasText = ( mTextAlignment != NB_NO_TEXT ) &&                   ( mLabelText.length() != 0 );    bool hasImage = (mTextAlignment != NB_NO_IMAGE);    wxSize destDim;    wxPoint txtPos;    wxPoint imgPos;    if ( hasText )    {        long txtWidth, txtHeight;        srcDc.SetFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) );        srcDc.GetTextExtent( mLabelText, &txtWidth, &txtHeight );        if ( mTextAlignment == NB_ALIGN_TEXT_RIGHT )        {            destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth;            destDim.y =                wxMax( srcBmp->GetHeight(), txtHeight );            txtPos.x = srcBmp->GetWidth() + mTextToLabelGap;            txtPos.y = (destDim.y - txtHeight)/2;            imgPos.x = 0;            imgPos.y = (destDim.y - srcBmp->GetHeight())/2;        }

⌨️ 快捷键说明

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