Rescale images automatically with informations about internal requirements (Jaakko Salli).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42111 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba 2006-10-19 12:06:00 +00:00
parent e44d5a5892
commit dc5a84857d

View File

@ -46,18 +46,18 @@
#include "wx/sizer.h"
#include "wx/icon.h"
#include "wx/dir.h"
#include "wx/msgdlg.h"
#include "wx/filename.h"
#include "wx/image.h"
#include "wx/imaglist.h"
#include "wx/bmpcbox.h"
#include "widgets.h"
#include "icons/bmpcombobox.xpm"
// Images loaded from file are reduced this width and height, if larger
#define IMG_SIZE_TRUNC 150
#define IMG_SIZE_TRUNC 256
// ----------------------------------------------------------------------------
@ -152,13 +152,16 @@ protected:
wxWindowID id,
wxTextCtrl **ppText);
#if wxUSE_IMAGE
void RescaleImage(wxImage& image, int w, int h);
#endif
// the controls
// ------------
// the checkboxes for styles
wxCheckBox *m_chkSort,
*m_chkReadonly,
*m_chkScaleimages;
*m_chkReadonly;
// the combobox itself and the sizer it is in
wxBitmapComboBox *m_combobox;
@ -234,8 +237,7 @@ BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book,
{
// init everything
m_chkSort =
m_chkReadonly =
m_chkScaleimages = (wxCheckBox *)NULL;
m_chkReadonly = (wxCheckBox *)NULL;
m_combobox = (wxBitmapComboBox *)NULL;
m_sizerCombo = (wxSizer *)NULL;
@ -293,8 +295,6 @@ void BitmapComboBoxWidgetsPage::CreateContent()
wxSizer *sizerOptions = new wxStaticBoxSizer(box, wxVERTICAL);
m_chkScaleimages = CreateCheckBoxAndAddToSizer(sizerOptions, _T("&Scale loaded images to fit"));
sizerRow = CreateSizerWithSmallTextAndLabel(_T("Control &height:"),
BitmapComboBoxPage_ChangeHeight,
&m_textChangeHeight);
@ -382,7 +382,6 @@ void BitmapComboBoxWidgetsPage::Reset()
{
m_chkSort->SetValue(false);
m_chkReadonly->SetValue(true);
m_chkScaleimages->SetValue(true);
}
void BitmapComboBoxWidgetsPage::CreateCombo()
@ -559,6 +558,33 @@ void BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages(wxCommandEvent& WXU
}
}
#if wxUSE_IMAGE
void BitmapComboBoxWidgetsPage::RescaleImage(wxImage& image, int w, int h)
{
if ( image.GetWidth() == w && image.GetHeight() == h )
return;
if ( w <= 0 || h <= 0 )
return;
static bool isFirstScale = true;
if ( isFirstScale && m_combobox->GetCount() > 0 )
{
wxMessageBox( wxT("wxBitmapComboBox normally only supports images of one size. ")
wxT("However, for demonstration purposes, loaded bitmaps are scaled to fit ")
wxT("using wxImage::Rescale."),
wxT("Notice"),
wxOK,
this );
isFirstScale = false;
}
image.Rescale(w, h);
}
#endif
void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImageList* images )
{
wxFileName fn;
@ -616,8 +642,7 @@ void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImag
wxASSERT(fn.FileExists());
wxImage image(fn.GetFullPath());
wxASSERT(image.Ok());
if ( m_chkScaleimages->GetValue() && foundSize.x > 0 )
image.Rescale(foundSize.x, foundSize.y);
RescaleImage(image, foundSize.x, foundSize.y);
wxBitmap bmp(image);
wxASSERT( bmp.Ok() );
#else
@ -744,8 +769,8 @@ wxBitmap BitmapComboBoxWidgetsPage::LoadBitmap(const wxString& filepath)
// Have some reasonable maximum size
if ( foundSize.x <= 0 )
{
foundSize.x = 256;
foundSize.y = 256;
foundSize.x = IMG_SIZE_TRUNC;
foundSize.y = IMG_SIZE_TRUNC;
}
wxImage image(filepath);
@ -765,7 +790,7 @@ wxBitmap BitmapComboBoxWidgetsPage::LoadBitmap(const wxString& filepath)
if ( h > foundSize.y )
h = foundSize.y;
image.Rescale(w, h);
RescaleImage(image, w, h);
}
return wxBitmap(image);
@ -804,6 +829,8 @@ wxBitmap BitmapComboBoxWidgetsPage::QueryBitmap(wxString* pStr)
bitmap = LoadBitmap(filepath);
}
wxLogDebug(wxT("%i, %i"),bitmap.GetWidth(), bitmap.GetHeight());
::wxSetCursor( *wxSTANDARD_CURSOR );
return bitmap;