XTCaptionPopupWnd.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:7k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTCaptionPopupWnd.cpp : implementation of the CXTCaptionPopupWnd class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPResourceManager.h"
  22. #include "Common/XTPColorManager.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Resource.h"
  25. #include "XTDefines.h"
  26. #include "XTUtil.h"
  27. #include "XTGlobal.h"
  28. #include "XTThemeManager.h"
  29. #include "XTButtonTheme.h"
  30. #include "XTButton.h"
  31. #include "XTCaption.h"
  32. #include "XTCaptionPopupWnd.h"
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. #define XTCAPTIONPOPUP_CLASSNAME    _T("XTCaptionPopupWnd")  // Window class name
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CXTCaptionPopupWnd
  41. /////////////////////////////////////////////////////////////////////////////
  42. CXTCaptionPopupWnd::CXTCaptionPopupWnd()
  43. {
  44. m_pChildWnd = NULL;
  45. m_pChildParent = NULL;
  46. m_pParentWnd = NULL;
  47. // register the wnd class.
  48. RegisterWindowClass();
  49. }
  50. CXTCaptionPopupWnd::~CXTCaptionPopupWnd()
  51. {
  52. if (::IsWindow(m_hWnd))
  53. DestroyWindow();
  54. }
  55. IMPLEMENT_DYNAMIC(CXTCaptionPopupWnd, CWnd)
  56. BEGIN_MESSAGE_MAP(CXTCaptionPopupWnd, CWnd)
  57. //{{AFX_MSG_MAP(CXTCaptionPopupWnd)
  58. ON_WM_DESTROY()
  59. ON_BN_CLICKED(XT_IDC_BTN_CLOSE, OnCaptButton)
  60. ON_WM_PAINT()
  61. ON_WM_TIMER()
  62. //}}AFX_MSG_MAP
  63. END_MESSAGE_MAP()
  64. BOOL CXTCaptionPopupWnd::RegisterWindowClass()
  65. {
  66. WNDCLASS wndcls;
  67. HINSTANCE hInst = ::AfxGetInstanceHandle();
  68. if (!(::GetClassInfo(hInst, XTCAPTIONPOPUP_CLASSNAME, &wndcls)))
  69. {
  70. // otherwise we need to register a new class
  71. wndcls.style = CS_HREDRAW | CS_VREDRAW;
  72. wndcls.lpfnWndProc = ::DefWindowProc;
  73. wndcls.cbClsExtra = 0;
  74. wndcls.cbWndExtra = 0;
  75. wndcls.hInstance = hInst;
  76. wndcls.hIcon = NULL;
  77. wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
  78. wndcls.hbrBackground = ::GetSysColorBrush(COLOR_BTNFACE);
  79. wndcls.lpszMenuName = NULL;
  80. wndcls.lpszClassName = XTCAPTIONPOPUP_CLASSNAME;
  81. if (!::AfxRegisterClass(&wndcls))
  82. {
  83. ::AfxThrowResourceException();
  84. return FALSE;
  85. }
  86. }
  87. return TRUE;
  88. }
  89. BOOL CXTCaptionPopupWnd::Create(const CRect& rect, CWnd* pParentWnd, CWnd* pChildWnd)
  90. {
  91. ASSERT_VALID(pParentWnd); // must be valid.
  92. if (!pParentWnd || !::IsWindow(pParentWnd->m_hWnd))
  93. return FALSE;
  94. m_pParentWnd = pParentWnd;
  95. ASSERT_VALID(pChildWnd); // must be valid.
  96. if (!pChildWnd || !::IsWindow(pChildWnd->m_hWnd))
  97. return FALSE;
  98. m_pChildWnd = pChildWnd;
  99. // define the styles for this window.
  100. DWORD dwStyleEx = WS_EX_TOOLWINDOW;
  101. DWORD dwStyle = WS_VISIBLE | WS_POPUP | WS_DLGFRAME;
  102. // call the base class for creation.
  103. if (!CWnd::CreateEx(dwStyleEx, XTCAPTIONPOPUP_CLASSNAME, _T(""), dwStyle, rect.left, rect.top,
  104. rect.Width(), rect.Height(), pParentWnd->GetSafeHwnd(), 0, NULL))
  105. {
  106. TRACE0("Failed to create caption popdown window.n");
  107. return FALSE;
  108. }
  109. // set the child windows parent to this popup window, save
  110. // the previous parent, since we need to reset this when the
  111. // window is destroyed.
  112. m_pChildParent = m_pChildWnd->SetParent(this);
  113. ASSERT(m_pChildParent != NULL);
  114. // Create the caption.
  115. CString string;
  116. VERIFY(XTPResourceManager()->LoadString(&string, XT_IDS_CLICKKEEPOPEN));
  117. if (!m_Caption.Create(this, string, CPWS_EX_RAISED_EDGE,
  118. WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE, CXTPEmptyRect()))
  119. {
  120. TRACE0("Unable to create caption.n");
  121. return FALSE;
  122. }
  123. m_Caption.SetAppCaption(false);
  124. // Create the caption button.
  125. if (!m_CaptionButton.Create(NULL, WS_VISIBLE | BS_ICON | BS_OWNERDRAW | BS_CENTER | BS_VCENTER,
  126. CXTPEmptyRect(), this, XT_IDC_BTN_CLOSE))
  127. {
  128. TRACE0("Unable to create caption button.n");
  129. return FALSE;
  130. }
  131. m_CaptionButton.SetCaption(&m_Caption);
  132. CImageList imageList;
  133. imageList.Create(16, 15, ILC_COLOR8 | ILC_MASK, 0, 1);
  134. CBitmap bmp;
  135. VERIFY(XTPResourceManager()->LoadBitmap(&bmp, XT_IDB_BTN_OUT));
  136. imageList.Add(&bmp, RGB(255, 0, 255));
  137. // Associate the button icon
  138. m_hIconOff = imageList.ExtractIcon(0);
  139. m_hIconOn = imageList.ExtractIcon(1);
  140. m_CaptionButton.SetIcon(CSize(16, 15), m_hIconOff, m_hIconOn);
  141. imageList.DeleteImageList();
  142. // start the timer after everything has been initialized.
  143. SetTimer(1, 10, NULL);
  144. return TRUE;
  145. }
  146. void CXTCaptionPopupWnd::RecalcLayout()
  147. {
  148. // define the caption and client rect.
  149. CXTPClientRect rcChild(this);
  150. rcChild.DeflateRect(2, 2);
  151. // move the window to fit the client area of this window.
  152. CRect rcCaption(rcChild);
  153. rcChild.top += 19;
  154. m_pChildWnd->MoveWindow(rcChild);
  155. // define the size for the push pin caption.
  156. rcCaption.bottom = rcCaption.top + 19;
  157. m_Caption.MoveWindow(&rcCaption);
  158. // define the size for the caption button.
  159. CRect rcButton(rcCaption);
  160. rcButton.DeflateRect(2, 2);
  161. rcButton.left = rcButton.right - 16;
  162. m_CaptionButton.MoveWindow(&rcButton);
  163. }
  164. BOOL CXTCaptionPopupWnd::ResetParent()
  165. {
  166. if (!::IsWindow(m_pChildWnd->GetSafeHwnd()))
  167. return FALSE;
  168. if (!::IsWindow(m_pChildParent->GetSafeHwnd()))
  169. return FALSE;
  170. m_pChildWnd->SetParent(m_pChildParent);
  171. return TRUE;
  172. }
  173. void CXTCaptionPopupWnd::OnDestroy()
  174. {
  175. ResetParent();
  176. CWnd::OnDestroy();
  177. }
  178. void CXTCaptionPopupWnd::OnCaptButton()
  179. {
  180. // check to see if the parent is valid...
  181. if (::IsWindow(m_pParentWnd->GetSafeHwnd()))
  182. {
  183. // notify that push pin button was pressed.
  184. m_pParentWnd->SendMessage(CPWN_XT_PUSHPINBUTTON);
  185. }
  186. }
  187. void CXTCaptionPopupWnd::OnPaint()
  188. {
  189. CPaintDC dc(this); // device context for painting
  190. CXTPClientRect rc(this);
  191. rc.DeflateRect(1, 1);
  192. // draw a border for the client area.
  193. dc.Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW),
  194. GetXtremeColor(COLOR_3DHILIGHT));
  195. // update the caption as well.
  196. m_Caption.Invalidate();
  197. }
  198. BOOL CXTCaptionPopupWnd::SendCancelMessage()
  199. {
  200. // get a handle to the window which currently
  201. // has the input focus...
  202. HWND hWnd_HasFocus = ::GetFocus();
  203. // caption has focus.
  204. if (hWnd_HasFocus == m_Caption.GetSafeHwnd())
  205. return FALSE;
  206. // caption button has focus.
  207. if (hWnd_HasFocus == m_CaptionButton.GetSafeHwnd())
  208. return FALSE;
  209. // popup window has focus.
  210. if (hWnd_HasFocus == GetSafeHwnd())
  211. return FALSE;
  212. // popup window child has focus.
  213. if (hWnd_HasFocus == m_pChildWnd->GetSafeHwnd())
  214. return FALSE;
  215. // check to see if the parent is valid...
  216. if (::IsWindow(m_pParentWnd->GetSafeHwnd()))
  217. {
  218. // and send cancel message.
  219. m_pParentWnd->SendMessage(CPWN_XT_PUSHPINCANCEL);
  220. return TRUE;
  221. }
  222. return FALSE;
  223. }
  224. void CXTCaptionPopupWnd::OnTimer(UINT_PTR nIDEvent)
  225. {
  226. if (nIDEvent == 1)
  227. {
  228. SendCancelMessage();
  229. return;
  230. }
  231. CWnd::OnTimer(nIDEvent);
  232. }