Merge branch 'drawing-lines'

Fix drawing of dotted/hatched lines in wxMSW and some drawing sample
improvements.

Closes #7097.

See https://github.com/wxWidgets/wxWidgets/pull/1771
This commit is contained in:
Vadim Zeitlin
2020-03-27 20:22:17 +01:00
2 changed files with 33 additions and 40 deletions

View File

@@ -203,31 +203,16 @@ public:
m_canvas->UseGraphicRenderer(NULL); m_canvas->UseGraphicRenderer(NULL);
} }
void OnGraphicContextNoneUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == NULL);
}
void OnGraphicContextDefault(wxCommandEvent& WXUNUSED(event)) void OnGraphicContextDefault(wxCommandEvent& WXUNUSED(event))
{ {
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDefaultRenderer()); m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDefaultRenderer());
} }
void OnGraphicContextDefaultUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->IsDefaultRenderer());
}
#if wxUSE_CAIRO #if wxUSE_CAIRO
void OnGraphicContextCairo(wxCommandEvent& WXUNUSED(event)) void OnGraphicContextCairo(wxCommandEvent& WXUNUSED(event))
{ {
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetCairoRenderer()); m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetCairoRenderer());
} }
void OnGraphicContextCairoUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == wxGraphicsRenderer::GetCairoRenderer());
}
#endif // wxUSE_CAIRO #endif // wxUSE_CAIRO
#ifdef __WXMSW__ #ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_GDIPLUS
@@ -235,22 +220,12 @@ public:
{ {
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetGDIPlusRenderer()); m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetGDIPlusRenderer());
} }
void OnGraphicContextGDIPlusUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == wxGraphicsRenderer::GetGDIPlusRenderer());
}
#endif #endif
#if wxUSE_GRAPHICS_DIRECT2D #if wxUSE_GRAPHICS_DIRECT2D
void OnGraphicContextDirect2D(wxCommandEvent& WXUNUSED(event)) void OnGraphicContextDirect2D(wxCommandEvent& WXUNUSED(event))
{ {
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDirect2DRenderer()); m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDirect2DRenderer());
} }
void OnGraphicContextDirect2DUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == wxGraphicsRenderer::GetDirect2DRenderer());
}
#endif #endif
#endif // __WXMSW__ #endif // __WXMSW__
void OnAntiAliasing(wxCommandEvent& event) void OnAntiAliasing(wxCommandEvent& event)
@@ -639,7 +614,7 @@ void MyCanvas::DrawTestPoly(wxDC& dc)
void MyCanvas::DrawTestLines( int x, int y, int width, wxDC &dc ) void MyCanvas::DrawTestLines( int x, int y, int width, wxDC &dc )
{ {
dc.SetPen( wxPen( *wxBLACK, width ) ); dc.SetPen( wxPen( *wxBLACK, width ) );
dc.SetBrush( *wxRED_BRUSH ); dc.SetBrush( *wxWHITE_BRUSH );
dc.DrawText(wxString::Format("Testing lines of width %d", width), x + 10, y - 10); dc.DrawText(wxString::Format("Testing lines of width %d", width), x + 10, y - 10);
dc.DrawRectangle( x+10, y+10, 100, 190 ); dc.DrawRectangle( x+10, y+10, 100, 190 );
@@ -2230,21 +2205,16 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
EVT_MENU (File_GC_Default, MyFrame::OnGraphicContextDefault) EVT_MENU (File_GC_Default, MyFrame::OnGraphicContextDefault)
EVT_UPDATE_UI (File_GC_Default, MyFrame::OnGraphicContextDefaultUpdateUI)
EVT_MENU (File_DC, MyFrame::OnGraphicContextNone) EVT_MENU (File_DC, MyFrame::OnGraphicContextNone)
EVT_UPDATE_UI (File_DC, MyFrame::OnGraphicContextNoneUpdateUI)
#if wxUSE_CAIRO #if wxUSE_CAIRO
EVT_MENU (File_GC_Cairo, MyFrame::OnGraphicContextCairo) EVT_MENU (File_GC_Cairo, MyFrame::OnGraphicContextCairo)
EVT_UPDATE_UI (File_GC_Cairo, MyFrame::OnGraphicContextCairoUpdateUI)
#endif // wxUSE_CAIRO #endif // wxUSE_CAIRO
#ifdef __WXMSW__ #ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_GDIPLUS
EVT_MENU (File_GC_GDIPlus, MyFrame::OnGraphicContextGDIPlus) EVT_MENU (File_GC_GDIPlus, MyFrame::OnGraphicContextGDIPlus)
EVT_UPDATE_UI (File_GC_GDIPlus, MyFrame::OnGraphicContextGDIPlusUpdateUI)
#endif #endif
#if wxUSE_GRAPHICS_DIRECT2D #if wxUSE_GRAPHICS_DIRECT2D
EVT_MENU (File_GC_Direct2D, MyFrame::OnGraphicContextDirect2D) EVT_MENU (File_GC_Direct2D, MyFrame::OnGraphicContextDirect2D)
EVT_UPDATE_UI (File_GC_Direct2D, MyFrame::OnGraphicContextDirect2DUpdateUI)
#endif #endif
#endif // __WXMSW__ #endif // __WXMSW__
EVT_MENU (File_AntiAliasing, MyFrame::OnAntiAliasing) EVT_MENU (File_AntiAliasing, MyFrame::OnAntiAliasing)
@@ -2292,17 +2262,39 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
wxMenu *menuFile = new wxMenu; wxMenu *menuFile = new wxMenu;
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
menuFile->AppendCheckItem(File_GC_Default, "Use default wx&GraphicContext\t1"); // Number the different renderer choices consecutively, starting from 0.
m_menuItemUseDC = menuFile->AppendRadioItem(File_DC, "Use wx&DC\t0"); int accel = 0;
m_menuItemUseDC = menuFile->AppendRadioItem
(
File_DC,
wxString::Format("Use wx&DC\t%d", accel++)
);
menuFile->AppendRadioItem
(
File_GC_Default,
wxString::Format("Use default wx&GraphicContext\t%d", accel++)
);
#if wxUSE_CAIRO #if wxUSE_CAIRO
menuFile->AppendRadioItem(File_GC_Cairo, "Use &Cairo\t2"); menuFile->AppendRadioItem
(
File_GC_Cairo,
wxString::Format("Use &Cairo\t%d", accel++)
);
#endif // wxUSE_CAIRO #endif // wxUSE_CAIRO
#ifdef __WXMSW__ #ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS #if wxUSE_GRAPHICS_GDIPLUS
menuFile->AppendRadioItem(File_GC_GDIPlus, "Use &GDI+\t3"); menuFile->AppendRadioItem
(
File_GC_GDIPlus,
wxString::Format("Use &GDI+\t%d", accel++)
);
#endif #endif
#if wxUSE_GRAPHICS_DIRECT2D #if wxUSE_GRAPHICS_DIRECT2D
menuFile->AppendRadioItem(File_GC_Direct2D, "Use &Direct2D\t4"); menuFile->AppendRadioItem
(
File_GC_Direct2D,
wxString::Format("Use &Direct2D\t%d", accel++)
);
#endif #endif
#endif // __WXMSW__ #endif // __WXMSW__
#endif // wxUSE_GRAPHICS_CONTEXT #endif // wxUSE_GRAPHICS_CONTEXT

View File

@@ -284,9 +284,7 @@ bool wxPenRefData::Alloc()
// CreatePen() // CreatePen()
if ( m_join == wxJOIN_ROUND && if ( m_join == wxJOIN_ROUND &&
m_cap == wxCAP_ROUND && m_cap == wxCAP_ROUND &&
m_style != wxPENSTYLE_USER_DASH && m_style == wxPENSTYLE_SOLID )
m_style != wxPENSTYLE_STIPPLE &&
(m_width <= 1 || m_style == wxPENSTYLE_SOLID) )
{ {
m_hPen = ::CreatePen(ConvertPenStyle(m_style), m_width, col); m_hPen = ::CreatePen(ConvertPenStyle(m_style), m_width, col);
} }
@@ -358,7 +356,10 @@ bool wxPenRefData::Alloc()
dash = NULL; dash = NULL;
} }
m_hPen = ::ExtCreatePen(styleMSW, m_width, &lb, m_nbDash, (LPDWORD)dash); // Note that width can't be 0 for ExtCreatePen(), unlike for CreatePen().
int width = m_width == 0 ? 1 : m_width;
m_hPen = ::ExtCreatePen(styleMSW, width, &lb, m_nbDash, (LPDWORD)dash);
delete [] dash; delete [] dash;
} }