X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d8ecfb85ee401dc31ef80ce75d0f065835e0a7db..8f4d9fcd9a1133442aa733e978231b01956e641b:/src/msw/control.cpp diff --git a/src/msw/control.cpp b/src/msw/control.cpp index 1a8d53a18e..3b60836933 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -1,75 +1,105 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: control.cpp +// Name: msw/control.cpp // Purpose: wxControl class // Author: Julian Smart // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "control.h" +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma implementation "control.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_CONTROLS + #ifndef WX_PRECOMP -#include "wx/event.h" -#include "wx/app.h" -#include "wx/dcclient.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/dcclient.h" + #include "wx/log.h" + #include "wx/settings.h" #endif #include "wx/control.h" #include "wx/msw/private.h" -#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) +#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)) #include #endif +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow) BEGIN_EVENT_TABLE(wxControl, wxWindow) EVT_ERASE_BACKGROUND(wxControl::OnEraseBackground) END_EVENT_TABLE() -// Item members -wxControl::wxControl() -{ - m_backgroundColour = *wxWHITE; - m_foregroundColour = *wxBLACK; +// ============================================================================ +// wxControl implementation +// ============================================================================ -#if WXWIN_COMPATIBILITY - m_callback = 0; -#endif // WXWIN_COMPATIBILITY -} +// ---------------------------------------------------------------------------- +// wxControl ctor/dtor +// ---------------------------------------------------------------------------- wxControl::~wxControl() { m_isBeingDeleted = TRUE; } +// ---------------------------------------------------------------------------- +// control window creation +// ---------------------------------------------------------------------------- -bool wxControl::Create(wxWindow *parent, wxWindowID id, +bool wxControl::Create(wxWindow *parent, + wxWindowID id, const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, + const wxSize& size, + long style, + const wxValidator& wxVALIDATOR_PARAM(validator), const wxString& name) { - bool rval = wxWindow::Create(parent, id, pos, size, style, name); - if (rval) { + if ( !wxWindow::Create(parent, id, pos, size, style, name) ) + return FALSE; + #if wxUSE_VALIDATORS - SetValidator(validator); + SetValidator(validator); #endif - } - return rval; + + return TRUE; +} + +bool wxControl::MSWCreateControl(const wxChar *classname, + const wxString& label, + const wxPoint& pos, + const wxSize& size) +{ + WXDWORD exstyle; + WXDWORD msStyle = MSWGetStyle(GetWindowStyle(), &exstyle); + + return MSWCreateControl(classname, msStyle, pos, size, label, exstyle); } bool wxControl::MSWCreateControl(const wxChar *classname, @@ -79,19 +109,30 @@ bool wxControl::MSWCreateControl(const wxChar *classname, const wxString& label, WXDWORD exstyle) { - // VZ: if someone could put a comment here explaining what exactly this is - // needed for, it would be nice... - bool want3D; - // if no extended style given, determine it ourselves if ( exstyle == (WXDWORD)-1 ) { - exstyle = GetExStyle(style, &want3D); + exstyle = 0; + (void) MSWGetStyle(GetWindowStyle(), &exstyle); + } + + // all controls should have this style + style |= WS_CHILD; + + // create the control visible if it's currently shown for wxWindows + if ( m_isShown ) + { + style |= WS_VISIBLE; } - // all controls have these childs (wxWindows creates all controls visible - // by default) - style |= WS_CHILD | WS_VISIBLE; + // choose the position for the control + int x = pos.x == -1 ? 0 : pos.x, + y = pos.y == -1 ? 0 : pos.y, + w = size.x == -1 ? 0 : size.x, + h = size.y == -1 ? 0 : size.y; + + // ... and adjust it to account for ap ossible parent frames toolbar + AdjustForParentClientOrigin(x, y); m_hWnd = (WXHWND)::CreateWindowEx ( @@ -99,8 +140,7 @@ bool wxControl::MSWCreateControl(const wxChar *classname, classname, // the kind of control to create label, // the window name style, // the window style - pos.x, pos.y, // the window position - size.x, size.y, // and size + x, y, w, h, // the window position and size GetHwndOf(GetParent()), // parent (HMENU)GetId(), // child id wxGetInstance(), // app instance @@ -109,9 +149,8 @@ bool wxControl::MSWCreateControl(const wxChar *classname, if ( !m_hWnd ) { -#ifdef __WXDEBUG__ - wxLogError(wxT("Failed to create a control of class '%s'"), classname); -#endif // DEBUG + wxLogDebug(wxT("Failed to create a control of class '%s'"), classname); + wxFAIL_MSG(_T("something is very wrong")); return FALSE; } @@ -124,32 +163,87 @@ bool wxControl::MSWCreateControl(const wxChar *classname, } #endif // wxUSE_CTL3D - // subclass again for purposes of dialog editing mode + // install wxWindows window proc for this window SubclassWin(m_hWnd); - // controls use the same font and colours as their parent dialog by default + // set up fonts and colours InheritAttributes(); + SetFont(GetDefaultAttributes().font); + + // set the size now if no initial size specified + if ( w <= 0 || h <= 0 ) + { + SetBestSize(size); + } return TRUE; } +// ---------------------------------------------------------------------------- +// 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) + return wxBORDER_SUNKEN; +} + +WXDWORD wxControl::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + long msStyle = wxWindow::MSWGetStyle(style, exstyle); + + if ( AcceptsFocus() ) + { + msStyle |= WS_TABSTOP; + } + + return msStyle; +} + wxSize wxControl::DoGetBestSize() const { return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT); } -bool wxControl::ProcessCommand(wxCommandEvent& event) +/* static */ wxVisualAttributes +wxControl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { -#if WXWIN_COMPATIBILITY - if ( m_callback ) - { - (void)(*m_callback)(*this, event); + wxVisualAttributes attrs; - return TRUE; - } - else -#endif // WXWIN_COMPATIBILITY + // old school (i.e. not "common") controls use the standard dialog font + // by default + attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + + // most, or at least many, of the controls use the same colours as the + // buttons -- others will have to override this (and possibly simply call + // GetCompositeControlsDefaultAttributes() from their versions) + attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT); + attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); + + 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); } @@ -158,10 +252,10 @@ bool wxControl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) { - wxCommandEvent event(wxEVT_NULL, m_windowId); wxEventType eventType = wxEVT_NULL; - NMHDR *hdr1 = (NMHDR*) lParam; - switch ( hdr1->code ) + + NMHDR *hdr = (NMHDR*) lParam; + switch ( hdr->code ) { case NM_CLICK: eventType = wxEVT_COMMAND_LEFT_CLICK; @@ -195,6 +289,7 @@ bool wxControl::MSWOnNotify(int idCtrl, return wxWindow::MSWOnNotify(idCtrl, lParam, result); } + wxCommandEvent event(wxEVT_NULL, m_windowId); event.SetEventType(eventType); event.SetEventObject(this); @@ -214,17 +309,30 @@ void wxControl::OnEraseBackground(wxEraseEvent& event) HBRUSH hBrush = ::CreateSolidBrush(wxColourToRGB(GetBackgroundColour())); HDC hdc = GetHdcOf((*event.GetDC())); + +#ifndef __WXWINCE__ int mode = ::SetMapMode(hdc, MM_TEXT); +#endif ::FillRect(hdc, &rect, hBrush); ::DeleteObject(hBrush); + +#ifndef __WXWINCE__ ::SetMapMode(hdc, mode); +#endif } -WXHBRUSH wxControl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, +WXHBRUSH wxControl::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor), +#if wxUSE_CTL3D WXUINT message, WXWPARAM wParam, - WXLPARAM lParam) + WXLPARAM lParam +#else + WXUINT WXUNUSED(message), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam) +#endif + ) { #if wxUSE_CTL3D if ( m_useCtl3D ) @@ -235,12 +343,8 @@ WXHBRUSH wxControl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, #endif // wxUSE_CTL3D HDC hdc = (HDC)pDC; - if (GetParent()->GetTransparentBackground()) - SetBkMode(hdc, TRANSPARENT); - else - SetBkMode(hdc, OPAQUE); + wxColour colBack = GetBackgroundColour(); - const wxColour& colBack = GetBackgroundColour(); ::SetBkColor(hdc, wxColourToRGB(colBack)); ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour())); @@ -249,22 +353,13 @@ WXHBRUSH wxControl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, return (WXHBRUSH)brush->GetResourceHandle(); } -WXDWORD wxControl::GetExStyle(WXDWORD& style, bool *want3D) const -{ - WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, want3D); - - // Even with extended styles, need to combine with WS_BORDER for them to - // look right. - if ( *want3D || wxStyleHasBorder(m_windowStyle) ) - style |= WS_BORDER; - - return exStyle; -} - // --------------------------------------------------------------------------- // global functions // --------------------------------------------------------------------------- +// this is used in radiobox.cpp and slider95.cpp and should be removed as soon +// as it is not needed there any more! +// // Call this repeatedly for several wnds to find the overall size // of the widget. // Call it initially with -1 for all values in rect. @@ -295,3 +390,4 @@ void wxFindMaxSize(WXHWND wnd, RECT *rect) rect->bottom = bottom; } +#endif // wxUSE_CONTROLS