TransparentStatic.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // TransparentStatic2.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TransparentStatic.h"
  5. // CTransparentStatic
  6. IMPLEMENT_DYNAMIC(CTransparentStatic, CStatic)
  7. CTransparentStatic::CTransparentStatic()
  8. {
  9. }
  10. CTransparentStatic::~CTransparentStatic()
  11. {
  12. }
  13. BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
  14. ON_MESSAGE(WM_SETTEXT,OnSetText)
  15. ON_WM_CTLCOLOR_REFLECT()
  16. ON_WM_ERASEBKGND()
  17. END_MESSAGE_MAP()
  18. // CTransparentStatic message handlers
  19. LRESULT CTransparentStatic::OnSetText(WPARAM wParam,LPARAM lParam)
  20. {
  21. LRESULT Result = Default();
  22. Invalidate();
  23. UpdateWindow();
  24. return Result;
  25. }
  26. HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
  27. {
  28. pDC->SetTextColor(m_crText);
  29. pDC->SelectObject(&m_font);
  30. pDC->SetBkMode(TRANSPARENT);
  31. return (HBRUSH)GetStockObject(NULL_BRUSH);
  32. }
  33. BOOL CTransparentStatic::OnEraseBkgnd(CDC* pDC)
  34. {
  35. if (m_Bmp.GetSafeHandle() == NULL)
  36. {
  37. CRect Rect;
  38. GetWindowRect(&Rect);
  39. CWnd *pParent = GetParent();
  40. ASSERT(pParent);
  41. pParent->ScreenToClient(&Rect); //convert our corrdinates to our parents
  42. //copy what's on the parents at this point
  43. CDC *pDC = pParent->GetDC();
  44. CDC MemDC;
  45. MemDC.CreateCompatibleDC(pDC);
  46. m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
  47. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
  48. MemDC.SetTextColor(m_crText);
  49. MemDC.SelectObject(&m_font);
  50. MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
  51. MemDC.SelectObject(pOldBmp);
  52. pParent->ReleaseDC(pDC);
  53. }
  54. else //copy what we copied off the parent the first time back onto the parent
  55. {
  56. CRect Rect;
  57. GetClientRect(Rect);
  58. CDC MemDC;
  59. MemDC.CreateCompatibleDC(pDC);
  60. CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
  61. MemDC.SetTextColor(m_crText);
  62. MemDC.SelectObject(&m_font);
  63. pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
  64. MemDC.SelectObject(pOldBmp);
  65. }
  66. return TRUE;
  67. }
  68. /*************************************************************
  69. *add at : 2014-08-11 by唐太闲
  70. *describe: 设置CStatic的文本
  71. *************************************************************/
  72. CTransparentStatic& CTransparentStatic::SetText(const CString& strText)
  73. {
  74. if(IsWindow(this->GetSafeHwnd()))
  75. {
  76. SetWindowText(strText);
  77. }
  78. return *this;
  79. }
  80. /*************************************************************
  81. *add at : 2014-08-11 by唐太闲
  82. *describe: 设置字体和大小CreatePointFont的第一个参数要求很大,
  83. 乘了个7,7是随便定的
  84. *************************************************************/
  85. CTransparentStatic& CTransparentStatic::SetMyFont(int nSize,const CString& strFont)
  86. {
  87. /*VERIFY(m_font.CreateFont(nSize,//tc:这个数字是字体大小
  88. 0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
  89. CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,strFont));
  90. SetFont(&m_font);*/
  91. m_font.CreatePointFont(nSize*7,strFont);
  92. Update(); //tc:设置完成后需要立即刷新
  93. return *this;
  94. }
  95. /*************************************************************
  96. *add at : 2014-08-11 by唐太闲
  97. *describe: 设置文本颜色,m_crText在函数CtlColor中会用来进行设置
  98. *************************************************************/
  99. CTransparentStatic& CTransparentStatic::SetTextColor(COLORREF crText)
  100. {
  101. m_crText = crText;
  102. Update();//tc:设置完成后需要立即刷新
  103. return *this;
  104. }
  105. /*************************************************************
  106. *add at : 2014-08-11 by唐太闲
  107. *describe: 通过父窗口强制刷新区域
  108. *************************************************************/
  109. void CTransparentStatic::Update()
  110. {
  111. CRect (rc);
  112. GetWindowRect(rc);
  113. RedrawWindow();
  114. GetParent()->ScreenToClient(rc);
  115. GetParent()->InvalidateRect(rc,TRUE);
  116. GetParent()->UpdateWindow();
  117. }