// wxControl implementation
// ============================================================================
-// ----------------------------------------------------------------------------
-// wxControl ctor/dtor
-// ----------------------------------------------------------------------------
-
-wxControl::~wxControl()
-{
- m_isBeingDeleted = true;
-}
-
// ----------------------------------------------------------------------------
// control window creation
// ----------------------------------------------------------------------------
label.wx_str(), // the window name
style, // the window style
x, y, w, h, // the window position and size
- GetHwndOf(GetParent()), // parent
- (HMENU)GetId(), // child id
+ GetHwndOf(GetParent()), // parent
+ (HMENU)wxUIntToPtr(GetId()), // child id
wxGetInstance(), // app instance
NULL // creation parameters
);
if ( !m_hWnd )
{
-#ifdef __WXDEBUG__
- wxFAIL_MSG(wxString::Format
- (
- _T("CreateWindowEx(\"%s\", flags=%08x, ex=%08x) failed"),
- classname, (unsigned int)style, (unsigned int)exstyle
- ));
-#endif // __WXDEBUG__
+ wxLogLastError(wxString::Format
+ (
+ wxT("CreateWindowEx(\"%s\", flags=%08lx, ex=%08lx)"),
+ classname, style, exstyle
+ ));
return false;
}
+#if !wxUSE_UNICODE
+ // Text labels starting with the character 0xff (which is a valid character
+ // in many code pages) don't appear correctly as CreateWindowEx() has some
+ // special treatment for this case, apparently the strings starting with -1
+ // are not really strings but something called "ordinals". There is no
+ // documentation about it but the fact is that the label gets mangled or
+ // not displayed at all if we don't do this, see #9572.
+ //
+ // Notice that 0xffff is not a valid Unicode character so the problem
+ // doesn't arise in Unicode build.
+ if ( !label.empty() && label[0] == -1 )
+ ::SetWindowText(GetHwnd(), label.wx_str());
+#endif // !wxUSE_UNICODE
+
// saving the label in m_labelOrig to return it verbatim
// later in GetLabel()
m_labelOrig = label;
wxSize wxControl::DoGetBestSize() const
{
+ if (m_windowSizer)
+ return wxControlBase::DoGetBestSize();
+
return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT);
}
return attrs;
}
-// another version for the "composite", i.e. non simple controls
-/* static */ wxVisualAttributes
-wxControl::GetCompositeControlsDefaultAttributes(wxWindowVariant WXUNUSED(variant))
-{
- wxVisualAttributes attrs;
- attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
- attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
- attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
-
- return attrs;
-}
-
// ----------------------------------------------------------------------------
// message handling
// ----------------------------------------------------------------------------
bool wxControl::ProcessCommand(wxCommandEvent& event)
{
- return GetEventHandler()->ProcessEvent(event);
+ return HandleWindowEvent(event);
}
bool wxControl::MSWOnNotify(int idCtrl,
event.SetEventType(eventType);
event.SetEventObject(this);
- return GetEventHandler()->ProcessEvent(event);
+ return HandleWindowEvent(event);
}
WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd)
{
HDC hdc = (HDC)pDC;
- if ( m_hasFgCol )
- {
- ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
- }
WXHBRUSH hbr = 0;
if ( !colBg.Ok() )
colBg = GetBackgroundColour();
}
- // use the background colour override if a valid colour is given
+ // use the background colour override if a valid colour is given: this is
+ // used when the control is disabled to grey it out and also if colBg was
+ // set just above
if ( colBg.Ok() )
{
- ::SetBkColor(hdc, wxColourToRGB(colBg));
-
- // draw children with the same colour as the parent
- wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBg, wxSOLID);
-
+ wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBg);
hbr = (WXHBRUSH)brush->GetResourceHandle();
+ }
+ // always set the foreground colour if we changed the background, whether
+ // m_hasFgCol is true or not: if it true, we must do it, of course, but
+ // even if it isn't, we must set the default foreground explicitly as by
+ // default just the simple black is used
+ if ( hbr )
+ {
+ ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
}
- // if we use custom background, we should set foreground ourselves too
- if ( hbr && !m_hasFgCol )
+ // finally also set the background colour for text drawing: without this,
+ // the text in an edit control is drawn using the default background even
+ // if we return a valid brush
+ if ( colBg.IsOk() || m_hasBgCol )
{
- ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT));
+ if ( !colBg.IsOk() )
+ colBg = GetBackgroundColour();
+
+ ::SetBkColor(hdc, wxColourToRGB(colBg));
}
- //else: already set above
return hbr;
}
WXHBRUSH wxControl::MSWControlColor(WXHDC pDC, WXHWND hWnd)
{
- wxColour colBg;
-
if ( HasTransparentBackground() )
::SetBkMode((HDC)pDC, TRANSPARENT);
- else // if the control is opaque it shouldn't use the parents background
- colBg = GetBackgroundColour();
- return DoMSWControlColor(pDC, colBg, hWnd);
+ // don't pass any background colour to DoMSWControlColor(), our own
+ // background colour will be used by it only if it is set, otherwise the
+ // defaults will be used
+ return DoMSWControlColor(pDC, wxColour(), hWnd);
}
WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC)