1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/msw/nonownedwnd.cpp 
   3 // Purpose:     wxNonOwnedWindow implementation for MSW. 
   4 // Author:      Vadim Zeitlin 
   5 // Created:     2011-10-09 (extracted from src/msw/toplevel.cpp) 
   7 // Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org> 
   8 // Licence:     wxWindows licence 
   9 /////////////////////////////////////////////////////////////////////////////// 
  11 // ============================================================================ 
  13 // ============================================================================ 
  15 // ---------------------------------------------------------------------------- 
  17 // ---------------------------------------------------------------------------- 
  19 // for compilers that support precompilation, includes "wx.h". 
  20 #include "wx/wxprec.h" 
  26 // This class can't be implemented and hence is not used under Win CE. 
  30     #include "wx/dcclient.h" 
  31     #include "wx/frame.h"       // Only for wxFRAME_SHAPED. 
  32     #include "wx/region.h" 
  33     #include "wx/msw/private.h" 
  36 #include "wx/nonownedwnd.h" 
  38 #include "wx/msw/wrapgdip.h" 
  39 #include "wx/graphics.h" 
  40 #include "wx/scopedptr.h" 
  42 // ============================================================================ 
  43 // wxNonOwnedWindow implementation 
  44 // ============================================================================ 
  46 bool wxNonOwnedWindow::DoClearShape() 
  48     if (::SetWindowRgn(GetHwnd(), NULL
, TRUE
) == 0) 
  50         wxLogLastError(wxT("SetWindowRgn")); 
  57 bool wxNonOwnedWindow::DoSetRegionShape(const wxRegion
& region
) 
  59     // Windows takes ownership of the region, so 
  60     // we'll have to make a copy of the region to give to it. 
  61     DWORD noBytes 
= ::GetRegionData(GetHrgnOf(region
), 0, NULL
); 
  62     RGNDATA 
*rgnData 
= (RGNDATA
*) new char[noBytes
]; 
  63     ::GetRegionData(GetHrgnOf(region
), noBytes
, rgnData
); 
  64     HRGN hrgn 
= ::ExtCreateRegion(NULL
, noBytes
, rgnData
); 
  65     delete[] (char*) rgnData
; 
  67     // SetWindowRgn expects the region to be in coordinates 
  68     // relative to the window, not the client area. 
  69     const wxPoint clientOrigin 
= GetClientAreaOrigin(); 
  70     ::OffsetRgn(hrgn
, -clientOrigin
.x
, -clientOrigin
.y
); 
  72     // Now call the shape API with the new region. 
  73     if (::SetWindowRgn(GetHwnd(), hrgn
, TRUE
) == 0) 
  75         wxLogLastError(wxT("SetWindowRgn")); 
  81 #if wxUSE_GRAPHICS_CONTEXT 
  83 #include "wx/msw/wrapgdip.h" 
  85 // This class contains data used only when SetPath(wxGraphicsPath) is called. 
  87 // Notice that it derives from wxEvtHandler solely to allow Connect()-ing its 
  88 // OnPaint() method to the window, we could get rid of this inheritance once 
  89 // Bind() can be used in wx sources. 
  90 class wxNonOwnedWindowShapeImpl 
: public wxEvtHandler
 
  93     wxNonOwnedWindowShapeImpl(wxNonOwnedWindow
* win
, const wxGraphicsPath
& path
) : 
  97         // Create the region corresponding to this path and set it as windows 
  99         wxScopedPtr
<wxGraphicsContext
> context(wxGraphicsContext::Create(win
)); 
 100         Region 
gr(static_cast<GraphicsPath
*>(m_path
.GetNativePath())); 
 103                 gr
.GetHRGN(static_cast<Graphics
*>(context
->GetNativeContext())) 
 108         // Connect to the paint event to draw the border. 
 110         // TODO: Do this only optionally? 
 114                 wxPaintEventHandler(wxNonOwnedWindowShapeImpl::OnPaint
), 
 120     virtual ~wxNonOwnedWindowShapeImpl() 
 125                 wxPaintEventHandler(wxNonOwnedWindowShapeImpl::OnPaint
), 
 132     void OnPaint(wxPaintEvent
& event
) 
 137         wxScopedPtr
<wxGraphicsContext
> context(wxGraphicsContext::Create(dc
)); 
 138         context
->SetPen(wxPen(*wxLIGHT_GREY
, 2)); 
 139         context
->StrokePath(m_path
); 
 142     wxNonOwnedWindow
* const m_win
; 
 143     wxGraphicsPath m_path
; 
 145     wxDECLARE_NO_COPY_CLASS(wxNonOwnedWindowShapeImpl
); 
 148 wxNonOwnedWindow::wxNonOwnedWindow() 
 153 wxNonOwnedWindow::~wxNonOwnedWindow() 
 158 bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath
& path
) 
 161     m_shapeImpl 
= new wxNonOwnedWindowShapeImpl(this, path
); 
 166 #else // !wxUSE_GRAPHICS_CONTEXT 
 168 // Trivial ctor and dtor as we don't have anything to do when wxGraphicsContext 
 169 // is not used but still define them here to avoid adding even more #if checks 
 170 // to the header, it it doesn't do any harm even though it's not needed. 
 171 wxNonOwnedWindow::wxNonOwnedWindow() 
 175 wxNonOwnedWindow::~wxNonOwnedWindow() 
 179 #endif // wxUSE_GRAPHICS_CONTEXT/!wxUSE_GRAPHICS_CONTEXT 
 181 #endif // !__WXWINCE__