dc.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: wx/msw/private/dc.h
  3. // Purpose: private wxMSW helpers for working with HDCs
  4. // Author: Vadim Zeitlin
  5. // Created: 2009-06-16 (extracted from src/msw/dc.cpp)
  6. // Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
  7. // Licence: wxWindows licence
  8. ///////////////////////////////////////////////////////////////////////////////
  9. #ifndef _MSW_PRIVATE_DC_H_
  10. #define _MSW_PRIVATE_DC_H_
  11. #include "wx/msw/dc.h"
  12. #include "wx/msw/wrapwin.h"
  13. namespace wxMSWImpl
  14. {
  15. // various classes to change some DC property temporarily
  16. // text background and foreground colours
  17. class wxTextColoursChanger
  18. {
  19. public:
  20. wxTextColoursChanger(HDC hdc, const wxMSWDCImpl& dc)
  21. : m_hdc(hdc)
  22. {
  23. Change(dc.GetTextForeground(), dc.GetTextBackground());
  24. }
  25. wxTextColoursChanger(HDC hdc, const wxColour& colFg, const wxColour& colBg)
  26. : m_hdc(hdc)
  27. {
  28. Change(colFg, colBg);
  29. }
  30. wxTextColoursChanger(HDC hdc, COLORREF colFg, COLORREF colBg)
  31. : m_hdc(hdc)
  32. {
  33. Change(colFg, colBg);
  34. }
  35. ~wxTextColoursChanger()
  36. {
  37. if ( m_oldColFg != CLR_INVALID )
  38. ::SetTextColor(m_hdc, m_oldColFg);
  39. if ( m_oldColBg != CLR_INVALID )
  40. ::SetBkColor(m_hdc, m_oldColBg);
  41. }
  42. protected:
  43. // this ctor doesn't change mode immediately, call Change() later to do it
  44. // only if needed
  45. wxTextColoursChanger(HDC hdc)
  46. : m_hdc(hdc)
  47. {
  48. m_oldColFg =
  49. m_oldColBg = CLR_INVALID;
  50. }
  51. void Change(const wxColour& colFg, const wxColour& colBg)
  52. {
  53. Change(colFg.IsOk() ? colFg.GetPixel() : CLR_INVALID,
  54. colBg.IsOk() ? colBg.GetPixel() : CLR_INVALID);
  55. }
  56. void Change(COLORREF colFg, COLORREF colBg)
  57. {
  58. if ( colFg != CLR_INVALID )
  59. {
  60. m_oldColFg = ::SetTextColor(m_hdc, colFg);
  61. if ( m_oldColFg == CLR_INVALID )
  62. {
  63. wxLogLastError(wxT("SetTextColor"));
  64. }
  65. }
  66. else
  67. {
  68. m_oldColFg = CLR_INVALID;
  69. }
  70. if ( colBg != CLR_INVALID )
  71. {
  72. m_oldColBg = ::SetBkColor(m_hdc, colBg);
  73. if ( m_oldColBg == CLR_INVALID )
  74. {
  75. wxLogLastError(wxT("SetBkColor"));
  76. }
  77. }
  78. else
  79. {
  80. m_oldColBg = CLR_INVALID;
  81. }
  82. }
  83. private:
  84. const HDC m_hdc;
  85. COLORREF m_oldColFg,
  86. m_oldColBg;
  87. wxDECLARE_NO_COPY_CLASS(wxTextColoursChanger);
  88. };
  89. // background mode
  90. class wxBkModeChanger
  91. {
  92. public:
  93. // set background mode to opaque if mode != wxBRUSHSTYLE_TRANSPARENT
  94. wxBkModeChanger(HDC hdc, int mode)
  95. : m_hdc(hdc)
  96. {
  97. Change(mode);
  98. }
  99. ~wxBkModeChanger()
  100. {
  101. if ( m_oldMode )
  102. ::SetBkMode(m_hdc, m_oldMode);
  103. }
  104. protected:
  105. // this ctor doesn't change mode immediately, call Change() later to do it
  106. // only if needed
  107. wxBkModeChanger(HDC hdc) : m_hdc(hdc) { m_oldMode = 0; }
  108. void Change(int mode)
  109. {
  110. m_oldMode = ::SetBkMode(m_hdc, mode == wxBRUSHSTYLE_TRANSPARENT
  111. ? TRANSPARENT
  112. : OPAQUE);
  113. if ( !m_oldMode )
  114. {
  115. wxLogLastError(wxT("SetBkMode"));
  116. }
  117. }
  118. private:
  119. const HDC m_hdc;
  120. int m_oldMode;
  121. wxDECLARE_NO_COPY_CLASS(wxBkModeChanger);
  122. };
  123. } // namespace wxMSWImpl
  124. #endif // _MSW_PRIVATE_DC_H_