/////////////////////////////////////////////////////////////////////////////
-// Name: No names yet.
-// Purpose: Contrib. demo
+// Name: newbmpbtn.cpp
+// Purpose: wxNewBitmapButton enhanced bitmap button class.
// Author: Aleksandras Gluchovas
// Modified by:
// Created: ??/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleksandras Gluchovas
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#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 )
} while (1);
}
-// alg. for making the image look "grayed" (e.g. disabled button)
+// 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 )
wxColour bgCol;
dc.GetPixel( 0, 0, &bgCol );
- wxPen darkPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW),1, wxSOLID );
- wxPen lightPen( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT),1, wxSOLID );
+ 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 );
///////////////////////////////
-/***** Impelementation for class wxNewBitmapButton *****/
+/***** 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_MOTION ( wxNewBitmapButton::OnMouseMove )
+ EVT_LEFT_DOWN ( wxNewBitmapButton::OnLButtonDown )
+ EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp )
+ EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick )
+ EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter )
+ EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave )
EVT_SIZE ( wxNewBitmapButton::OnSize )
EVT_PAINT( wxNewBitmapButton::OnPaint )
mDragStarted ( FALSE ),
mIsPressed ( FALSE ),
mIsInFocus( FALSE ),
- mPrevPressedState( FALSE ),
- mPrevInFocusState( FALSE ),
mHasFocusedBmp( FALSE ),
mFiredEventType( firedEventType ),
mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ),
- mDarkPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ),
- mGrayPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),
- mLightPen( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT), 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 )
mDragStarted ( FALSE ),
mIsPressed ( FALSE ),
mIsInFocus ( FALSE ),
- mPrevPressedState( FALSE ),
- mPrevInFocusState( FALSE ),
mHasFocusedBmp( FALSE ),
mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ),
mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ),
- mDarkPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ),
- mGrayPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),
- mLightPen( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT), 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 )
{
if ( destBmp != 0 ) return;
- // render lables on-demand
+ // render labels on-demand
wxMemoryDC srcDc;
srcDc.SelectObject( *srcBmp );
{
long txtWidth, txtHeight;
- srcDc.SetFont( wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT) );
+ srcDc.SetFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) );
srcDc.GetTextExtent( mLabelText, &txtWidth, &txtHeight );
if ( mTextAlignment == NB_ALIGN_TEXT_RIGHT )
wxMemoryDC destDc;
destDc.SelectObject( *destBmp );
- wxBrush grayBrush( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE), wxSOLID );
+ wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID );
wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT );
destDc.SetBrush( grayBrush );
pTopWnd = pParent;
} while (1);
- destDc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT) );
-
- if ( isEnabled )
- {
- destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNTEXT) );
- }
- else
- {
- destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW) );
- }
- destDc.SetTextBackground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE) );
-
- destDc.DrawText( mLabelText, txtPos.x, txtPos.y );
- }
-
-
- destDc.SetBrush( grayBrush );
- destDc.SetPen( nullPen );
-
- destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 );
-
- if ( isPressed )
- {
- ++imgPos.x; ++imgPos.y;
- ++txtPos.x; ++txtPos.y;
- }
-
- if ( hasImage )
- {
-
- destDc.Blit( imgPos.x, imgPos.y,
- srcBmp->GetWidth()+1,
- srcBmp->GetHeight()+1,
- &srcDc, 0,0, wxCOPY,TRUE );
- }
-
- if ( hasText )
- {
- wxWindow* pTopWnd = this;
-
- do
- {
- wxWindow* pParent = pTopWnd->GetParent();
-
- if ( pParent == 0 )
- break;
-
- pTopWnd = pParent;
- } while (1);
-
- destDc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT) );
+ destDc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT) );
if ( isEnabled )
{
- destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNTEXT) );
+ destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT) );
}
else
{
- destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW) );
+ destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) );
}
- destDc.SetTextBackground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE) );
+ destDc.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) );
destDc.DrawText( mLabelText, txtPos.x, txtPos.y );
}
gray_out_image_on_dc( destDc, destDim.x, destDim.y );
#else
wxBrush checkerBrush( wxBitmap( (const char*)_gDisableImage,8,8) );
- checkerBrush.SetColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ) );
+ checkerBrush.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
destDc.SetBrush( checkerBrush );
destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1);
#endif
destBmp->GetHeight() + mMarginY*2, 0
);
}
+ destDc.SelectObject( wxNullBitmap );
+
+#ifdef __WXMSW__
+ // Map to system colours
+ (void) MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight());
+#endif
}
+
void wxNewBitmapButton::RenderAllLabelImages()
{
if ( !mIsCreated )
}
}
+bool wxNewBitmapButton::Enable(bool enable)
+{
+ if ( enable != m_isEnabled )
+ {
+ if ( mIsInFocus )
+ {
+ mIsInFocus = FALSE;
+ }
+
+ if ( mIsPressed )
+ {
+ mIsPressed = FALSE;
+ }
+
+ Refresh();
+ }
+
+ return wxPanel::Enable( enable );
+}
+
void wxNewBitmapButton::DrawDecorations( wxDC& dc )
{
if ( mIsFlat )
void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event )
{
- mPrevPressedState = FALSE;
mDragStarted = TRUE;
mIsPressed = TRUE;
Refresh();
-
- if ( !mIsInFocus )
- CaptureMouse();
}
void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
mDragStarted = FALSE;
mIsPressed = FALSE;
- mIsInFocus = FALSE;
Refresh();
- ReleaseMouse();
+ if ( IsInWindow( event.m_x, event.m_y ) )
+ {
+ // fire event, if mouse was released
+ // within the bounds of button
+ wxCommandEvent cmd( mFiredEventType, GetId() );
+ GetParent()->ProcessEvent( cmd );
+ }
+}
+void wxNewBitmapButton::OnLButtonDClick( wxMouseEvent& event )
+{
if ( IsInWindow( event.m_x, event.m_y ) )
{
// fire event, if mouse was released
// within the bounds of button
wxCommandEvent cmd( mFiredEventType, GetId() );
GetParent()->ProcessEvent( cmd );
+
+ mDragStarted = FALSE;
+ mIsPressed = FALSE;
+ Refresh();
}
}
y < height );
}
-void wxNewBitmapButton::OnMouseMove( wxMouseEvent& event )
+void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& event )
{
- mPrevPressedState=mIsPressed;
- mPrevInFocusState=mIsInFocus;
- if ( !mIsInFocus && IsInWindow( event.m_x, event.m_y ) )
- {
- if ( !mDragStarted )
- CaptureMouse();
+ bool prevIsInFocus = mIsInFocus;
+ if ( !mIsInFocus )
+ {
mIsInFocus = TRUE;
}
- else
- if ( mIsInFocus && !IsInWindow( event.m_x, event.m_y ) )
+ if ( prevIsInFocus != mIsInFocus )
{
- mIsInFocus = FALSE;
-
- if ( !mDragStarted )
- ReleaseMouse();
+ Refresh();
}
+}
- if ( mDragStarted )
+void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& event )
+{
+ bool prevIsInFocus = mIsInFocus;
+ bool prevIsPressed = mIsPressed;
+ if ( mIsInFocus )
{
- if ( IsInWindow( event.m_x, event.m_y ) )
-
- mIsPressed = TRUE;
- else
- mIsPressed = FALSE;
+ mIsInFocus = FALSE;
+ mIsPressed = FALSE;
}
-
- if ((mIsPressed != mPrevPressedState) ||
- (mIsInFocus!=mPrevInFocusState))
+ if ( prevIsInFocus != mIsInFocus || prevIsPressed != mIsPressed )
{
Refresh();
}
}
void wxNewBitmapButton::Reshape( )
-{
-
+{
bool wasCreated = mIsCreated;
mIsCreated = TRUE;
wxMessageBox("kill-focus for button!");
}
+#ifdef __WXMSW__
+WXHBITMAP wxNewBitmapButton::MapBitmap(WXHBITMAP bitmap, int width, int height)
+{
+ MemoryHDC hdcMem;
+
+ if ( !hdcMem )
+ {
+ wxLogLastError(_T("CreateCompatibleDC"));
+
+ return bitmap;
+ }
+
+ SelectInHDC bmpInHDC(hdcMem, (HBITMAP)bitmap);
+
+ if ( !bmpInHDC )
+ {
+ wxLogLastError(_T("SelectObject"));
+
+ return bitmap;
+ }
+
+ wxCOLORMAP *cmap = wxGetStdColourMap();
+
+ for ( int i = 0; i < width; i++ )
+ {
+ for ( int j = 0; j < height; j++ )
+ {
+ COLORREF pixel = ::GetPixel(hdcMem, i, j);
+
+ for ( size_t k = 0; k < wxSTD_COL_MAX; k++ )
+ {
+ COLORREF col = cmap[k].from;
+ if ( abs(GetRValue(pixel) - GetRValue(col)) < 10 &&
+ abs(GetGValue(pixel) - GetGValue(col)) < 10 &&
+ abs(GetBValue(pixel) - GetBValue(col)) < 10 )
+ {
+ ::SetPixel(hdcMem, i, j, cmap[k].to);
+ break;
+ }
+ }
+ }
+ }
+
+ return bitmap;
+}
+#endif