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