Added DrawFocusRect to wxRenderer

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48125 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2007-08-16 12:15:15 +00:00
parent 4346581b7c
commit 6d78998725
11 changed files with 114 additions and 28 deletions

View File

@@ -136,6 +136,15 @@ rectangle of a drop down button which arrow matches the size you need.
\arg{flags} may have the \texttt{wxCONTROL\_PRESSED} or \texttt{wxCONTROL\_CURRENT} bit set.
\membersection{wxRendererNative::DrawFocusRect}\label{wxrenderernativedrawfocusrect}
\func{void}{DrawFocusRect}{\param{wxWindow* }{win}, \param{wxDC\& }{dc}, \param{const wxRect\& }{rect}, \param{int }{flags = 0}}
Draw a focus rectangle using the specified rectangle.
\helpref{wxListCtrl}{wxlistctrl}. The only supported flags is
\texttt{wxCONTROL\_SELECTED} for items which are selected.
\membersection{wxRendererNative::DrawHeaderButton}\label{wxrenderernativedrawheaderbutton}
\func{int}{DrawHeaderButton}{\param{wxWindow* }{win}, \param{wxDC\& }{dc}, \param{const wxRect\& }{rect}, \param{int }{flags = 0}, \param{wxHeaderSortIconType }{sortArrow = wxHDR\_SORT\_ICON\_NONE}, \param{wxHeaderButtonParams* }{params = NULL}}

View File

@@ -247,6 +247,11 @@ public:
const wxRect& rect,
int flags = 0) = 0;
// draw the focus rectangle around the label contained in the given rect
//
// only wxCONTROL_SELECTED makes sense in flags here
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0) = 0;
// geometry functions
// ------------------
@@ -380,6 +385,9 @@ public:
int flags = 0 )
{ m_rendererNative.DrawItemSelectionRect( win, dc, rect, flags ); }
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0)
{ m_rendererNative.DrawFocusRect( win, dc, rect, flags ); }
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
{ return m_rendererNative.GetSplitterParams(win); }

View File

@@ -90,12 +90,6 @@ public:
const wxRect& rect,
int flags) = 0;
// draw the focus rectangle around the label contained in the given rect
//
// only wxCONTROL_SELECTED makes sense in flags here
virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0) = 0;
// draw the label inside the given rectangle with the specified alignment
// and optionally emphasize the character with the given index
virtual void DrawLabel(wxDC& dc,

View File

@@ -38,7 +38,8 @@ public:
int flags);
virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0);
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
virtual void DrawLabel(wxDC& dc,
const wxString& label,
const wxRect& rect,

View File

@@ -104,6 +104,8 @@ public:
const wxRect& rect,
int flags = 0);
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
virtual wxRendererVersion GetVersion() const
@@ -661,6 +663,43 @@ wxRendererGeneric::DrawItemSelectionRect(wxWindow * WXUNUSED(win),
dc.DrawRectangle( rect );
}
void
wxRendererGeneric::DrawFocusRect(wxWindow* WXUNUSED(win), wxDC& dc, const wxRect& rect, int WXUNUSED(flags))
{
// draw the pixels manually because the "dots" in wxPen with wxDOT style
// may be short traits and not really dots
//
// note that to behave in the same manner as DrawRect(), we must exclude
// the bottom and right borders from the rectangle
wxCoord x1 = rect.GetLeft(),
y1 = rect.GetTop(),
x2 = rect.GetRight(),
y2 = rect.GetBottom();
dc.SetPen(m_penBlack);
// this seems to be closer than what Windows does than wxINVERT although
// I'm still not sure if it's correct
dc.SetLogicalFunction(wxAND_REVERSE);
wxCoord z;
for ( z = x1 + 1; z < x2; z += 2 )
dc.DrawPoint(z, rect.GetTop());
wxCoord shift = z == x2 ? 0 : 1;
for ( z = y1 + shift; z < y2; z += 2 )
dc.DrawPoint(x2, z);
shift = z == y2 ? 0 : 1;
for ( z = x2 - shift; z > x1; z -= 2 )
dc.DrawPoint(z, y2);
shift = z == x1 ? 0 : 1;
for ( z = y2 - shift; z > y1; z -= 2 )
dc.DrawPoint(x1, z);
dc.SetLogicalFunction(wxCOPY);
}
// ----------------------------------------------------------------------------
// A module to allow cleanup of generic renderer.

View File

@@ -92,6 +92,8 @@ public:
const wxRect& rect,
int flags = 0);
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
private:
@@ -577,3 +579,27 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win,
rect.height );
}
}
void wxRendererGTK::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
{
GdkWindow* gdk_window = dc.GetGDKWindow();
wxASSERT_MSG( gdk_window,
wxT("cannot use wxRendererNative on wxDC of this type") );
GtkStateType state;
if (flags & wxCONTROL_SELECTED)
state = GTK_STATE_SELECTED;
else
state = GTK_STATE_NORMAL;
gtk_paint_focus( win->m_widget->style,
gdk_window,
state,
NULL,
win->m_wxwindow,
NULL,
dc.LogicalToDeviceX(rect.x),
dc.LogicalToDeviceY(rect.y),
rect.width,
rect.height );
}

View File

@@ -115,6 +115,7 @@ public:
const wxRect& rect,
int flags = 0);
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
private:
DECLARE_NO_COPY_CLASS(wxRendererMSW)
};
@@ -276,6 +277,14 @@ wxRendererMSW::DrawPushButton(wxWindow * WXUNUSED(win),
::DrawFrameControl(GetHdcOf(dc), &rc, DFC_BUTTON, style);
}
void wxRendererMSW::DrawFocusRect(wxWindow* WXUNUSED(win), wxDC& dc, const wxRect& rect, int WXUNUSED(flags))
{
RECT rc;
wxCopyRectToRECT(rect, rc);
::DrawFocusRect(GetHdcOf(dc), &rc);
}
// ============================================================================
// wxRendererXP implementation
// ============================================================================

View File

@@ -199,7 +199,7 @@ void wxStdRenderer::DrawButtonSurface(wxDC& dc,
// ----------------------------------------------------------------------------
void
wxStdRenderer::DrawFocusRect(wxDC& dc, const wxRect& rect, int WXUNUSED(flags))
wxStdRenderer::DrawFocusRect(wxWindow* WXUNUSED(win), wxDC& dc, const wxRect& rect, int WXUNUSED(flags))
{
// draw the pixels manually because the "dots" in wxPen with wxDOT style
// may be short traits and not really dots
@@ -290,7 +290,7 @@ void wxStdRenderer::DrawButtonLabel(wxDC& dc,
{
rectLabel.Inflate(-1);
DrawFocusRect(dc, rectLabel);
DrawFocusRect(NULL, dc, rectLabel);
}
}
@@ -632,7 +632,7 @@ void wxStdRenderer::DrawItem(wxDC& dc,
if ( flags & wxCONTROL_FOCUSED )
{
DrawFocusRect(dc, rect, flags);
DrawFocusRect(NULL, dc, rect, flags);
}
}

View File

@@ -85,7 +85,7 @@ public:
wxGTKRenderer(const wxColourScheme *scheme);
// wxRenderer methods
virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0);
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
virtual void DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rect,
@@ -814,7 +814,7 @@ void wxGTKRenderer::DrawSunkenBorder(wxDC& dc, wxRect *rect)
}
void
wxGTKRenderer::DrawFocusRect(wxDC& dc, const wxRect& rect, int WXUNUSED(flags))
wxGTKRenderer::DrawFocusRect(wxWindow* WXUNUSED(win), wxDC& dc, const wxRect& rect, int WXUNUSED(flags))
{
dc.SetBrush(*wxTRANSPARENT_BRUSH);
wxRect rectFocus = rect;

View File

@@ -62,7 +62,7 @@ public:
int indexAccel = -1,
wxRect *rectBounds = NULL);
virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0);
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
virtual void DrawButtonBorder(wxDC& dc,
const wxRect& rect,
@@ -702,7 +702,7 @@ wxMonoRenderer::DrawVerticalLine(wxDC& dc, wxCoord x, wxCoord y1, wxCoord y2)
dc.DrawLine(x, y1, x, y2 + 1);
}
void wxMonoRenderer::DrawFocusRect(wxDC& dc, const wxRect& rect, int flags)
void wxMonoRenderer::DrawFocusRect(wxWindow* WXUNUSED(win), wxDC& dc, const wxRect& rect, int flags)
{
// no need to draw the focus rect for selected items, it would be invisible
// anyhow

View File

@@ -2053,7 +2053,7 @@ void wxWin32Renderer::DrawSliderShaft(wxDC& dc,
*/
if (flags & wxCONTROL_FOCUSED) {
DrawFocusRect(dc, rectOrig);
DrawFocusRect(NULL, dc, rectOrig);
}
wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style);