Added wxBORDER_THEME, wxWindow::GetDefaultBorderForControl(), wxWindow::CanApplyThemeBorder().

wxTextCtrl and wxSearchCtrl now get the correct border on wxMSW, and the wxRichTextCtrl sample
also now demonstrates correct borders.



git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47927 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2007-08-07 19:22:43 +00:00
parent e081b01f4d
commit a047aff270
30 changed files with 241 additions and 29 deletions

View File

@@ -233,6 +233,9 @@ public:
// we don't want focus for ourselves
virtual bool AcceptsFocus() const { return false; }
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
// flags for DoSetSelection()
enum

View File

@@ -1406,7 +1406,8 @@ enum wxBorder
wxBORDER_SIMPLE = 0x02000000,
wxBORDER_RAISED = 0x04000000,
wxBORDER_SUNKEN = 0x08000000,
wxBORDER_DOUBLE = 0x10000000,
wxBORDER_DOUBLE = 0x10000000, /* deprecated */
wxBORDER_THEME = 0x10000000,
/* a mask to extract border style from the combination of flags */
wxBORDER_MASK = 0x1f200000

View File

@@ -58,6 +58,9 @@ public:
virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item);
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
private:
void MakeOwnerDrawn();

View File

@@ -47,6 +47,9 @@ public:
virtual bool SetForegroundColour(const wxColour& colour);
virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item);
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;

View File

@@ -85,6 +85,9 @@ public:
virtual bool MSWShouldPreProcessMessage(WXMSG *pMsg);
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
// common part of all ctors
void Init() { m_lastAcceptedSelection = wxID_NONE; }

View File

@@ -57,6 +57,9 @@ public:
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;

View File

@@ -58,6 +58,9 @@ public:
WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;

View File

@@ -133,6 +133,9 @@ public:
return GetCompositeControlsDefaultAttributes(variant);
}
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual void DoSetSelection(int n, bool select);

View File

@@ -115,6 +115,9 @@ public:
// it to behave normally
virtual bool AcceptsFocus() const { return wxControl::AcceptsFocus(); }
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
void SetLabelFont(const wxFont& WXUNUSED(font)) {}
void SetButtonFont(const wxFont& font) { SetFont(font); }

View File

@@ -58,6 +58,9 @@ public:
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;

View File

@@ -83,6 +83,8 @@ public:
// we should let background show through the slider (and its labels)
virtual bool HasTransparentBackground() { return true; }
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
void Command(wxCommandEvent& event);
virtual bool MSWOnScroll(int orientation, WXWORD wParam,

View File

@@ -57,6 +57,9 @@ public:
// a wxSpinButton can't do anything useful with focus, only wxSpinCtrl can
virtual bool AcceptsFocus() const { return false; }
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;

View File

@@ -54,6 +54,9 @@ public:
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxBorder GetDefaultBorder() const;
virtual wxSize DoGetBestSize() const;

View File

@@ -40,6 +40,9 @@ public:
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;

View File

@@ -170,6 +170,9 @@ public:
virtual bool AcceptsFocus() const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const;
// callbacks
void OnDropFiles(wxDropFilesEvent& event);
void OnChar(wxKeyEvent& event); // Process 'enter' if required

View File

@@ -48,6 +48,9 @@ public:
virtual void Command(wxCommandEvent& event);
virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const;
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
virtual wxSize DoGetBestSize() const;
virtual wxBorder GetDefaultBorder() const;

View File

@@ -107,6 +107,9 @@ public:
// window proc for the frames
WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
// common part of all ctors
void Init();

View File

@@ -210,6 +210,9 @@ public:
void SetState(const wxTreeItemId& node, int state);
int GetState(const wxTreeItemId& node);
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return false; }
protected:
// SetImageList helper
void SetAnyImageList(wxImageList *imageList, int which);

View File

@@ -433,6 +433,11 @@ public:
// check if a native double-buffering applies for this window
virtual bool IsDoubleBuffered() const;
// this allows you to implement standard control borders without
// repeating the code in different classes that are not derived from
// wxControl
virtual wxBorder GetDefaultBorderForControl() const;
// synthesize a wxEVT_LEAVE_WINDOW event and set m_mouseInWindow to false
void GenerateMouseLeave();

View File

@@ -580,12 +580,7 @@ public:
m_value = -1;
}
virtual bool Create( wxWindow* parent )
{
return wxRichTextStyleListBox::Create(parent, wxID_ANY,
wxPoint(0,0), wxDefaultSize,
wxSIMPLE_BORDER);
}
virtual bool Create( wxWindow* parent );
virtual wxWindow *GetControl() { return this; }

View File

@@ -201,6 +201,8 @@ public:
static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
virtual wxBorder GetDefaultBorder() const { return GetDefaultBorderForControl(); }
protected:
// the derived class must implement this function to actually draw the item
// with the given index on the provided DC

View File

@@ -1221,6 +1221,9 @@ public:
// area (normal windows can't, but e.g. menubar or statusbar can):
virtual bool CanBeOutsideClientArea() const { return false; }
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const { return true; }
protected:
// event handling specific to wxWindow
virtual bool TryValidator(wxEvent& event);
@@ -1381,6 +1384,11 @@ protected:
// specified) border for the window class
virtual wxBorder GetDefaultBorder() const;
// this allows you to implement standard control borders without
// repeating the code in different classes that are not derived from
// wxControl
virtual wxBorder GetDefaultBorderForControl() const { return wxWindowBase::GetDefaultBorder(); }
// Get the default size for the new window if no explicit size given. TLWs
// have their own default size so this is just for non top-level windows.
static int WidthDefault(int w) { return w == wxDefaultCoord ? 20 : w; }

View File

@@ -682,13 +682,13 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos,
toolBar->Realize();
wxSplitterWindow* splitter = new wxSplitterWindow(this, wxID_ANY, wxDefaultPosition, GetClientSize(), wxSP_NO_XP_THEME|wxSP_3D|wxSP_LIVE_UPDATE);
wxSplitterWindow* splitter = new wxSplitterWindow(this, wxID_ANY, wxDefaultPosition, GetClientSize(), wxSP_LIVE_UPDATE);
wxFont textFont = wxFont(12, wxROMAN, wxNORMAL, wxNORMAL);
wxFont boldFont = wxFont(12, wxROMAN, wxNORMAL, wxBOLD);
wxFont italicFont = wxFont(12, wxROMAN, wxITALIC, wxNORMAL);
m_richTextCtrl = new wxRichTextCtrl(splitter, ID_RICHTEXT_CTRL, wxEmptyString, wxDefaultPosition, wxSize(200, 200), wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS);
m_richTextCtrl = new wxRichTextCtrl(splitter, ID_RICHTEXT_CTRL, wxEmptyString, wxDefaultPosition, wxSize(200, 200), wxVSCROLL|wxHSCROLL|wxWANTS_CHARS);
wxFont font(12, wxROMAN, wxNORMAL, wxNORMAL);
m_richTextCtrl->SetFont(font);

View File

@@ -325,6 +325,12 @@ bool wxSearchCtrl::Create(wxWindow *parent, wxWindowID id,
style &= ~wxBORDER_MASK;
#ifdef __WXGTK__
style |= wxBORDER_SUNKEN;
#elif defined(__WXMSW__)
// Don't set the style explicitly, let GetDefaultBorder() work it out, unless
// we will get a sunken border (e.g. on Windows 200) in which case we must
// override with a simple border.
if (GetDefaultBorder() == wxBORDER_SUNKEN)
style |= wxBORDER_SIMPLE;
#else
style |= wxBORDER_SIMPLE;
#endif

View File

@@ -77,6 +77,11 @@ bool wxVListBox::Create(wxWindow *parent,
long style,
const wxString& name)
{
#ifdef __WXMSW__
if ((style & wxBORDER_MASK) == wxDEFAULT)
style |= wxBORDER_THEME;
#endif
style |= wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE;
if ( !wxVScrolledWindow::Create(parent, id, pos, size, style, name) )
return false;

View File

@@ -228,14 +228,7 @@ bool wxControl::MSWCreateControl(const wxChar *classname,
wxBorder wxControl::GetDefaultBorder() const
{
// we want to automatically give controls a sunken style (confusingly,
// it may not really mean sunken at all as we map it to WS_EX_CLIENTEDGE
// which is not sunken at all under Windows XP -- rather, just the default)
#if defined(__POCKETPC__) || defined(__SMARTPHONE__)
return wxBORDER_SIMPLE;
#else
return wxBORDER_SUNKEN;
#endif
return GetDefaultBorderForControl();
}
WXDWORD wxControl::MSWGetStyle(long style, WXDWORD *exstyle) const

View File

@@ -301,11 +301,6 @@ bool wxTextCtrl::Create(wxWindow *parent,
const wxValidator& validator,
const wxString& name)
{
#ifdef __WXWINCE__
if ((style & wxBORDER_MASK) == 0)
style |= wxBORDER_SIMPLE;
#endif
// base initialization
if ( !CreateControl(parent, id, pos, size, style, validator, name) )
return false;
@@ -316,6 +311,17 @@ bool wxTextCtrl::Create(wxWindow *parent,
return true;
}
// returns true if the platform should explicitly apply a theme border
bool wxTextCtrl::CanApplyThemeBorder() const
{
#ifdef __WXWINCE__
return false;
#else
// Standard text control already handles theming
return ((GetWindowStyle() & (wxTE_RICH|wxTE_RICH2)) != 0);
#endif
}
bool wxTextCtrl::MSWCreateText(const wxString& value,
const wxPoint& pos,
const wxSize& size)

View File

@@ -121,6 +121,18 @@
#endif
#endif
#if wxUSE_UXTHEME
#include "wx/msw/uxtheme.h"
#define EP_EDITTEXT 1
#define ETS_NORMAL 1
#define ETS_HOT 2
#define ETS_SELECTED 3
#define ETS_DISABLED 4
#define ETS_FOCUSED 5
#define ETS_READONLY 6
#define ETS_ASSIST 7
#endif
#if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) && wxUSE_DYNLIB_CLASS
#define HAVE_TRACKMOUSEEVENT
#endif // everything needed for TrackMouseEvent()
@@ -1274,6 +1286,27 @@ void wxWindowMSW::MSWUpdateStyle(long flagsOld, long exflagsOld)
}
}
wxBorder wxWindowMSW::GetDefaultBorderForControl() const
{
// we want to automatically give controls a sunken style (confusingly,
// it may not really mean sunken at all as we map it to WS_EX_CLIENTEDGE
// which is not sunken at all under Windows XP -- rather, just the default)
#if defined(__POCKETPC__) || defined(__SMARTPHONE__)
return wxBORDER_SIMPLE;
#else
#if wxUSE_UXTHEME
if (CanApplyThemeBorder())
{
wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive();
if (theme)
return wxBORDER_THEME;
}
#endif
return wxBORDER_SUNKEN;
#endif
}
WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const
{
// translate common wxWidgets styles to Windows ones
@@ -1328,6 +1361,7 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const
case wxBORDER_NONE:
case wxBORDER_SIMPLE:
case wxBORDER_THEME:
break;
case wxBORDER_STATIC:
@@ -1343,9 +1377,9 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const
style &= ~WS_BORDER;
break;
case wxBORDER_DOUBLE:
*exstyle |= WS_EX_DLGMODALFRAME;
break;
// case wxBORDER_DOUBLE:
// *exstyle |= WS_EX_DLGMODALFRAME;
// break;
}
// wxUniv doesn't use Windows dialog navigation functions at all
@@ -2542,7 +2576,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l
}
}
break;
#if 0
case WM_ENTERSIZEMOVE:
{
processed = HandleEnterSizeMove();
@@ -2554,7 +2588,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l
processed = HandleExitSizeMove();
}
break;
#endif
case WM_SIZING:
{
LPRECT pRect = (LPRECT)lParam;
@@ -3200,6 +3234,94 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l
break;
#endif // __WXWINCE__
#if wxUSE_UXTHEME
// If we want the default themed border then we need to draw it ourselves
case WM_NCCALCSIZE:
{
wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive();
if (theme && GetBorder() == wxBORDER_THEME)
{
// first ask the widget to calculate the border size
rc.result = MSWDefWindowProc(message, wParam, lParam);
processed = true;
// now alter the client size making room for drawing a themed border
NCCALCSIZE_PARAMS *csparam = NULL;
RECT rect;
if (wParam)
{
csparam = (NCCALCSIZE_PARAMS*)lParam;
rect = csparam->rgrc[0];
}
else
{
rect = *((RECT*)lParam);
}
wxUxThemeHandle hTheme(this, L"EDIT");
RECT rcClient = { 0, 0, 0, 0 };
wxClientDC dc(this);
if (theme->GetThemeBackgroundContentRect(
hTheme, GetHdcOf(dc), EP_EDITTEXT, ETS_NORMAL,
&rect, &rcClient) == S_OK)
{
InflateRect(&rcClient, -1, -1);
if (wParam)
csparam->rgrc[0] = rcClient;
else
*((RECT*)lParam) = rcClient;
rc.result = WVR_REDRAW;
}
}
}
break;
case WM_NCPAINT:
{
wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive();
if (theme && GetBorder() == wxBORDER_THEME)
{
// first ask the widget to paint its non-client area, such as scrollbars, etc.
rc.result = MSWDefWindowProc(message, wParam, lParam);
processed = true;
wxUxThemeHandle hTheme(this, L"EDIT");
wxWindowDC dc(this);
// Clip the DC so that you only draw on the non-client area
RECT rcBorder;
wxCopyRectToRECT(GetSize(), rcBorder);
RECT rcClient;
theme->GetThemeBackgroundContentRect(
hTheme, GetHdcOf(dc), EP_EDITTEXT, ETS_NORMAL, &rcBorder, &rcClient);
InflateRect(&rcClient, -1, -1);
::ExcludeClipRect(GetHdcOf(dc), rcClient.left, rcClient.top,
rcClient.right, rcClient.bottom);
// Make sure the background is in a proper state
if (theme->IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL))
{
theme->DrawThemeParentBackground(GetHwnd(), GetHdcOf(dc), &rcBorder);
}
// Draw the border
int nState;
if ( !IsEnabled() )
nState = ETS_DISABLED;
// should we check this?
//else if ( ::GetWindowLong(GetHwnd(), GWL_STYLE) & ES_READONLY)
// nState = ETS_READONLY;
else
nState = ETS_NORMAL;
theme->DrawThemeBackground(hTheme, GetHdcOf(dc), EP_EDITTEXT, nState, &rcBorder, NULL);
}
}
break;
#endif // wxUSE_UXTHEME
default:
// try a custom message handler
const MSWMessageHandlers::const_iterator

View File

@@ -129,6 +129,14 @@ wxRichTextCtrl::wxRichTextCtrl(wxWindow* parent,
bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style,
const wxValidator& validator, const wxString& name)
{
// Try to make this only necessary in 2.8
#if 0
#ifdef __WXMSW__
if ((style & wxBORDER_MASK) == wxDEFAULT)
style |= wxBORDER_THEME;
#endif
#endif
if (!wxTextCtrlBase::Create(parent, id, pos, size,
style|wxFULL_REPAINT_ON_RESIZE,
validator, name))

View File

@@ -822,7 +822,7 @@ bool wxRichTextStyleListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPo
bool showSelector = ((style & wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR) == 0);
m_styleListBox = new wxRichTextStyleListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, showSelector ? wxSIMPLE_BORDER : wxNO_BORDER);
m_styleListBox = new wxRichTextStyleListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, showSelector ? wxBORDER_DEFAULT : wxBORDER_NONE);
wxBoxSizer* boxSizer = new wxBoxSizer(wxVERTICAL);
@@ -837,7 +837,7 @@ bool wxRichTextStyleListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPo
m_styleChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, choices);
boxSizer->Add(m_styleListBox, 1, wxALL|wxEXPAND, 5);
boxSizer->Add(m_styleChoice, 0, wxALL|wxEXPAND, 5);
boxSizer->Add(m_styleChoice, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND, 5);
}
else
{
@@ -998,6 +998,17 @@ BEGIN_EVENT_TABLE(wxRichTextStyleComboPopup, wxRichTextStyleListBox)
EVT_LEFT_DOWN(wxRichTextStyleComboPopup::OnMouseClick)
END_EVENT_TABLE()
bool wxRichTextStyleComboPopup::Create( wxWindow* parent )
{
int borderStyle = GetDefaultBorder();
if (borderStyle == wxBORDER_SUNKEN)
borderStyle = wxBORDER_SIMPLE;
return wxRichTextStyleListBox::Create(parent, wxID_ANY,
wxPoint(0,0), wxDefaultSize,
borderStyle);
}
void wxRichTextStyleComboPopup::SetStringValue( const wxString& s )
{
m_value = SetStyleSelection(s);