/////////////////////////////////////////////////////////////////////////////
-// Name: bmpbuttn.cpp
+// Name: src/msw/bmpbuttn.cpp
// Purpose: wxBitmapButton
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
-// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "bmpbuttn.h"
#endif
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
+#if wxUSE_BMPBUTTON
+
#ifndef WX_PRECOMP
#include "wx/bmpbuttn.h"
#include "wx/log.h"
IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
+/*
+TODO PROPERTIES :
+
+long "style" , wxBU_AUTODRAW
+bool "default" , 0
+bitmap "selected" ,
+bitmap "focus" ,
+bitmap "disabled" ,
+*/
+
#define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1)
bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap,
const wxValidator& validator,
const wxString& name)
{
- m_buttonBitmap = bitmap;
+ m_bmpNormal = bitmap;
SetName(name);
#if wxUSE_VALIDATORS
m_backgroundColour = parent->GetBackgroundColour();
m_foregroundColour = parent->GetForegroundColour();
m_windowStyle = style;
- m_marginX = 0;
- m_marginY = 0;
if ( style & wxBU_AUTODRAW )
{
if ( height == -1 && bitmap.Ok())
height = bitmap.GetHeight() + 2*m_marginY;
+ long msStyle = WS_VISIBLE | WS_TABSTOP | WS_CHILD | BS_OWNERDRAW ;
+
+ if ( m_windowStyle & wxCLIP_SIBLINGS )
+ msStyle |= WS_CLIPSIBLINGS;
+
+#ifdef __WIN32__
+ if(m_windowStyle & wxBU_LEFT)
+ msStyle |= BS_LEFT;
+ if(m_windowStyle & wxBU_RIGHT)
+ msStyle |= BS_RIGHT;
+ if(m_windowStyle & wxBU_TOP)
+ msStyle |= BS_TOP;
+ if(m_windowStyle & wxBU_BOTTOM)
+ msStyle |= BS_BOTTOM;
+#endif
+
m_hWnd = (WXHWND)CreateWindowEx
(
0,
wxT("BUTTON"),
- wxT(""),
- WS_VISIBLE | WS_TABSTOP | WS_CHILD | BS_OWNERDRAW ,
- 0, 0, 0, 0,
+ wxEmptyString,
+ msStyle,
+ 0, 0, 0, 0,
GetWinHwnd(parent),
(HMENU)m_windowId,
wxGetInstance(),
return TRUE;
}
-void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap)
-{
- m_buttonBitmap = bitmap;
-}
+// VZ: should be at the very least less than wxDEFAULT_BUTTON_MARGIN
+#define FOCUS_MARGIN 3
bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
{
-#if defined(__WIN95__)
+#ifndef __WXWINCE__
long style = GetWindowLong((HWND) GetHWND(), GWL_STYLE);
if (style & BS_BITMAP)
{
// choose the bitmap to use depending on the button state
wxBitmap* bitmap;
- if ( isSelected && m_buttonBitmapSelected.Ok() )
- bitmap = &m_buttonBitmapSelected;
- else if ((state & ODS_FOCUS) && m_buttonBitmapFocus.Ok())
- bitmap = &m_buttonBitmapFocus;
- else if ((state & ODS_DISABLED) && m_buttonBitmapDisabled.Ok())
- bitmap = &m_buttonBitmapDisabled;
+ if ( isSelected && m_bmpSelected.Ok() )
+ bitmap = &m_bmpSelected;
+ else if ((state & ODS_FOCUS) && m_bmpFocus.Ok())
+ bitmap = &m_bmpFocus;
+ else if ((state & ODS_DISABLED) && m_bmpDisabled.Ok())
+ bitmap = &m_bmpDisabled;
else
- bitmap = &m_buttonBitmap;
+ bitmap = &m_bmpNormal;
if ( !bitmap->Ok() )
return FALSE;
int height = lpDIS->rcItem.bottom - y;
int wBmp = bitmap->GetWidth();
int hBmp = bitmap->GetHeight();
- int x1 = x + (width - wBmp) / 2;
- int y1 = y + (height - hBmp) / 2;
+
+ int x1,y1;
+
+ if(m_windowStyle & wxBU_LEFT)
+ x1 = x + (FOCUS_MARGIN+1);
+ else if(m_windowStyle & wxBU_RIGHT)
+ x1 = x + (width - wBmp) - (FOCUS_MARGIN+1);
+ else
+ x1 = x + (width - wBmp) / 2;
+
+ if(m_windowStyle & wxBU_TOP)
+ y1 = y + (FOCUS_MARGIN+1);
+ else if(m_windowStyle & wxBU_BOTTOM)
+ y1 = y + (height - hBmp) - (FOCUS_MARGIN+1);
+ else
+ y1 = y + (height - hBmp) / 2;
if ( isSelected && autoDraw )
{
wxDC dst;
dst.SetHDC((WXHDC) hDC, FALSE);
dst.DrawBitmap(*bitmap, x1, y1, TRUE);
-
+
// draw focus / disabled state, if auto-drawing
if ( (state & ODS_DISABLED) && autoDraw )
{
penLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));
penShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW));
penDkShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW));
- brushFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
+ // brushFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
+ // Taking the background colour fits in better with
+ // Windows XP themes.
+ brushFace = CreateSolidBrush(m_backgroundColour.m_pixel);
// draw the rectangle
RECT rect;
// draw the border
oldp = (HPEN) SelectObject( (HDC) dc, sel? penDkShadow : penHiLight);
- MoveToEx((HDC) dc, left, top, NULL); LineTo((HDC) dc, right-1, top);
- MoveToEx((HDC) dc, left, top+1, NULL); LineTo((HDC) dc, left, bottom-1);
+
+ wxDrawLine((HDC) dc, left, top, right-1, top);
+ wxDrawLine((HDC) dc, left, top+1, left, bottom-1);
SelectObject( (HDC) dc, sel? penShadow : penLight);
- MoveToEx((HDC) dc, left+1, top+1, NULL); LineTo((HDC) dc, right-2, top+1);
- MoveToEx((HDC) dc, left+1, top+2, NULL); LineTo((HDC) dc, left+1, bottom-2);
+ wxDrawLine((HDC) dc, left+1, top+1, right-2, top+1);
+ wxDrawLine((HDC) dc, left+1, top+2, left+1, bottom-2);
SelectObject( (HDC) dc, sel? penLight : penShadow);
- MoveToEx((HDC) dc, left+1, bottom-2, NULL); LineTo((HDC) dc, right-1, bottom-2);
- MoveToEx((HDC) dc, right-2, bottom-3, NULL); LineTo((HDC) dc, right-2, top);
+ wxDrawLine((HDC) dc, left+1, bottom-2, right-1, bottom-2);
+ wxDrawLine((HDC) dc, right-2, bottom-3, right-2, top);
SelectObject( (HDC) dc, sel? penHiLight : penDkShadow);
- MoveToEx((HDC) dc, left, bottom-1, NULL); LineTo((HDC) dc, right+2, bottom-1);
- MoveToEx((HDC) dc, right-1, bottom-2, NULL); LineTo((HDC) dc, right-1, top-1);
+ wxDrawLine((HDC) dc, left, bottom-1, right+2, bottom-1);
+ wxDrawLine((HDC) dc, right-1, bottom-2, right-1, top-1);
// delete allocated resources
SelectObject((HDC) dc,oldp);
#endif // defined(__WIN95__)
-// VZ: should be at the very least less than wxDEFAULT_BUTTON_MARGIN
-#define FOCUS_MARGIN 3
-
void wxBitmapButton::DrawButtonFocus( WXHDC dc, int left, int top, int right, int bottom, bool sel )
{
RECT rect;
if ( sel )
OffsetRect( &rect, 1, 1 );
*/
+ (void)sel;
DrawFocusRect( (HDC) dc, &rect );
}
{
wxButton::SetDefault();
}
+
+#endif // wxUSE_BMPBUTTON