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

对话框与窗口

开发平台:

Visual C++

  1. // XTWindowList.cpp : implementation file
  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 "Resource.h"
  22. #include "Common/XTPWinThemeWrapper.h"
  23. #include "Common/XTPResourceManager.h"
  24. #include "Common/XTPColorManager.h"
  25. #include "XTGlobal.h"
  26. #include "XTResizeRect.h"
  27. #include "XTResizePoint.h"
  28. #include "XTResize.h"
  29. #include "XTResizeDialog.h"
  30. #include "XTListBox.h"
  31. #include "XTWindowList.h"
  32. #ifdef _DEBUG
  33. #define new DEBUG_NEW
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #endif
  37. #ifndef OIC_WINLOGO
  38. #define OIC_WINLOGO         32517
  39. #endif
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CXTWindowList dialog
  42. CXTWindowList::CXTWindowList(CMDIFrameWnd* pMDIFrameWnd)
  43. {
  44. InitModalIndirect(XTPResourceManager()->LoadDialogTemplate(XT_IDD_WINDOWLIST), pMDIFrameWnd);
  45. m_pMDIFrameWnd = pMDIFrameWnd;
  46. ASSERT_VALID(m_pMDIFrameWnd);
  47. m_hWndMDIClient = m_pMDIFrameWnd->m_hWndMDIClient;
  48. ASSERT(m_hWndMDIClient != NULL);
  49. m_hIcon = NULL;
  50. }
  51. CXTWindowList::CXTWindowList(HWND hWndMDIClient)
  52. {
  53. InitModalIndirect(XTPResourceManager()->LoadDialogTemplate(XT_IDD_WINDOWLIST), 0);
  54. m_pMDIFrameWnd = NULL;
  55. m_hWndMDIClient = hWndMDIClient;
  56. ASSERT(m_hWndMDIClient != NULL);
  57. m_hIcon = NULL;
  58. }
  59. void CXTWindowList::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CXTResizeDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CXTWindowList)
  63. DDX_Control(pDX, XT_IDC_BTN_MINIMIZE, m_btnMinimize);
  64. DDX_Control(pDX, XT_IDC_BTN_CASCADE, m_btnCascade);
  65. DDX_Control(pDX, IDOK, m_btnOk);
  66. DDX_Control(pDX, XT_IDC_LBOX_WINDOWS, m_lboxWindows);
  67. DDX_Control(pDX, XT_IDC_BTN_TILEVERT, m_btnTileVert);
  68. DDX_Control(pDX, XT_IDC_BTN_TILEHORZ, m_btnTileHorz);
  69. DDX_Control(pDX, XT_IDC_BTN_SAVE, m_btnSave);
  70. DDX_Control(pDX, XT_IDC_BTN_CLOSEWINDOWS, m_btnClose);
  71. DDX_Control(pDX, XT_IDC_BTN_ACTIVATE, m_btnActivate);
  72. //}}AFX_DATA_MAP
  73. }
  74. IMPLEMENT_DYNAMIC(CXTWindowList, CXTResizeDialog)
  75. BEGIN_MESSAGE_MAP(CXTWindowList, CXTResizeDialog)
  76. //{{AFX_MSG_MAP(CXTWindowList)
  77. ON_LBN_SELCHANGE(XT_IDC_LBOX_WINDOWS, OnSelchangeLBox)
  78. ON_BN_CLICKED(XT_IDC_BTN_ACTIVATE, OnBtnActivate)
  79. ON_BN_CLICKED(XT_IDC_BTN_SAVE, OnBtnSave)
  80. ON_BN_CLICKED(XT_IDC_BTN_CLOSEWINDOWS, OnBtnClosewindows)
  81. ON_BN_CLICKED(XT_IDC_BTN_TILEHORZ, OnBtnTilehorz)
  82. ON_BN_CLICKED(XT_IDC_BTN_TILEVERT, OnBtnTilevert)
  83. ON_BN_CLICKED(XT_IDC_BTN_CASCADE, OnBtnCascade)
  84. ON_BN_CLICKED(XT_IDC_BTN_MINIMIZE, OnBtnMinimize)
  85. ON_WM_DRAWITEM()
  86. ON_WM_DESTROY()
  87. //}}AFX_MSG_MAP
  88. END_MESSAGE_MAP()
  89. /////////////////////////////////////////////////////////////////////////////
  90. // CXTWindowList message handlers
  91. BOOL CXTWindowList::OnInitDialog()
  92. {
  93. CXTResizeDialog::OnInitDialog();
  94. FillMDIWindowList();
  95. SelectMDIActive();
  96. SetEnableButtons();
  97. // Set control resizing.
  98. SetResize(XT_IDC_LBOX_WINDOWS, SZ_TOP_LEFT, SZ_BOTTOM_RIGHT);
  99. SetResize(XT_IDC_BTN_ACTIVATE, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  100. SetResize(IDOK, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  101. SetResize(XT_IDC_BTN_SAVE, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  102. SetResize(XT_IDC_BTN_CLOSEWINDOWS, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  103. SetResize(XT_IDC_BTN_CASCADE, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  104. SetResize(XT_IDC_BTN_TILEHORZ, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  105. SetResize(XT_IDC_BTN_TILEVERT, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  106. SetResize(XT_IDC_BTN_MINIMIZE, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
  107. // Load window placement
  108. LoadPlacement(_T("CXTWindowList"));
  109. if (m_hIcon == NULL && m_pMDIFrameWnd)
  110. {
  111. m_hIcon = (HICON)(ULONG_PTR)::GetClassLongPtr(m_pMDIFrameWnd->GetSafeHwnd(), GCLP_HICONSM);
  112. }
  113. // If no icon was defined, used XT icon.
  114. if (m_hIcon == NULL)
  115. {
  116. m_hIcon = AfxGetApp()->LoadOEMIcon(OIC_WINLOGO);
  117. }
  118. m_lboxWindows.SetFont(&XTAuxData().font);
  119. SetIcon(m_hIcon, FALSE);
  120. return TRUE;
  121. }
  122. void CXTWindowList::OnDestroy()
  123. {
  124. // Save window placement
  125. SavePlacement(_T("CXTWindowList"));
  126. CXTResizeDialog::OnDestroy();
  127. }
  128. CString CXTWindowList::GetChildWndText(HWND hWnd) const
  129. {
  130. CString strTitle = _T("");
  131. CWnd* pWnd = CWnd::FromHandle(hWnd);
  132. // Get the window text for the frame and use it for the tab label.
  133. if (pWnd) pWnd->GetWindowText(strTitle);
  134. // If the string is empty the document's title.
  135. if (!strTitle.IsEmpty())
  136. return strTitle;
  137. // Get a pointer to the frame window.
  138. CMDIChildWnd* pChildFrame = DYNAMIC_DOWNCAST(CMDIChildWnd, pWnd);
  139. if (!pChildFrame || !IsWindow(pChildFrame->GetSafeHwnd()))
  140. {
  141. return _T("");
  142. }
  143. CDocument* pDocument = pChildFrame->GetActiveDocument();
  144. if (pDocument == NULL)
  145. return _T("");
  146. return pDocument->GetTitle();
  147. }
  148. void CXTWindowList::InsertMDIChild(HWND hwndMDIChildWnd)
  149. {
  150. ASSERT(hwndMDIChildWnd != 0); // must be valid.
  151. // Get the window text for the frame.
  152. CString strWindowText = GetChildWndText(hwndMDIChildWnd);
  153. int iIndex = m_lboxWindows.AddString(strWindowText);
  154. m_lboxWindows.SetItemDataPtr(iIndex, (LPVOID)hwndMDIChildWnd);
  155. }
  156. void CXTWindowList::FillMDIWindowList()
  157. {
  158. m_lboxWindows.ResetContent();
  159. // Retrieve the current active MDI child window.
  160. HWND hwndActiveChild = ::GetWindow(m_hWndMDIClient, GW_CHILD);
  161. if (hwndActiveChild != NULL)
  162. {
  163. // Get the first top-level window in the list.
  164. HWND hwndChildFrame = ::GetWindow(hwndActiveChild, GW_HWNDLAST);
  165. while (hwndChildFrame != NULL)
  166. {
  167. if (::IsWindowVisible(hwndChildFrame) && (GetWindowLong(hwndChildFrame, GWL_EXSTYLE) & WS_EX_MDICHILD))
  168. {
  169. // Insert the tab and get the next frame on the window manager's list
  170. InsertMDIChild(hwndChildFrame);
  171. }
  172. hwndChildFrame = ::GetWindow(hwndChildFrame, GW_HWNDPREV);
  173. }
  174. }
  175. }
  176. void CXTWindowList::SelectMDIActive()
  177. {
  178. int iCount = m_lboxWindows.GetCount();
  179. if (iCount != LB_ERR && iCount > 0)
  180. {
  181. m_lboxWindows.SelItemRange(FALSE, 0, iCount-1);
  182. HWND hWnd = (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, 0);
  183. int iItem;
  184. for (iItem = 0; iItem < iCount; iItem++)
  185. {
  186. if (hWnd == (HWND)m_lboxWindows.GetItemData(iItem))
  187. {
  188. m_lboxWindows.SetSel(iItem);
  189. return;
  190. }
  191. }
  192. }
  193. }
  194. void CXTWindowList::SetEnableButtons()
  195. {
  196. int iCount = m_lboxWindows.GetSelCount();
  197. m_btnActivate.EnableWindow(iCount == 1);
  198. m_btnSave.EnableWindow(iCount > 0);
  199. m_btnClose.EnableWindow(iCount > 0);
  200. m_btnCascade.EnableWindow(iCount > 1);
  201. m_btnTileVert.EnableWindow(iCount > 1);
  202. m_btnTileHorz.EnableWindow(iCount > 1);
  203. m_btnMinimize.EnableWindow(iCount > 0);
  204. // hide buttons if menubar does not have frame button display
  205. m_btnCascade.ShowWindow(SW_SHOW);
  206. m_btnTileVert.ShowWindow(SW_SHOW);
  207. m_btnTileHorz.ShowWindow(SW_SHOW);
  208. m_btnMinimize.ShowWindow(SW_SHOW);
  209. }
  210. void CXTWindowList::OnSelchangeLBox()
  211. {
  212. SetEnableButtons();
  213. }
  214. void CXTWindowList::OnBtnActivate()
  215. {
  216. int iIndex = m_lboxWindows.GetCurSel();
  217. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iIndex);
  218. if (hWnd != (HWND)LB_ERR)
  219. {
  220. WINDOWPLACEMENT wp;
  221. ::GetWindowPlacement(hWnd, &wp);
  222. if (wp.showCmd == SW_SHOWMINIMIZED)
  223. ::ShowWindow(hWnd, SW_RESTORE);
  224. ::SendMessage(m_hWndMDIClient,
  225. WM_MDIACTIVATE, (WPARAM)hWnd, 0);
  226. CXTResizeDialog::OnOK();
  227. }
  228. }
  229. void CXTWindowList::OnBtnSave()
  230. {
  231. int iCount = m_lboxWindows.GetCount();
  232. if (iCount != LB_ERR && iCount > 0)
  233. {
  234. int iItem;
  235. for (iItem = 0; iItem < iCount; iItem++)
  236. {
  237. if (m_lboxWindows.GetSel(iItem) > 0)
  238. {
  239. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iItem);
  240. if (hWnd != NULL)
  241. {
  242. CMDIChildWnd* pMDIChildWnd = (CMDIChildWnd*)CWnd::FromHandle(hWnd);
  243. if (!pMDIChildWnd)
  244. continue;
  245. CDocument *pDocument = pMDIChildWnd->GetActiveDocument();
  246. if (pDocument != NULL)
  247. {
  248. pDocument->DoFileSave();
  249. }
  250. }
  251. }
  252. }
  253. }
  254. FillMDIWindowList();
  255. SelectMDIActive();
  256. SetEnableButtons();
  257. }
  258. void CXTWindowList::OnBtnClosewindows()
  259. {
  260. int iCount = m_lboxWindows.GetCount();
  261. if (iCount != LB_ERR && iCount > 0)
  262. {
  263. int iItem;
  264. for (iItem = 0; iItem < iCount; iItem++)
  265. {
  266. if (m_lboxWindows.GetSel(iItem) > 0)
  267. {
  268. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iItem);
  269. if (hWnd != NULL)
  270. {
  271. ::SendMessage(hWnd, WM_CLOSE, 0, 0);
  272. }
  273. }
  274. }
  275. }
  276. FillMDIWindowList();
  277. SelectMDIActive();
  278. SetEnableButtons();
  279. }
  280. void CXTWindowList::OnBtnTilehorz()
  281. {
  282. CWaitCursor wait;
  283. int iCount = m_lboxWindows.GetCount();
  284. if (iCount != LB_ERR && iCount > 0)
  285. {
  286. ::LockWindowUpdate(m_hWndMDIClient);
  287. int iItem;
  288. for (iItem = iCount-1; iItem >= 0; iItem--)
  289. {
  290. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iItem);
  291. if (m_lboxWindows.GetSel(iItem) > 0)
  292. ::ShowWindow(hWnd, SW_RESTORE);
  293. else
  294. ::ShowWindow(hWnd, SW_MINIMIZE);
  295. }
  296. ::SendMessage(m_hWndMDIClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
  297. ::LockWindowUpdate(NULL);
  298. }
  299. }
  300. void CXTWindowList::OnBtnTilevert()
  301. {
  302. CWaitCursor wait;
  303. int iCount = m_lboxWindows.GetCount();
  304. if (iCount != LB_ERR && iCount > 0)
  305. {
  306. ::LockWindowUpdate(m_hWndMDIClient);
  307. int iItem;
  308. for (iItem = iCount-1; iItem >= 0; iItem--)
  309. {
  310. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iItem);
  311. if (m_lboxWindows.GetSel(iItem) > 0)
  312. ::ShowWindow(hWnd, SW_RESTORE);
  313. else
  314. ::ShowWindow(hWnd, SW_MINIMIZE);
  315. }
  316. ::SendMessage(m_hWndMDIClient, WM_MDITILE, MDITILE_VERTICAL, 0);
  317. ::LockWindowUpdate(NULL);
  318. }
  319. }
  320. void CXTWindowList::OnBtnCascade()
  321. {
  322. CWaitCursor wait;
  323. int iCount = m_lboxWindows.GetCount();
  324. if (iCount != LB_ERR && iCount > 0)
  325. {
  326. ::LockWindowUpdate(m_hWndMDIClient);
  327. int iItem;
  328. for (iItem = iCount-1; iItem >= 0; iItem--)
  329. {
  330. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iItem);
  331. if (m_lboxWindows.GetSel(iItem) > 0)
  332. ::ShowWindow(hWnd, SW_RESTORE);
  333. else
  334. ::ShowWindow(hWnd, SW_MINIMIZE);
  335. }
  336. ::SendMessage(m_hWndMDIClient, WM_MDICASCADE, 0, 0);
  337. ::LockWindowUpdate(NULL);
  338. }
  339. }
  340. void CXTWindowList::OnBtnMinimize()
  341. {
  342. CWaitCursor wait;
  343. int iCount = m_lboxWindows.GetCount();
  344. if (iCount != LB_ERR && iCount > 0)
  345. {
  346. ::LockWindowUpdate(m_hWndMDIClient);
  347. int iItem;
  348. for (iItem = iCount-1; iItem >= 0; iItem--)
  349. {
  350. HWND hWnd = (HWND)m_lboxWindows.GetItemData(iItem);
  351. DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
  352. if (m_lboxWindows.GetSel(iItem) > 0 && (dwStyle & WS_MINIMIZEBOX))
  353. {
  354. ::ShowWindow(hWnd, SW_MINIMIZE);
  355. }
  356. }
  357. ::SendMessage(m_hWndMDIClient, WM_MDICASCADE, 0, 0);
  358. ::LockWindowUpdate(NULL);
  359. }
  360. }
  361. void CXTWindowList::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
  362. {
  363. if (nIDCtl == XT_IDC_LBOX_WINDOWS)
  364. {
  365. if (lpDIS->itemID == (UINT)LB_ERR)
  366. return;
  367. CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  368. CRect rcItem = lpDIS->rcItem;
  369. int iSaveDC = pDC->SaveDC();
  370. CSize sizeIcon;
  371. sizeIcon.cx = ::GetSystemMetrics(SM_CXSMICON);
  372. sizeIcon.cy = ::GetSystemMetrics(SM_CYSMICON);
  373. COLORREF crText = ::GetSysColor(COLOR_WINDOWTEXT);
  374. COLORREF crBack = ::GetSysColor(COLOR_WINDOW);
  375. if (lpDIS->itemState & ODS_SELECTED)
  376. {
  377. crBack = ::GetSysColor(COLOR_HIGHLIGHT);
  378. crText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
  379. }
  380. CRect rcLabel = rcItem;
  381. rcLabel.left += sizeIcon.cx + 3;
  382. if (lpDIS->itemAction & (ODA_DRAWENTIRE | ODA_SELECT))
  383. pDC->FillSolidRect(rcLabel, crBack);
  384. if (lpDIS->itemAction & ODA_FOCUS)
  385. pDC->DrawFocusRect(&rcLabel);
  386. CString strBuffer;
  387. m_lboxWindows.GetText(lpDIS->itemID, strBuffer);
  388. pDC->SetBkMode(TRANSPARENT);
  389. pDC->SetTextColor(crText);
  390. rcItem.left += sizeIcon.cx + 4;
  391. pDC->DrawText(strBuffer, -1, &rcItem,
  392. DT_LEFT | DT_VCENTER | DT_NOPREFIX | DT_SINGLELINE);
  393. rcItem.left = lpDIS->rcItem.left;
  394. // Try to locate the icon for the MDI window by calling WM_GETICON
  395. // first, this will give us the correct icon if the user has called
  396. // SetIcon(...) for the child frame.
  397. HICON hIcon = (HICON)::SendMessage((HWND)lpDIS->itemData, WM_GETICON, ICON_SMALL, 0);
  398. if (!hIcon) hIcon = (HICON)::SendMessage((HWND)lpDIS->itemData, WM_GETICON, ICON_BIG, 0);
  399. // If the icon returned is NULL, then try using GCLP_HICONSM to get the
  400. // document icon for the child frame
  401. if (!hIcon) hIcon = (HICON)(ULONG_PTR)::GetClassLongPtr((HWND)lpDIS->itemData, GCLP_HICONSM);
  402. if (!hIcon) hIcon = (HICON)(ULONG_PTR)::GetClassLongPtr((HWND)lpDIS->itemData, GCLP_HICON);
  403. // If no icon was found, then use the default windows logo icon.
  404. if (hIcon == NULL)
  405. {
  406. hIcon = AfxGetApp()->LoadStandardIcon(IDI_WINLOGO);
  407. }
  408. rcItem.left += 2;
  409. ::DrawIconEx(pDC->m_hDC, rcItem.left, rcItem.top, hIcon,
  410. sizeIcon.cx, sizeIcon.cy, 0, NULL, DI_NORMAL);
  411. pDC->RestoreDC(iSaveDC);
  412. return;
  413. }
  414. CXTResizeDialog::OnDrawItem(nIDCtl, lpDIS);
  415. }