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 #if wxUSE_GRAPHICS_CONTEXT
39 #include "wx/msw/wrapgdip.h"
40 #include "wx/graphics.h"
41 #endif // wxUSE_GRAPHICS_CONTEXT
43 #include "wx/scopedptr.h"
45 // ============================================================================
46 // wxNonOwnedWindow implementation
47 // ============================================================================
49 bool wxNonOwnedWindow::DoClearShape()
51 if (::SetWindowRgn(GetHwnd(), NULL
, TRUE
) == 0)
53 wxLogLastError(wxT("SetWindowRgn"));
60 bool wxNonOwnedWindow::DoSetRegionShape(const wxRegion
& region
)
62 // Windows takes ownership of the region, so
63 // we'll have to make a copy of the region to give to it.
64 DWORD noBytes
= ::GetRegionData(GetHrgnOf(region
), 0, NULL
);
65 RGNDATA
*rgnData
= (RGNDATA
*) new char[noBytes
];
66 ::GetRegionData(GetHrgnOf(region
), noBytes
, rgnData
);
67 HRGN hrgn
= ::ExtCreateRegion(NULL
, noBytes
, rgnData
);
68 delete[] (char*) rgnData
;
70 // SetWindowRgn expects the region to be in coordinates
71 // relative to the window, not the client area.
72 const wxPoint clientOrigin
= GetClientAreaOrigin();
73 ::OffsetRgn(hrgn
, -clientOrigin
.x
, -clientOrigin
.y
);
75 // Now call the shape API with the new region.
76 if (::SetWindowRgn(GetHwnd(), hrgn
, TRUE
) == 0)
78 wxLogLastError(wxT("SetWindowRgn"));
84 #if wxUSE_GRAPHICS_CONTEXT
86 #include "wx/msw/wrapgdip.h"
88 // This class contains data used only when SetPath(wxGraphicsPath) is called.
90 // Notice that it derives from wxEvtHandler solely to allow Connect()-ing its
91 // OnPaint() method to the window, we could get rid of this inheritance once
92 // Bind() can be used in wx sources.
93 class wxNonOwnedWindowShapeImpl
: public wxEvtHandler
96 wxNonOwnedWindowShapeImpl(wxNonOwnedWindow
* win
, const wxGraphicsPath
& path
) :
100 // Create the region corresponding to this path and set it as windows
102 wxScopedPtr
<wxGraphicsContext
> context(wxGraphicsContext::Create(win
));
103 Region
gr(static_cast<GraphicsPath
*>(m_path
.GetNativePath()));
106 gr
.GetHRGN(static_cast<Graphics
*>(context
->GetNativeContext()))
111 // Connect to the paint event to draw the border.
113 // TODO: Do this only optionally?
117 wxPaintEventHandler(wxNonOwnedWindowShapeImpl::OnPaint
),
123 virtual ~wxNonOwnedWindowShapeImpl()
128 wxPaintEventHandler(wxNonOwnedWindowShapeImpl::OnPaint
),
135 void OnPaint(wxPaintEvent
& event
)
140 wxScopedPtr
<wxGraphicsContext
> context(wxGraphicsContext::Create(dc
));
141 context
->SetPen(wxPen(*wxLIGHT_GREY
, 2));
142 context
->StrokePath(m_path
);
145 wxNonOwnedWindow
* const m_win
;
146 wxGraphicsPath m_path
;
148 wxDECLARE_NO_COPY_CLASS(wxNonOwnedWindowShapeImpl
);
151 wxNonOwnedWindow::wxNonOwnedWindow()
156 wxNonOwnedWindow::~wxNonOwnedWindow()
161 bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath
& path
)
164 m_shapeImpl
= new wxNonOwnedWindowShapeImpl(this, path
);
169 #else // !wxUSE_GRAPHICS_CONTEXT
171 // Trivial ctor and dtor as we don't have anything to do when wxGraphicsContext
172 // is not used but still define them here to avoid adding even more #if checks
173 // to the header, it it doesn't do any harm even though it's not needed.
174 wxNonOwnedWindow::wxNonOwnedWindow()
178 wxNonOwnedWindow::~wxNonOwnedWindow()
182 #endif // wxUSE_GRAPHICS_CONTEXT/!wxUSE_GRAPHICS_CONTEXT
184 #endif // !__WXWINCE__