X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/170acdc90e9f92f8b8120fa6c04acdbf45c89582..73799292cab3e8fa4873a5aecd2d312ad2fbf5e5:/src/msw/control.cpp diff --git a/src/msw/control.cpp b/src/msw/control.cpp index 3797cab625..06d75a9921 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -35,6 +35,7 @@ #include "wx/dcclient.h" #include "wx/log.h" #include "wx/settings.h" + #include "wx/ctrlsub.h" #endif #if wxUSE_LISTCTRL @@ -58,15 +59,6 @@ IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow) // wxControl implementation // ============================================================================ -// ---------------------------------------------------------------------------- -// wxControl ctor/dtor -// ---------------------------------------------------------------------------- - -wxControl::~wxControl() -{ - m_isBeingDeleted = true; -} - // ---------------------------------------------------------------------------- // control window creation // ---------------------------------------------------------------------------- @@ -140,28 +132,44 @@ bool wxControl::MSWCreateControl(const wxChar *classname, ( exstyle, // extended style classname, // the kind of control to create - label, // the window name + 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 + ( + _T("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; + // install wxWidgets window proc for this window SubclassWin(m_hWnd); @@ -169,11 +177,27 @@ bool wxControl::MSWCreateControl(const wxChar *classname, InheritAttributes(); if ( !m_hasFont ) { -#if wxUSE_LISTCTRL || wxUSE_TREECTRL + bool setFont = true; + + wxFont font = GetDefaultAttributes().font; + // if we set a font for {list,tree}ctrls and the font size is changed in // the display properties then the font size for these controls doesn't // automatically adjust when they receive WM_SETTINGCHANGE - if ( wxDynamicCastThis(wxListCtrl) || wxDynamicCastThis(wxTreeCtrl) ) + + // FIXME: replace the dynamic casts with virtual function calls!! +#if wxUSE_LISTCTRL || wxUSE_TREECTRL + bool testFont = false; +#if wxUSE_LISTCTRL + if ( wxDynamicCastThis(wxListCtrl) ) + testFont = true; +#endif // wxUSE_LISTCTRL +#if wxUSE_TREECTRL + if ( wxDynamicCastThis(wxTreeCtrl) ) + testFont = true; +#endif // wxUSE_TREECTRL + + if ( testFont ) { // not sure if we need to explicitly set the font here for Win95/NT4 // but we definitely can't do it for any newer version @@ -182,14 +206,14 @@ bool wxControl::MSWCreateControl(const wxChar *classname, // TODO: test Win95/NT4 to see if this is needed or breaks the // font resizing as it does on newer versions - wxFont font = GetDefaultAttributes().font; - if ( font == wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) ) + if ( font != wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) ) { - SetFont(font); + setFont = false; } } - else #endif // wxUSE_LISTCTRL || wxUSE_TREECTRL + + if ( setFont ) { SetFont(GetDefaultAttributes().font); } @@ -205,23 +229,11 @@ bool wxControl::MSWCreateControl(const wxChar *classname, // various accessors // ---------------------------------------------------------------------------- -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 -} - WXDWORD wxControl::MSWGetStyle(long style, WXDWORD *exstyle) const { long msStyle = wxWindow::MSWGetStyle(style, exstyle); - if ( AcceptsFocus() ) + if ( AcceptsFocusFromKeyboard() ) { msStyle |= WS_TABSTOP; } @@ -231,9 +243,17 @@ WXDWORD wxControl::MSWGetStyle(long style, WXDWORD *exstyle) const wxSize wxControl::DoGetBestSize() const { + if (m_windowSizer) + return wxControlBase::DoGetBestSize(); + return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT); } +wxBorder wxControl::GetDefaultBorder() const +{ + return wxControlBase::GetDefaultBorder(); +} + // This is a helper for all wxControls made with UPDOWN native control. // In wxMSW it was only wxSpinCtrl derived from wxSpinButton but in // WinCE of Smartphones this happens also for native wxTextCtrl, @@ -301,7 +321,7 @@ wxControl::GetCompositeControlsDefaultAttributes(wxWindowVariant WXUNUSED(varian bool wxControl::ProcessCommand(wxCommandEvent& event) { - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxControl::MSWOnNotify(int idCtrl, @@ -349,7 +369,7 @@ 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) @@ -378,10 +398,9 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) ::SetBkColor(hdc, wxColourToRGB(colBg)); // draw children with the same colour as the parent - wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBg, wxSOLID); - + wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBg, + wxBRUSHSTYLE_SOLID); hbr = (WXHBRUSH)brush->GetResourceHandle(); - } // if we use custom background, we should set foreground ourselves too @@ -413,6 +432,42 @@ WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC) GetHWND()); } +// ---------------------------------------------------------------------------- +// wxControlWithItems +// ---------------------------------------------------------------------------- + +void wxControlWithItems::MSWAllocStorage(const wxArrayStringsAdapter& items, + unsigned wm) +{ + const unsigned numItems = items.GetCount(); + unsigned long totalTextLength = numItems; // for trailing '\0' characters + for ( unsigned i = 0; i < numItems; ++i ) + { + totalTextLength += items[i].length(); + } + + if ( SendMessage((HWND)MSWGetItemsHWND(), wm, numItems, + (LPARAM)totalTextLength*sizeof(wxChar)) == LB_ERRSPACE ) + { + wxLogLastError(wxT("SendMessage(XX_INITSTORAGE)")); + } +} + +int wxControlWithItems::MSWInsertOrAppendItem(unsigned pos, + const wxString& item, + unsigned wm) +{ + LRESULT n = SendMessage((HWND)MSWGetItemsHWND(), wm, pos, + (LPARAM)item.wx_str()); + if ( n == CB_ERR || n == CB_ERRSPACE ) + { + wxLogLastError(wxT("SendMessage(XX_ADD/INSERTSTRING)")); + return wxNOT_FOUND; + } + + return n; +} + // --------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------