// ----------------------------------------------------------------------------
#include "wx/app.h"
+#include "wx/log.h"
#include "wx/frame.h"
+#include "wx/icon.h"
#include "wx/menu.h"
#include "wx/msgdlg.h"
#include "wx/button.h"
+#include "wx/dcclient.h"
#include "wx/datetime.h"
#include "wx/ffile.h"
// ----------------------------------------------------------------------------
// just some functions to get a slightly deeper stack trace
-static void bar(const wxChar *p)
+static void bar(const char *p)
{
char *pc = 0;
*pc = *p;
void baz(const wxString& s)
{
- printf("baz: %s\n", s.c_str());
+ printf("baz: %s\n", (const char*)s.c_str());
}
void foo(int n)
{
if ( n % 2 )
- baz(wxT("odd"));
+ baz("odd");
else
- bar(wxT("even"));
+ bar("even");
}
// ----------------------------------------------------------------------------
DebugRpt_Quit = wxID_EXIT,
DebugRpt_Crash = 100,
DebugRpt_Current,
+ DebugRpt_Paint,
DebugRpt_Upload,
DebugRpt_About = wxID_ABOUT
};
void OnQuit(wxCommandEvent& event);
void OnReportForCrash(wxCommandEvent& event);
void OnReportForCurrent(wxCommandEvent& event);
+ void OnReportPaint(wxCommandEvent& event);
void OnReportUpload(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
- DECLARE_NO_COPY_CLASS(MyFrame)
+ void OnPaint(wxPaintEvent& event);
+
+
+ // number of lines drawn in OnPaint()
+ int m_numLines;
+
+ wxDECLARE_NO_COPY_CLASS(MyFrame);
DECLARE_EVENT_TABLE()
};
private:
bool m_uploadReport;
- DECLARE_NO_COPY_CLASS(MyApp)
+ wxDECLARE_NO_COPY_CLASS(MyApp);
};
IMPLEMENT_APP(MyApp)
EVT_MENU(DebugRpt_Quit, MyFrame::OnQuit)
EVT_MENU(DebugRpt_Crash, MyFrame::OnReportForCrash)
EVT_MENU(DebugRpt_Current, MyFrame::OnReportForCurrent)
+ EVT_MENU(DebugRpt_Paint, MyFrame::OnReportPaint)
EVT_MENU(DebugRpt_Upload, MyFrame::OnReportUpload)
EVT_MENU(DebugRpt_About, MyFrame::OnAbout)
+
+ EVT_PAINT(MyFrame::OnPaint)
END_EVENT_TABLE()
MyFrame::MyFrame()
- : wxFrame(NULL, wxID_ANY, _T("wxWidgets Debug Report Sample"))
+ : wxFrame(NULL, wxID_ANY, _T("wxWidgets Debug Report Sample"),
+ wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE|wxDEFAULT_FRAME_STYLE)
{
+ m_numLines = 10;
+
SetIcon(wxICON(sample));
wxMenu *menuFile = new wxMenu;
_T("Provoke a crash inside the program and create report for it"));
menuReport->Append(DebugRpt_Current, _T("Report for c&urrent context\tCtrl-U"),
_T("Create report for the current program context"));
+ menuReport->Append(DebugRpt_Paint, _T("Report for &paint handler\tCtrl-P"),
+ _T("Provoke a repeatable crash in wxEVT_PAINT handler"));
menuReport->AppendSeparator();
menuReport->AppendCheckItem(DebugRpt_Upload, _T("Up&load debug report"),
_T("You need to configure a web server accepting debug report uploads to use this function"));
wxGetApp().GenerateReport(wxDebugReport::Context_Current);
}
+void MyFrame::OnReportPaint(wxCommandEvent& WXUNUSED(event))
+{
+ // this will result in a crash in OnPaint()
+ m_numLines = 0;
+
+ // ensure it's called immediately
+ Refresh();
+}
+
void MyFrame::OnReportUpload(wxCommandEvent& event)
{
wxGetApp().UploadReport(event.IsChecked());
);
}
+void MyFrame::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+ wxPaintDC dc(this);
+ const wxSize size = GetClientSize();
+ for ( wxCoord x = 0; x < size.x; x += size.x/m_numLines )
+ dc.DrawLine(x, 0, x, size.y);
+}
+
// ----------------------------------------------------------------------------
// MyApp
// ----------------------------------------------------------------------------