home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / png / pngdemo.cpp < prev    next >
C/C++ Source or Header  |  2002-12-16  |  6KB  |  217 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        pngdemo.cpp
  3. // Purpose:     Demos PNG reading
  4. // Author:      Julian Smart
  5. // Modified by:
  6. // Created:     04/01/98
  7. // RCS-ID:      $Id: pngdemo.cpp,v 1.17.2.1 2002/12/15 17:25:21 MBN Exp $
  8. // Copyright:   (c) Julian Smart and Markus Holzem
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation "pngdemo.h"
  14. #endif
  15.  
  16. // For compilers that support precompilation, includes "wx.h".
  17. #include "wx/wxprec.h"
  18.  
  19. #ifdef __BORLANDC__
  20. #pragma hdrstop
  21. #endif
  22.  
  23. #include "wx/image.h"
  24.  
  25. #include "pngdemo.h"
  26.  
  27. MyFrame   *frame = (MyFrame *) NULL;
  28. wxBitmap  *g_TestBitmap = (wxBitmap *) NULL;
  29.  
  30. IMPLEMENT_APP(MyApp)
  31.  
  32. MyApp::MyApp()
  33. {
  34. }
  35.  
  36. bool MyApp::OnInit(void)
  37. {
  38.   wxImage::AddHandler(new wxPNGHandler);
  39.  
  40.   // Create the main frame window
  41.   frame = new MyFrame((wxFrame *) NULL, _T("wxPNGBitmap Demo"), wxPoint(0, 0), wxSize(300, 300));
  42.  
  43.   // Give it a status line
  44.   frame->CreateStatusBar(2);
  45.  
  46.   // Make a menubar
  47.   wxMenu *file_menu = new wxMenu;
  48.   wxMenu *help_menu = new wxMenu;
  49.  
  50.   file_menu->Append(PNGDEMO_LOAD_FILE, _T("&Load file"),                _T("Load file"));
  51.   file_menu->Append(PNGDEMO_SAVE_FILE, _T("&Save file"),                _T("Save file"));
  52.   file_menu->Append(PNGDEMO_QUIT, _T("E&xit"),                _T("Quit program"));
  53.   help_menu->Append(PNGDEMO_ABOUT, _T("&About"),              _T("About PNG demo"));
  54.  
  55.   wxMenuBar *menu_bar = new wxMenuBar;
  56.  
  57.   menu_bar->Append(file_menu, _T("&File"));
  58.   menu_bar->Append(help_menu, _T("&Help"));
  59.  
  60.   // Associate the menu bar with the frame
  61.   frame->SetMenuBar(menu_bar);
  62.  
  63.   MyCanvas *canvas = new MyCanvas(frame, wxPoint(0, 0), wxSize(100, 100));
  64.  
  65.   // Give it scrollbars: the virtual canvas is 20 * 50 = 1000 pixels in each direction
  66. //  canvas->SetScrollbars(20, 20, 50, 50, 4, 4);
  67.   frame->canvas = canvas;
  68.  
  69.   frame->Show(TRUE);
  70.  
  71.   frame->SetStatusText(_T("Hello, wxWindows"));
  72.  
  73.   return TRUE;
  74. }
  75.  
  76. BEGIN_EVENT_TABLE(MyFrame, wxFrame)
  77.     EVT_MENU(PNGDEMO_QUIT,      MyFrame::OnQuit)
  78.     EVT_MENU(PNGDEMO_ABOUT,     MyFrame::OnAbout)
  79.     EVT_MENU(PNGDEMO_LOAD_FILE, MyFrame::OnLoadFile)
  80.     EVT_MENU(PNGDEMO_SAVE_FILE, MyFrame::OnSaveFile)
  81. END_EVENT_TABLE()
  82.  
  83. // Define my frame constructor
  84. MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
  85.   wxFrame(frame, -1, title, pos, size)
  86. {
  87.   canvas = (MyCanvas *) NULL;
  88. }
  89.  
  90. // frame destructor
  91. MyFrame::~MyFrame()
  92. {
  93.     if (g_TestBitmap)
  94.     {
  95.         delete g_TestBitmap;
  96.         g_TestBitmap = (wxBitmap *) NULL;
  97.     }
  98. }
  99.  
  100. void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
  101. {
  102.     Close(TRUE);
  103. }
  104.  
  105. void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
  106. {
  107.     (void)wxMessageBox(_T("PNG demo\nJulian Smart (c) 1998"),
  108.             _T("About PNG Demo"), wxOK);
  109. }
  110.  
  111. void MyFrame::OnSaveFile(wxCommandEvent& WXUNUSED(event))
  112. {
  113.   wxString f = wxFileSelector( wxT("Save Image"), (const wxChar *)NULL,
  114.                                (const wxChar *)NULL,
  115.                                wxT("png"), wxT("PNG files (*.png)|*.png") );
  116.  
  117.   if (f == _T(""))  return;
  118.   
  119.   wxBitmap *backstore = new wxBitmap( 150, 150 );
  120.   
  121.   wxMemoryDC memDC;
  122.   memDC.SelectObject( *backstore );
  123.   memDC.Clear();
  124.   memDC.SetBrush( *wxBLACK_BRUSH );
  125.   memDC.SetPen( *wxWHITE_PEN );
  126.   memDC.DrawRectangle( 0, 0, 150, 150 );
  127.   memDC.SetPen( *wxBLACK_PEN );
  128.   memDC.DrawLine( 0, 0, 0, 10 );
  129.   memDC.SetTextForeground( *wxWHITE );
  130.   memDC.DrawText( _T("This is a memory dc."), 10, 10 );
  131.   
  132.   memDC.SelectObject( wxNullBitmap );
  133.   
  134.   backstore->SaveFile( f, wxBITMAP_TYPE_PNG, (wxPalette*)NULL );
  135.   
  136.   delete backstore;
  137. }
  138.  
  139. void MyFrame::OnLoadFile(wxCommandEvent& WXUNUSED(event))
  140. {
  141.     // Show file selector.
  142.     wxString f = wxFileSelector(wxT("Open Image"), (const wxChar *) NULL,
  143.                                     (const wxChar *) NULL, wxT("png"),
  144.                                     wxT("PNG files (*.png)|*.png"));
  145.  
  146.     if (f == _T(""))
  147.         return;
  148.  
  149.     if ( g_TestBitmap )
  150.         delete g_TestBitmap;
  151.  
  152.     g_TestBitmap = new wxBitmap(f, wxBITMAP_TYPE_PNG);
  153.     if (!g_TestBitmap->Ok())
  154.     {
  155.         delete g_TestBitmap;
  156.         g_TestBitmap = (wxBitmap *) NULL;
  157.     }
  158.  
  159.     canvas->Refresh();
  160. }
  161.  
  162. BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
  163.     EVT_PAINT(MyCanvas::OnPaint)
  164. END_EVENT_TABLE()
  165.  
  166. // Define a constructor for my canvas
  167. MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size):
  168.  wxScrolledWindow(parent, -1, pos, size)
  169. {
  170. }
  171.  
  172. MyCanvas::~MyCanvas(void)
  173. {
  174. }
  175.  
  176. // Define the repainting behaviour
  177. void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
  178. {
  179.   wxPaintDC dc(this);
  180.   dc.SetPen(* wxRED_PEN);
  181.  
  182.   int i;
  183.   for ( i = 0; i < 500; i += 10)
  184.   {
  185.     dc.DrawLine(0, i, 800, i);
  186.   }
  187.   if ( g_TestBitmap && g_TestBitmap->Ok() )
  188.   {
  189.     wxMemoryDC memDC;
  190.     if ( g_TestBitmap->GetPalette() )
  191.     {
  192.         memDC.SetPalette(* g_TestBitmap->GetPalette());
  193.         dc.SetPalette(* g_TestBitmap->GetPalette());
  194.     }
  195.     memDC.SelectObject(* g_TestBitmap);
  196.  
  197.     // Normal, non-transparent blitting
  198.     dc.Blit(20, 20, g_TestBitmap->GetWidth(), g_TestBitmap->GetHeight(), & memDC, 0, 0, wxCOPY, FALSE);
  199.  
  200.     memDC.SelectObject(wxNullBitmap);
  201.   }
  202.  
  203.   if ( g_TestBitmap && g_TestBitmap->Ok() )
  204.   {
  205.     wxMemoryDC memDC;
  206.     memDC.SelectObject(* g_TestBitmap);
  207.  
  208.     // Transparent blitting if there's a mask in the bitmap
  209.     dc.Blit(20 + g_TestBitmap->GetWidth() + 20, 20, g_TestBitmap->GetWidth(), g_TestBitmap->GetHeight(), & memDC,
  210.       0, 0, wxCOPY, TRUE);
  211.  
  212.     memDC.SelectObject(wxNullBitmap);
  213.   }
  214. }
  215.  
  216.  
  217.