]> git.saurik.com Git - wxWidgets.git/blob - samples/png/pngdemo.cpp
cursor image type fix
[wxWidgets.git] / samples / png / pngdemo.cpp
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
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #include "wx/image.h"
20
21 #include "pngdemo.h"
22
23 MyFrame *frame = (MyFrame *) NULL;
24 wxBitmap *g_TestBitmap = (wxBitmap *) NULL;
25
26 IMPLEMENT_APP(MyApp)
27
28 bool MyApp::OnInit(void)
29 {
30 if ( !wxApp::OnInit() )
31 return false;
32
33 wxImage::AddHandler(new wxPNGHandler);
34
35 // Create the main frame window
36 frame = new MyFrame((wxFrame *) NULL, _T("wxPNGBitmap Demo"), wxPoint(0, 0), wxSize(300, 300));
37
38 #if wxUSE_STATUSBAR
39 // Give it a status line
40 frame->CreateStatusBar(2);
41 #endif // wxUSE_STATUSBAR
42
43 // Make a menubar
44 wxMenu *file_menu = new wxMenu;
45 wxMenu *help_menu = new wxMenu;
46
47 file_menu->Append(PNGDEMO_LOAD_FILE, _T("&Load file"), _T("Load file"));
48 file_menu->Append(PNGDEMO_SAVE_FILE, _T("&Save file"), _T("Save file"));
49 file_menu->Append(PNGDEMO_QUIT, _T("E&xit"), _T("Quit program"));
50 help_menu->Append(PNGDEMO_ABOUT, _T("&About"), _T("About PNG demo"));
51
52 wxMenuBar *menu_bar = new wxMenuBar;
53
54 menu_bar->Append(file_menu, _T("&File"));
55 menu_bar->Append(help_menu, _T("&Help"));
56
57 // Associate the menu bar with the frame
58 frame->SetMenuBar(menu_bar);
59
60 MyCanvas *canvas = new MyCanvas(frame, wxPoint(0, 0), wxSize(100, 100));
61
62 // Give it scrollbars: the virtual canvas is 20 * 50 = 1000 pixels in each direction
63 // canvas->SetScrollbars(20, 20, 50, 50, 4, 4);
64 frame->canvas = canvas;
65
66 frame->Show(true);
67
68 #if wxUSE_STATUSBAR
69 frame->SetStatusText(_T("Hello, wxWidgets"));
70 #endif // wxUSE_STATUSBAR
71
72 return true;
73 }
74
75 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
76 EVT_MENU(PNGDEMO_QUIT, MyFrame::OnQuit)
77 EVT_MENU(PNGDEMO_ABOUT, MyFrame::OnAbout)
78 EVT_MENU(PNGDEMO_LOAD_FILE, MyFrame::OnLoadFile)
79 EVT_MENU(PNGDEMO_SAVE_FILE, MyFrame::OnSaveFile)
80 END_EVENT_TABLE()
81
82 // Define my frame constructor
83 MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
84 wxFrame(frame, wxID_ANY, title, pos, size)
85 {
86 canvas = (MyCanvas *) NULL;
87 }
88
89 // frame destructor
90 MyFrame::~MyFrame()
91 {
92 if (g_TestBitmap)
93 {
94 delete g_TestBitmap;
95 g_TestBitmap = (wxBitmap *) NULL;
96 }
97 }
98
99 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
100 {
101 Close(true);
102 }
103
104 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
105 {
106 (void)wxMessageBox(_T("PNG demo\nJulian Smart (c) 1998"),
107 _T("About PNG Demo"), wxOK);
108 }
109
110 void MyFrame::OnSaveFile(wxCommandEvent& WXUNUSED(event))
111 {
112 #if wxUSE_FILEDLG
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.empty()) 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 #endif // wxUSE_FILEDLG
138 }
139
140 void MyFrame::OnLoadFile(wxCommandEvent& WXUNUSED(event))
141 {
142 #if wxUSE_FILEDLG
143 // Show file selector.
144 wxString f = wxFileSelector(wxT("Open Image"), (const wxChar *) NULL,
145 (const wxChar *) NULL, wxT("png"),
146 wxT("PNG files (*.png)|*.png"));
147
148 if (f.empty())
149 return;
150
151 if ( g_TestBitmap )
152 delete g_TestBitmap;
153
154 g_TestBitmap = new wxBitmap(f, wxBITMAP_TYPE_PNG);
155 if (!g_TestBitmap->Ok())
156 {
157 delete g_TestBitmap;
158 g_TestBitmap = (wxBitmap *) NULL;
159 }
160
161 canvas->Refresh();
162 #endif // wxUSE_FILEDLG
163 }
164
165 BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
166 EVT_PAINT(MyCanvas::OnPaint)
167 END_EVENT_TABLE()
168
169 // Define a constructor for my canvas
170 MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size):
171 wxScrolledWindow(parent, wxID_ANY, pos, size)
172 {
173 }
174
175 // Define the repainting behaviour
176 void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
177 {
178 wxPaintDC dc(this);
179 dc.SetPen(* wxRED_PEN);
180
181 int i;
182 for ( i = 0; i < 500; i += 10)
183 {
184 dc.DrawLine(0, i, 800, i);
185 }
186 if ( g_TestBitmap && g_TestBitmap->Ok() )
187 {
188 wxMemoryDC memDC;
189 if ( g_TestBitmap->GetPalette() )
190 {
191 memDC.SetPalette(* g_TestBitmap->GetPalette());
192 dc.SetPalette(* g_TestBitmap->GetPalette());
193 }
194 memDC.SelectObject(* g_TestBitmap);
195
196 // Normal, non-transparent blitting
197 dc.Blit(20, 20, g_TestBitmap->GetWidth(), g_TestBitmap->GetHeight(), & memDC, 0, 0, wxCOPY, false);
198
199 memDC.SelectObject(wxNullBitmap);
200 }
201
202 if ( g_TestBitmap && g_TestBitmap->Ok() )
203 {
204 wxMemoryDC memDC;
205 memDC.SelectObject(* g_TestBitmap);
206
207 // Transparent blitting if there's a mask in the bitmap
208 dc.Blit(20 + g_TestBitmap->GetWidth() + 20, 20, g_TestBitmap->GetWidth(), g_TestBitmap->GetHeight(), & memDC,
209 0, 0, wxCOPY, true);
210
211 memDC.SelectObject(wxNullBitmap);
212 }
213 }