+// ----------------------------------------------------------------------------
+// wxColourChanger
+// ----------------------------------------------------------------------------
+
+wxColourChanger::wxColourChanger(wxDC& dc) : m_dc(dc)
+{
+ if ( dc.GetBrush().GetStyle() == wxSTIPPLE_MASK_OPAQUE )
+ {
+ HDC hdc = GetHdcOf(dc);
+ m_colFgOld = ::GetTextColor(hdc);
+ m_colBgOld = ::GetBkColor(hdc);
+
+ // note that Windows convention is opposite to wxWindows one, this is
+ // why text colour becomes the background one and vice versa
+ const wxColour& colFg = dc.GetTextForeground();
+ if ( colFg.Ok() )
+ {
+ ::SetBkColor(hdc, colFg.GetPixel());
+ }
+
+ const wxColour& colBg = dc.GetTextBackground();
+ if ( colBg.Ok() )
+ {
+ ::SetTextColor(hdc, colBg.GetPixel());
+ }
+
+ SetBkMode(hdc,
+ dc.GetBackgroundMode() == wxTRANSPARENT ? TRANSPARENT
+ : OPAQUE);
+
+ // flag which telsl us to undo changes in the dtor
+ m_changed = TRUE;
+ }
+ else
+ {
+ // nothing done, nothing to undo
+ m_changed = FALSE;
+ }
+}
+
+wxColourChanger::~wxColourChanger()
+{
+ if ( m_changed )
+ {
+ // restore the colours we changed
+ HDC hdc = GetHdcOf(m_dc);
+
+ ::SetBkMode(hdc, TRANSPARENT);
+ ::SetTextColor(hdc, m_colFgOld);
+ ::SetBkColor(hdc, m_colBgOld);
+ }
+}
+