PupText.cpp
上传用户:sdpcwz
上传日期:2009-12-14
资源大小:1237k
文件大小:3k
源码类别:

书籍源码

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////
  2. // VCKBASE -- June 2001 
  3. // Visual C++ 6.0 环境编译, Windows 98 和 NT 环境运行.
  4. //
  5. #include "stdafx.h"
  6. #include "puptext.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. IMPLEMENT_DYNAMIC(CPopupText,CWnd)
  13. BEGIN_MESSAGE_MAP(CPopupText,CWnd)
  14. ON_WM_NCHITTEST()
  15. ON_WM_PAINT()
  16. ON_MESSAGE(WM_SETTEXT, OnSetText)
  17. ON_WM_TIMER()
  18. END_MESSAGE_MAP()
  19. CPopupText::CPopupText()
  20. {
  21. m_szMargins = CSize(4,4);
  22. }
  23. CPopupText::~CPopupText()
  24. {
  25. }
  26. //////////////////
  27. // Create window. pt is upper left or upper right corner depending on nStyle.
  28. //
  29. int CPopupText::Create(CPoint pt, CWnd* pParentWnd, UINT nStyle, UINT nID)
  30. {
  31. m_nStyle = nStyle;
  32. return CreateEx(0,
  33. NULL,
  34. NULL,
  35. WS_POPUP|WS_VISIBLE,
  36. CRect(pt,CSize(0,0)),
  37. pParentWnd,
  38. nID);
  39. }
  40. UINT CPopupText::OnNcHitTest(CPoint pt)
  41. {
  42. if (m_nStyle & PTS_TRANSPARENT)  // transparent?
  43. return HTTRANSPARENT;  // ..make it so
  44. return CWnd::OnNcHitTest(pt);  // otherwise return default
  45. }
  46. //////////////////
  47. // text changed: resize window to fit
  48. //
  49. LRESULT CPopupText::OnSetText(WPARAM wp, LPARAM lp)
  50. {
  51. CRect rc;
  52. GetWindowRect(&rc);
  53. int x = (m_nStyle & PTS_JUSTIFYRIGHT) ? rc.right : rc.left;
  54. int y = rc.top;
  55. CClientDC dc = this;
  56. DrawText(dc, CString((LPCTSTR)lp), rc, DT_CALCRECT);
  57. rc.InflateRect(m_szMargins);
  58. if (m_nStyle & PTS_JUSTIFYRIGHT) {
  59. x -= rc.Width();
  60. }
  61. SetWindowPos(NULL,x,y,rc.Width(),rc.Height(),SWP_NOZORDER|SWP_NOACTIVATE);
  62. return Default();
  63. }
  64. void CPopupText::DrawText(CDC& dc, LPCTSTR lpText, CRect& rc, UINT flags)
  65. {
  66. CBrush b(GetSysColor(COLOR_INFOBK)); // use tooltip bg color
  67. dc.FillRect(&rc, &b);
  68. dc.SetBkMode(TRANSPARENT);
  69. dc.SetTextColor(GetSysColor(COLOR_INFOTEXT)); // tooltip text color
  70. CFont* pOldFont = dc.SelectObject(GetParent()->GetFont());
  71. dc.DrawText(lpText, &rc, flags);
  72. dc.SelectObject(pOldFont);
  73. }
  74. //////////////////
  75. // Paint text using system colors
  76. //
  77. void CPopupText::OnPaint()
  78. {
  79. CRect rc;
  80. GetClientRect(&rc);
  81. CString s;
  82. GetWindowText(s);
  83. CPaintDC dc(this);
  84. DrawText(dc, s, rc, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
  85. }
  86. //////////////////
  87. // Register class if needed
  88. //
  89. BOOL CPopupText::PreCreateWindow(CREATESTRUCT& cs) 
  90. {
  91. static CString sClassName;
  92. if (sClassName.IsEmpty())
  93. sClassName = AfxRegisterWndClass(0);
  94. cs.lpszClass = sClassName;
  95. cs.style = WS_POPUP|WS_BORDER;
  96. cs.dwExStyle |= WS_EX_TOOLWINDOW;
  97. return CWnd::PreCreateWindow(cs);
  98. }
  99. //////////////////
  100. // CPopupText is intended to be used on the stack,
  101. // not heap, so don't auto-delete.
  102. //
  103. void CPopupText::PostNcDestroy()
  104. {
  105. // don't delete this
  106. }
  107. //////////////////
  108. // Show window with delay. No delay means show now.
  109. //
  110. void CPopupText::ShowDelayed(UINT msec)
  111. {
  112. if (msec==0) {
  113. // no delay: show it now
  114. OnTimer(1);
  115. } else {
  116. // delay: set time
  117. SetTimer(1, msec, NULL);
  118. }
  119. }
  120. //////////////////
  121. // Cancel text: kill timer and hide window
  122. //
  123. void CPopupText::Cancel()
  124. {
  125. KillTimer(1);
  126. ShowWindow(SW_HIDE);
  127. }
  128. //////////////////
  129. // Timer popped: display myself and kill timer
  130. //
  131. void CPopupText::OnTimer(UINT nIDEvent)
  132. {
  133. ShowWindow(SW_SHOWNA);
  134. Invalidate();
  135. UpdateWindow();
  136. KillTimer(1);
  137. }