GuiMDIWindowsDlg.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:9k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // GuiMDIWindowsDlg.cpp: implementation of the CGuiMDIWindowsDlg class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GuiMDIWindowsDlg.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CGuiMDIWindowsDlg dialog
  13. CGuiMDIWindowsDlg::CGuiMDIWindowsDlg(CMDIFrameWnd * pMDIFrame)
  14. : CDialog(CGuiMDIWindowsDlg::IDD, pMDIFrame)
  15. {
  16. m_pMDIFrame = pMDIFrame;
  17. //{{AFX_DATA_INIT(CGuiMDIWindowsDlg)
  18. // NOTE: the ClassWizard will add member initialization here
  19. //}}AFX_DATA_INIT
  20. }
  21. CGuiMDIWindowsDlg::CGuiMDIWindowsDlg(CMDIFrameWnd* pMDIFrame, CWnd* pParentWnd)
  22. : CDialog(CGuiMDIWindowsDlg::IDD, pParentWnd)
  23. {
  24. m_pMDIFrame = pMDIFrame;
  25. //{{AFX_DATA_INIT(CGuiMDIWindowsDlg)
  26. //}}AFX_DATA_INIT
  27. }
  28. void CGuiMDIWindowsDlg::DoDataExchange(CDataExchange* pDX)
  29. {
  30. CDialog::DoDataExchange(pDX);
  31. //{{AFX_DATA_MAP(CGuiMDIWindowsDlg)
  32. DDX_Control(pDX, IDC_GUI_WINDOWLIST_LIST, m_wndList);
  33. //}}AFX_DATA_MAP
  34. }
  35. BEGIN_MESSAGE_MAP(CGuiMDIWindowsDlg, CDialog)
  36. //{{AFX_MSG_MAP(CGuiMDIWindowsDlg)
  37. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_CLOSE, OnClose)
  38. ON_LBN_SELCHANGE(IDC_GUI_WINDOWLIST_LIST, OnSelChange)
  39. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_SAVE, OnSave)
  40. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_ACTIVATE, OnActivate)
  41. ON_WM_DRAWITEM()
  42. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_TILEHORZ, OnTileHorz)
  43. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_MINIMIZE, OnMinimize)
  44. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_TILEVERT, OnTileVert)
  45. ON_BN_CLICKED(IDC_GUI_WINDOWLIST_CASCADE, OnCascade)
  46. ON_LBN_DBLCLK(IDC_GUI_WINDOWLIST_LIST, OnActivate)
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CGuiMDIWindowsDlg message handlers
  51.  
  52. BOOL CGuiMDIWindowsDlg::OnInitDialog() 
  53. {
  54. CDialog::OnInitDialog();
  55. FillWindowList(); 
  56. SelActive();
  57. UpdateButtons();
  58. return TRUE;  // return TRUE unless you set the focus to a control
  59. // EXCEPTION: OCX Property Pages should return FALSE
  60. }
  61. void CGuiMDIWindowsDlg::OnClose() 
  62. {
  63. int nItems = m_wndList.GetCount();
  64. if (nItems != LB_ERR && nItems > 0)
  65. {
  66. HWND hMDIClient = m_pMDIFrame->m_hWndMDIClient;
  67. m_wndList.SetRedraw(FALSE);
  68. for (int i = nItems - 1; i >= 0; i--)
  69. {
  70. if (m_wndList.GetSel(i) > 0)
  71. {    
  72. HWND hWnd = reinterpret_cast<HWND>(m_wndList.GetItemData(i));
  73. ::SendMessage(hWnd, WM_CLOSE, static_cast<WPARAM>(0), 
  74. static_cast <LPARAM>(0));
  75. if (::GetParent(hWnd) == hMDIClient) 
  76. break;
  77. }   
  78. }
  79. m_wndList.SetRedraw(TRUE);
  80. }
  81. FillWindowList();
  82. SelActive();
  83. UpdateButtons();
  84. }
  85. void CGuiMDIWindowsDlg::OnSelChange() 
  86. {
  87. UpdateButtons();
  88. }
  89. // Enables/Disables states of buttons
  90. void CGuiMDIWindowsDlg::UpdateButtons()
  91. {    
  92. int nSel = m_wndList.GetSelCount();
  93. GetDlgItem(IDC_GUI_WINDOWLIST_CLOSE)->EnableWindow(nSel > 0);
  94. GetDlgItem(IDC_GUI_WINDOWLIST_SAVE)->EnableWindow(nSel > 0);
  95. GetDlgItem(IDC_GUI_WINDOWLIST_TILEHORZ)->EnableWindow(nSel >= 2);
  96. GetDlgItem(IDC_GUI_WINDOWLIST_TILEVERT)->EnableWindow(nSel >= 2);
  97. GetDlgItem(IDC_GUI_WINDOWLIST_CASCADE)->EnableWindow(nSel >= 2);
  98. GetDlgItem(IDC_GUI_WINDOWLIST_MINIMIZE)->EnableWindow(nSel > 0);
  99. GetDlgItem(IDC_GUI_WINDOWLIST_ACTIVATE)->EnableWindow(nSel == 1);
  100. }
  101. // Selects currently active window in listbox
  102. void CGuiMDIWindowsDlg::SelActive()
  103. {
  104. int nItems = m_wndList.GetCount();
  105. if (nItems != LB_ERR && nItems > 0)
  106. {
  107. m_wndList.SetRedraw(FALSE);
  108. m_wndList.SelItemRange(FALSE, 0, nItems - 1);
  109. HWND hwndActive = reinterpret_cast<HWND>(::SendMessage(m_pMDIFrame->m_hWndMDIClient,
  110. WM_MDIGETACTIVE, 0, 0));
  111. for (int i = 0; i < nItems; i++) 
  112. {
  113. if ((HWND) m_wndList.GetItemData(i) == hwndActive)  
  114. {
  115. m_wndList.SetSel(i);
  116. break;
  117. }
  118. }
  119. m_wndList.SetRedraw(TRUE);
  120. }
  121. }
  122. // Saves selected documents
  123. void CGuiMDIWindowsDlg::OnSave() 
  124. {
  125. int nItems = m_wndList.GetCount();
  126. if (nItems != LB_ERR && nItems > 0)
  127. {
  128. for (int i = 0; i < nItems; i++)
  129. {
  130. if (m_wndList.GetSel(i) > 0)
  131. {
  132. HWND    hWnd   = reinterpret_cast<HWND>(m_wndList.GetItemData(i));
  133. CWnd*    pWnd   = CWnd::FromHandle(hWnd);
  134. CFrameWnd* pFrame = DYNAMIC_DOWNCAST(CFrameWnd, pWnd);
  135. if (pFrame != NULL)
  136. {
  137. CDocument* pDoc = pFrame->GetActiveDocument();
  138. if (pDoc != NULL) 
  139. pDoc->SaveModified();
  140. }
  141. }
  142. }
  143. }
  144. FillWindowList();
  145. SelActive();
  146. UpdateButtons();
  147. }
  148. void CGuiMDIWindowsDlg::OnActivate() 
  149. {
  150. if (m_wndList.GetSelCount() == 1)
  151. {
  152. int index;
  153. if (m_wndList.GetSelItems(1, &index) == 1)
  154. {  
  155. DWORD dw = m_wndList.GetItemData(index);
  156. if (dw != LB_ERR)
  157. {
  158. WINDOWPLACEMENT wndpl;
  159. wndpl.length = sizeof(WINDOWPLACEMENT);
  160. ::GetWindowPlacement(reinterpret_cast<HWND>(dw), &wndpl);
  161. if (wndpl.showCmd == SW_SHOWMINIMIZED) 
  162. ::ShowWindow(reinterpret_cast<HWND>(dw), SW_RESTORE);
  163. ::SendMessage(m_pMDIFrame->m_hWndMDIClient, WM_MDIACTIVATE, 
  164. static_cast<WPARAM>(dw), 0);
  165. EndDialog(IDOK);
  166. }
  167. }
  168. }
  169. }
  170. // Refresh windows list
  171. void CGuiMDIWindowsDlg::FillWindowList(void)
  172. {
  173. m_wndList.SetRedraw(FALSE);
  174. m_wndList.ResetContent();
  175. HWND hwndT;
  176. hwndT = ::GetWindow(m_pMDIFrame->m_hWndMDIClient, GW_CHILD);
  177. while (hwndT != NULL)
  178. {
  179. TCHAR szWndTitle[_MAX_PATH];
  180. ::GetWindowText(hwndT, szWndTitle, sizeof(szWndTitle)/sizeof(szWndTitle[0]));
  181. int index = m_wndList.AddString(szWndTitle);
  182. m_wndList.SetItemData(index, reinterpret_cast<DWORD>(hwndT));
  183. hwndT = ::GetWindow(hwndT, GW_HWNDNEXT);
  184. }
  185. m_wndList.SetRedraw(TRUE);
  186. }
  187. // Draws listbox item
  188. void CGuiMDIWindowsDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) 
  189. {
  190. if (nIDCtl == IDC_GUI_WINDOWLIST_LIST)
  191. {
  192. if (lpDIS->itemID == LB_ERR) 
  193. return; 
  194. HBRUSH brBackground;
  195. RECT rcTemp = lpDIS->rcItem; 
  196. HDC hDC    = lpDIS->hDC;
  197. COLORREF clText; 
  198. if (lpDIS->itemState & ODS_SELECTED)  
  199. brBackground = GetSysColorBrush(COLOR_HIGHLIGHT); 
  200. clText       = GetSysColor(COLOR_HIGHLIGHTTEXT); 
  201. else 
  202. brBackground = GetSysColorBrush(COLOR_WINDOW); 
  203. clText       = GetSysColor(COLOR_WINDOWTEXT); 
  204. if (lpDIS->itemAction &(ODA_DRAWENTIRE | ODA_SELECT)) 
  205. FillRect(hDC, &rcTemp, brBackground); 
  206. int  OldBkMode = ::SetBkMode(hDC, TRANSPARENT); 
  207. COLORREF clOldText = ::SetTextColor(hDC, clText); 
  208. TCHAR szBuf[1024];
  209. ::SendMessage(lpDIS->hwndItem, LB_GETTEXT, static_cast<WPARAM>(lpDIS->itemID), 
  210. reinterpret_cast<LPARAM>(szBuf));
  211. int h = rcTemp.bottom - rcTemp.top;
  212. rcTemp.left += h + 4;
  213. DrawText(hDC, szBuf, -1, &rcTemp, DT_LEFT | DT_VCENTER |
  214. DT_NOPREFIX | DT_SINGLELINE);
  215. HICON hIcon = reinterpret_cast<HICON>
  216. (::GetClassLong(reinterpret_cast<HWND>(lpDIS->itemData), GCL_HICONSM));
  217. /*AfxGetApp()->LoadStandardIcon(IDI_HAND); */
  218. //(HICON) ::SendMessage((HWND) lpDIS->itemData,WM_GETICON,(WPARAM)ICON_BIG,(LPARAM) 0);
  219. rcTemp.left = lpDIS->rcItem.left;
  220. ::DrawIconEx(hDC, rcTemp.left + 2, rcTemp.top, hIcon, h, h, 0, 0, DI_NORMAL);
  221. ::SetTextColor(hDC, clOldText);
  222. ::SetBkMode(hDC, OldBkMode);
  223. if (lpDIS->itemAction & ODA_FOCUS)   
  224. DrawFocusRect(hDC, &lpDIS->rcItem); 
  225. return;
  226. }
  227. CDialog::OnDrawItem(nIDCtl, lpDIS);
  228. }
  229. void CGuiMDIWindowsDlg::MDIMessage(UINT uMsg, WPARAM flag)
  230. {
  231. int nItems = m_wndList.GetCount();
  232. if (nItems != LB_ERR && nItems > 0)
  233. {
  234. HWND hMDIClient = m_pMDIFrame->m_hWndMDIClient;
  235. ::LockWindowUpdate(hMDIClient);
  236. for (int i = nItems - 1; i >= 0; i--)
  237. {
  238. HWND hWnd = reinterpret_cast<HWND>(m_wndList.GetItemData(i));
  239. if (m_wndList.GetSel(i) > 0)
  240. ::ShowWindow(hWnd, SW_RESTORE);
  241. else
  242. ::ShowWindow(hWnd, SW_MINIMIZE);
  243. }
  244. ::SendMessage(hMDIClient, uMsg, flag, 0);
  245. ::LockWindowUpdate(NULL);
  246. }
  247. }
  248. void CGuiMDIWindowsDlg::OnTileHorz() 
  249. {
  250. MDIMessage(WM_MDITILE, MDITILE_HORIZONTAL);
  251. }
  252. void CGuiMDIWindowsDlg::OnTileVert() 
  253. {
  254. MDIMessage(WM_MDITILE, MDITILE_VERTICAL);
  255. }
  256. void CGuiMDIWindowsDlg::OnMinimize() 
  257. {
  258. int nItems = m_wndList.GetCount();
  259. if (nItems != LB_ERR && nItems > 0)
  260. {
  261. m_wndList.SetRedraw(FALSE);
  262. for (int i = nItems - 1; i >= 0; i--)
  263. {
  264. if (m_wndList.GetSel(i) > 0)
  265. {
  266. HWND hWnd = reinterpret_cast < HWND>(m_wndList.GetItemData(i));
  267. ::ShowWindow(hWnd, SW_MINIMIZE);
  268. }
  269. }
  270. m_wndList.SetRedraw(TRUE);
  271. }
  272. FillWindowList();
  273. SelActive();
  274. UpdateButtons();
  275. }
  276. void CGuiMDIWindowsDlg::OnCascade() 
  277. {
  278. MDIMessage(WM_MDICASCADE, 0);
  279. }