]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/image/image.cpp
don't use deprecated toolbar API
[wxWidgets.git] / samples / image / image.cpp
index 6d4bc60ef196dde873c460b7a1d23c9ac5a7ffbf..a365d34310ec4c4f5128e12747165b0f25d384e9 100644 (file)
@@ -118,6 +118,7 @@ public:
 
     void OnAbout( wxCommandEvent &event );
     void OnNewFrame( wxCommandEvent &event );
+    void OnImageInfo( wxCommandEvent &event );
 #ifdef wxHAVE_RAW_BITMAP
     void OnTestRawBitmap( wxCommandEvent &event );
 #endif // wxHAVE_RAW_BITMAP
@@ -131,6 +132,13 @@ public:
     MyCanvas         *m_canvas;
 
 private:
+    // ask user for the file name and try to load an image from it
+    //
+    // return the file path on success, empty string if we failed to load the
+    // image or were cancelled by user
+    static wxString LoadUserImage(wxImage& image);
+
+
     DECLARE_DYNAMIC_CLASS(MyFrame)
     DECLARE_EVENT_TABLE()
 };
@@ -142,7 +150,8 @@ private:
 enum
 {
     ID_ROTATE_LEFT = 100,
-    ID_ROTATE_RIGHT
+    ID_ROTATE_RIGHT,
+    ID_RESIZE
 };
 
 class MyImageFrame : public wxFrame
@@ -152,12 +161,14 @@ public:
         : wxFrame(parent, wxID_ANY,
                   wxString::Format(_T("Image from %s"), desc.c_str()),
                   wxDefaultPosition, wxDefaultSize,
-                  wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX),
+                  wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE),
                   m_bitmap(bitmap)
     {
         wxMenu *menu = new wxMenu;
         menu->Append(wxID_SAVE);
         menu->AppendSeparator();
+        menu->Append(ID_RESIZE, _T("&Fit to window\tCtrl-F"));
+        menu->AppendSeparator();
         menu->Append(ID_ROTATE_LEFT, _T("Rotate &left\tCtrl-L"));
         menu->Append(ID_ROTATE_RIGHT, _T("Rotate &right\tCtrl-R"));
 
@@ -165,7 +176,11 @@ public:
         mbar->Append(menu, _T("&Image"));
         SetMenuBar(mbar);
 
+        CreateStatusBar();
+
         SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
+
+        UpdateStatusBar();
     }
 
     void OnEraseBackground(wxEraseEvent& WXUNUSED(event))
@@ -175,8 +190,12 @@ public:
 
     void OnPaint(wxPaintEvent& WXUNUSED(event))
     {
-        wxPaintDC dc( this );
-        dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ );
+        wxPaintDC dc(this);
+        const wxSize size = GetClientSize();
+        dc.DrawBitmap(m_bitmap,
+                      (size.x - m_bitmap.GetWidth())/2,
+                      (size.y - m_bitmap.GetHeight())/2,
+                      true /* use mask */);
     }
 
     void OnSave(wxCommandEvent& WXUNUSED(event))
@@ -305,6 +324,18 @@ public:
 #endif // wxUSE_FILEDLG
     }
 
+    void OnResize(wxCommandEvent& WXUNUSED(event))
+    {
+        wxImage img(m_bitmap.ConvertToImage());
+
+        const wxSize size = GetClientSize();
+        img.Rescale(size.x, size.y, wxIMAGE_QUALITY_HIGH);
+        m_bitmap = wxBitmap(img);
+
+        UpdateStatusBar();
+        Refresh();
+    }
+
     void OnRotate(wxCommandEvent& event)
     {
         double angle = 5;
@@ -312,7 +343,7 @@ public:
             angle = -angle;
 
         wxImage img(m_bitmap.ConvertToImage());
-        img = img.Rotate(angle, wxPoint(0, 0));//wxPoint(img.GetWidth() / 2, img.GetHeight() / 2));
+        img = img.Rotate(angle, wxPoint(img.GetWidth() / 2, img.GetHeight() / 2));
         if ( !img.Ok() )
         {
             wxLogWarning(_T("Rotation failed"));
@@ -320,10 +351,19 @@ public:
         }
 
         m_bitmap = wxBitmap(img);
+
+        UpdateStatusBar();
         Refresh();
     }
 
 private:
+    void UpdateStatusBar()
+    {
+        wxLogStatus(this, _T("Image size: (%d, %d)"),
+                    m_bitmap.GetWidth(),
+                    m_bitmap.GetHeight());
+    }
+
     wxBitmap m_bitmap;
 
     DECLARE_EVENT_TABLE()
@@ -365,7 +405,6 @@ public:
                 wxLogError(_T("Failed to gain raw access to bitmap data"));
                 return;
             }
-            data.UseAlpha();
             wxAlphaPixelData::Iterator p(data);
             for ( int y = 0; y < SIZE; ++y )
             {
@@ -389,7 +428,6 @@ public:
             return;
         }
 
-        data.UseAlpha();
         wxAlphaPixelData::Iterator p(data);
 
         for ( int y = 0; y < REAL_SIZE; ++y )
@@ -490,6 +528,7 @@ BEGIN_EVENT_TABLE(MyImageFrame, wxFrame)
 
     EVT_MENU(wxID_SAVE, MyImageFrame::OnSave)
     EVT_MENU_RANGE(ID_ROTATE_LEFT, ID_ROTATE_RIGHT, MyImageFrame::OnRotate)
+    EVT_MENU(ID_RESIZE, MyImageFrame::OnResize)
 END_EVENT_TABLE()
 
 #ifdef wxHAVE_RAW_BITMAP
@@ -1070,17 +1109,19 @@ enum
     ID_QUIT  = wxID_EXIT,
     ID_ABOUT = wxID_ABOUT,
     ID_NEW = 100,
-    ID_SHOWRAW = 101
+    ID_INFO,
+    ID_SHOWRAW
 };
 
 IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
 
-BEGIN_EVENT_TABLE(MyFrame,wxFrame)
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
   EVT_MENU    (ID_ABOUT, MyFrame::OnAbout)
   EVT_MENU    (ID_QUIT,  MyFrame::OnQuit)
-  EVT_MENU    (ID_NEW,  MyFrame::OnNewFrame)
+  EVT_MENU    (ID_NEW,   MyFrame::OnNewFrame)
+  EVT_MENU    (ID_INFO,  MyFrame::OnImageInfo)
 #ifdef wxHAVE_RAW_BITMAP
-  EVT_MENU    (ID_SHOWRAW,  MyFrame::OnTestRawBitmap)
+  EVT_MENU    (ID_SHOWRAW, MyFrame::OnTestRawBitmap)
 #endif
 
 #if wxUSE_CLIPBOARD
@@ -1097,8 +1138,9 @@ MyFrame::MyFrame()
 
   wxMenu *menuImage = new wxMenu;
   menuImage->Append( ID_NEW, _T("&Show any image...\tCtrl-O"));
-
+  menuImage->Append( ID_INFO, _T("Show image &information...\tCtrl-I"));
 #ifdef wxHAVE_RAW_BITMAP
+  menuImage->AppendSeparator();
   menuImage->Append( ID_SHOWRAW, _T("Test &raw bitmap...\tCtrl-R"));
 #endif
   menuImage->AppendSeparator();
@@ -1140,23 +1182,71 @@ void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
                       _T("About wxImage Demo"), wxICON_INFORMATION | wxOK );
 }
 
-void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) )
+wxString MyFrame::LoadUserImage(wxImage& image)
 {
+    wxString filename;
+
 #if wxUSE_FILEDLG
-    wxString filename = wxFileSelector(_T("Select image file"));
-    if ( !filename )
-        return;
+    filename = wxFileSelector(_T("Select image file"));
+    if ( !filename.empty() )
+    {
+        if ( !image.LoadFile(filename) )
+        {
+            wxLogError(_T("Couldn't load image from '%s'."), filename.c_str());
+
+            return wxEmptyString;
+        }
+    }
+#endif // wxUSE_FILEDLG
+
+    return filename;
+}
+
+void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) )
+{
+    wxImage image;
+    wxString filename = LoadUserImage(image);
+    if ( !filename.empty() )
+        (new MyImageFrame(this, filename, wxBitmap(image)))->Show();
+}
 
+void MyFrame::OnImageInfo( wxCommandEvent &WXUNUSED(event) )
+{
     wxImage image;
-    if ( !image.LoadFile(filename) )
+    if ( !LoadUserImage(image).empty() )
     {
-        wxLogError(_T("Couldn't load image from '%s'."), filename.c_str());
+        // TODO: show more information about the file
+        wxString info = wxString::Format("Image size: %dx%d",
+                                         image.GetWidth(),
+                                         image.GetHeight());
+
+        int xres = image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONX),
+            yres = image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONY);
+        if ( xres || yres )
+        {
+            info += wxString::Format("\nResolution: %dx%d", xres, yres);
+            switch ( image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONUNIT) )
+            {
+                default:
+                    wxFAIL_MSG( "unknown image resolution units" );
+                    // fall through
 
-        return;
-    }
+                case wxIMAGE_RESOLUTION_NONE:
+                    info += " in default units";
+                    break;
 
-    (new MyImageFrame(this, filename, wxBitmap(image)))->Show();
-#endif // wxUSE_FILEDLG
+                case wxIMAGE_RESOLUTION_INCHES:
+                    info += " in";
+                    break;
+
+                case wxIMAGE_RESOLUTION_CM:
+                    info += " cm";
+                    break;
+            }
+        }
+
+        wxLogMessage("%s", info);
+    }
 }
 
 #ifdef wxHAVE_RAW_BITMAP