📄 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 handlersvoid 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 + -