virtualized splitter drawing; removed/deprecated some styles and moved others from wx/defs.h; eliminated flicker

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22218 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-07-21 23:12:17 +00:00
parent f65a69e9a0
commit b3208e1158
8 changed files with 310 additions and 343 deletions

View File

@@ -42,21 +42,46 @@
class WXDLLEXPORT wxRendererGeneric : public wxRendererNative
{
public:
// draw the header control button (used by wxListCtrl)
wxRendererGeneric();
virtual void DrawHeaderButton(wxWindow *win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
// draw the expanded/collapsed icon for a tree control item
virtual void DrawTreeItemButton(wxWindow *win,
wxDC& dc,
const wxRect& rect,
int flags = 0);
virtual void DrawSplitterBorder(wxWindow *win,
wxDC& dc,
const wxRect& rect);
virtual void DrawSplitterSash(wxWindow *win,
wxDC& dc,
const wxSize& size,
wxCoord position);
virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win);
protected:
// draw the rectange using the first pen for the left and top sides and
// the second one for the bottom and right ones
void DrawShadedRect(wxDC& dc, wxRect *rect,
const wxPen& pen1, const wxPen& pen2);
// the standard pens
wxPen m_penBlack,
m_penDarkGrey,
m_penLightGrey,
m_penHighlight;
};
// ============================================================================
// implementation
// wxRendererGeneric implementation
// ============================================================================
// ----------------------------------------------------------------------------
@@ -82,8 +107,42 @@ wxRendererNative& wxRendererNative::Get()
#endif // platforms using their own renderers
wxRendererGeneric::wxRendererGeneric()
: m_penBlack(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW)),
m_penDarkGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)),
m_penLightGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)),
m_penHighlight(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT))
{
}
// ----------------------------------------------------------------------------
// wxRendererGeneric drawing functions
// wxRendererGeneric helpers
// ----------------------------------------------------------------------------
void
wxRendererGeneric::DrawShadedRect(wxDC& dc,
wxRect *rect,
const wxPen& pen1,
const wxPen& pen2)
{
// draw the rectangle
dc.SetPen(pen1);
dc.DrawLine(rect->GetLeft(), rect->GetTop(),
rect->GetLeft(), rect->GetBottom());
dc.DrawLine(rect->GetLeft() + 1, rect->GetTop(),
rect->GetRight(), rect->GetTop());
dc.SetPen(pen2);
dc.DrawLine(rect->GetRight(), rect->GetTop(),
rect->GetRight(), rect->GetBottom());
dc.DrawLine(rect->GetLeft(), rect->GetBottom(),
rect->GetRight() + 1, rect->GetBottom());
// adjust the rect
rect->Inflate(-1);
}
// ----------------------------------------------------------------------------
// tree/list ctrl drawing
// ----------------------------------------------------------------------------
void
@@ -99,19 +158,17 @@ wxRendererGeneric::DrawHeaderButton(wxWindow *win,
w = rect.width,
h = rect.height;
dc.SetBrush( *wxTRANSPARENT_BRUSH );
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetPen( *wxBLACK_PEN );
dc.SetPen(m_penBlack);
dc.DrawLine( x+w-CORNER+1, y, x+w, y+h ); // right (outer)
dc.DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer)
wxPen pen( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW ), 1, wxSOLID );
dc.SetPen( pen );
dc.SetPen(m_penDarkGrey);
dc.DrawLine( x+w-CORNER, y, x+w-1, y+h ); // right (inner)
dc.DrawRectangle( x+1, y+h-1, w-2, 1 ); // bottom (inner)
dc.SetPen( *wxWHITE_PEN );
dc.SetPen(m_penHighlight);
dc.DrawRectangle( x, y, w-CORNER+1, 1 ); // top (outer)
dc.DrawRectangle( x, y, 1, h ); // left (outer)
dc.DrawLine( x, y+h-1, x+1, y+h-1 );
@@ -143,4 +200,66 @@ wxRendererGeneric::DrawTreeItemButton(wxWindow *win,
}
}
// ----------------------------------------------------------------------------
// sash drawing
// ----------------------------------------------------------------------------
wxPoint
wxRendererGeneric::GetSplitterSashAndBorder(const wxWindow * WXUNUSED(win))
{
// see below
return wxPoint(7, 2);
}
void
wxRendererGeneric::DrawSplitterBorder(wxWindow * WXUNUSED(win),
wxDC& dc,
const wxRect& rectOrig)
{
wxRect rect = rectOrig;
DrawShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight);
DrawShadedRect(dc, &rect, m_penBlack, m_penLightGrey);
}
void
wxRendererGeneric::DrawSplitterSash(wxWindow * WXUNUSED(win),
wxDC& dc,
const wxSize& size,
wxCoord position)
{
// we draw a Win32-like sash here:
//
// ---- this is position
// /
// v
// dWGGGDd
// GWGGGDB
// GWGGGDB where G is light grey (face)
// GWGGGDB W white (light)
// GWGGGDB D dark grey (shadow)
// GWGGGDB B black (dark shadow)
// GWGGGDB
// GWGGGDB and lower letters are our border (already drawn)
// GWGGGDB
// wWGGGDd
const wxCoord h = size.y;
// from left to right
dc.SetPen(m_penLightGrey);
dc.DrawLine(position, 1, position, h - 1);
dc.SetPen(m_penHighlight);
dc.DrawLine(position + 1, 0, position + 1, h);
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)));
dc.DrawRectangle(position + 2, 0, 3, h);
dc.SetPen(m_penDarkGrey);
dc.DrawLine(position + 5, 0, position + 5, h);
dc.SetPen(m_penBlack);
dc.DrawLine(position + 6, 1, position + 6, h - 1);
}