📄 newbmpbtn.cpp
字号:
else
if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM )
{
destDim.x =
wxMax( srcBmp->GetWidth(), txtWidth );
destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight;
txtPos.x = (destDim.x - txtWidth)/2;
txtPos.y = srcBmp->GetHeight() + mTextToLabelGap;
imgPos.x = (destDim.x - srcBmp->GetWidth())/2;
imgPos.y = 0;
}
else
{
wxFAIL_MSG(wxT("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()"));
}
}
else
{
imgPos.x = 0;
imgPos.y = 0;
destDim.x = srcBmp->GetWidth();
destDim.y = srcBmp->GetHeight();
}
destBmp = new wxBitmap( int(destDim.x), int(destDim.y) );
wxMemoryDC destDc;
destDc.SelectObject( *destBmp );
wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID );
destDc.SetBrush( grayBrush );
destDc.SetPen( *wxTRANSPARENT_PEN );
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(),
srcBmp->GetHeight(),
&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::GetFont( wxSYS_DEFAULT_GUI_FONT) );
if ( isEnabled )
{
destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT) );
}
else
{
destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) );
}
destDc.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) );
destDc.DrawText( mLabelText, txtPos.x, txtPos.y );
}
if ( !isEnabled ){
#ifdef __WXMSW__ // This is currently MSW specific
gray_out_image_on_dc( destDc, destDim.x, destDim.y );
#else
wxBitmap bmp( (const char*)_gDisableImage,8,8);
wxBrush checkerBrush(bmp);
checkerBrush.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
destDc.SetBrush( checkerBrush );
destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1);
#endif
}
// adjust button size to fit the new dimensions of the label
if ( !mSizeIsSet && 0 )
{
mSizeIsSet = true;
SetSize( wxDefaultCoord, wxDefaultCoord,
destBmp->GetWidth() + mMarginX*2,
destBmp->GetHeight() + mMarginY*2, 0
);
}
destDc.SelectObject( wxNullBitmap );
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
// Map to system colours
(void) wxToolBar::MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight());
#endif
}
void wxNewBitmapButton::RenderAllLabelImages()
{
if ( !mIsCreated )
return;
RenderLabelImage( mpDisabledImg, &mDepressedBmp, false );
RenderLabelImage( mpPressedImg, &mDepressedBmp, true, true );
RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false );
if ( mHasFocusedBmp )
{
RenderLabelImage( mpFocusedImg, &mFocusedBmp, true, false );
}
}
void wxNewBitmapButton::RenderLabelImages()
{
if ( !mIsCreated )
return;
if ( !IsEnabled() )
{
RenderLabelImage( mpDisabledImg, &mDepressedBmp, false );
}
else
if ( mIsPressed )
RenderLabelImage( mpPressedImg, &mDepressedBmp, true, true );
else
{
if ( mIsInFocus )
{
if ( mHasFocusedBmp )
RenderLabelImage( mpFocusedImg, &mFocusedBmp, true, false );
else
RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false );
}
else
RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false );
}
}
bool wxNewBitmapButton::Toggle(bool enable)
{
if ( mIsToggled == enable )
{
return false;
}
mIsToggled = enable;
Refresh();
return true;
}
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 )
{
DrawShade( 1, dc, mGrayPen, mGrayPen );
if ( mIsToggled )
{
DrawShade( 0, dc, mDarkPen, mLightPen );
}
else if ( mIsInFocus )
{
if ( mIsPressed )
DrawShade( 0, dc, mDarkPen, mLightPen );
else
DrawShade( 0, dc, mLightPen, mDarkPen );
}
else
DrawShade( 0, dc, mGrayPen, mGrayPen );
}
else
{
if ( mIsPressed || mIsToggled )
{
DrawShade( 0, dc, mDarkPen, mGrayPen );
DrawShade( 1, dc, mBlackPen, mLightPen );
}
else
{
DrawShade( 0, dc, mGrayPen, mDarkPen );
DrawShade( 1, dc, mLightPen, mBlackPen );
}
}
}
void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap,
const wxString& labelText )
{
DestroyLabels();
mLabelText = labelText;
mDepressedBmp = labelBitmap;
//RenderLabelImages();
RenderAllLabelImages();
}
void wxNewBitmapButton::SetAlignments( int alignText,
int marginX,
int marginY,
int textToLabelGap)
{
DestroyLabels();
mMarginX = marginX;
mMarginY = marginY;
mTextAlignment = alignText;
mTextToLabelGap = textToLabelGap;
//RenderLabelImages();
RenderAllLabelImages();
}
// event handlers
void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& WXUNUSED(event) )
{
mDragStarted = true;
mIsPressed = true;
Refresh();
}
void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
{
if ( !mDragStarted )
return;
mDragStarted = false;
mIsPressed = false;
Refresh();
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 );
}
}
bool wxNewBitmapButton::IsInWindow( int x, int y )
{
int width, height;
GetSize( &width, &height );
return ( x >= 0 && y >= 0 &&
x < width &&
y < height );
}
void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& WXUNUSED(event) )
{
bool prevIsInFocus = mIsInFocus;
if ( !mIsInFocus )
{
mIsInFocus = true;
}
if ( prevIsInFocus != mIsInFocus )
{
Refresh();
}
}
void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& WXUNUSED(event) )
{
bool prevIsInFocus = mIsInFocus;
bool prevIsPressed = mIsPressed;
if ( mIsInFocus )
{
mIsInFocus = false;
mIsPressed = false;
}
if ( prevIsInFocus != mIsInFocus || prevIsPressed != mIsPressed )
{
Refresh();
}
}
void wxNewBitmapButton::OnSize( wxSizeEvent& WXUNUSED(event) )
{
//Reshape();
}
void wxNewBitmapButton::Reshape( )
{
bool wasCreated = mIsCreated;
mIsCreated = true;
if ( !wasCreated )
{
// in the case of loading button from stream, check if we
// have non-empty image-file name, load if possible
if (!mImageFileName.empty())
{
mDepressedBmp.LoadFile( mImageFileName, mImageFileType );
//wxMessageBox("Image Loaded!!!");
}
//RenderLabelImages();
RenderAllLabelImages();
wxBitmap* pCurImg = GetStateLabel();
int w = pCurImg->GetWidth(),
h = pCurImg->GetHeight();
SetSize( 0,0, w + mMarginX*2, h + mMarginY*2 , 0 );
}
}
void wxNewBitmapButton::DrawLabel( wxDC& dc )
{
wxBitmap* pCurBmp = GetStateLabel();
if ( pCurBmp == NULL )
{
wxSizeEvent evt;
OnSize( evt ); // fake it up!
//RenderLabelImages();
pCurBmp = GetStateLabel();
}
wxMemoryDC mdc;
mdc.SelectObject( *pCurBmp );
dc.Blit( mMarginX, mMarginY,
pCurBmp->GetWidth(),
pCurBmp->GetHeight(),
&mdc, 0,0, wxCOPY
);
mdc.SelectObject( wxNullBitmap );
}
void wxNewBitmapButton::OnPaint( wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc(this);
// first, make sure images for current state are prepared
//RenderLabelImages();
DrawLabel( dc );
DrawDecorations( dc );
}
void wxNewBitmapButton::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
{
// do nothing
}
void wxNewBitmapButton::OnKillFocus( wxFocusEvent& WXUNUSED(event) )
{
// useless
wxMessageBox(wxT("kill-focus for button!"));
}
// ----------------------------------------------------------------------------
// UI updates
// ----------------------------------------------------------------------------
void wxNewBitmapButton::OnIdle(wxIdleEvent& event)
{
DoButtonUpdate();
event.Skip();
}
// Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
void wxNewBitmapButton::DoButtonUpdate()
{
wxUpdateUIEvent event(GetId());
event.SetEventObject(this);
if ( GetParent()->ProcessEvent(event) )
{
if ( event.GetSetEnabled() )
{
bool enabled = event.GetEnabled();
if ( enabled != IsEnabled() )
Enable( enabled );
}
if ( event.GetSetChecked() )
Toggle( event.GetChecked() );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -