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

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  *  (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software;so you are free to use it any of your *
  9.  * applications (Freeware, Shareware, Commercial),but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements : (Add your name) *
  19.  * -Francisco Campos *
  20.  * -Serge Koroleuve *
  21.  * *
  22.  ****************************************************************************/
  23. #include "stdafx.h"
  24. #include "GuiMDIFrame.h"
  25. #include "GuiMiniFrame.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CGuiMDIFrame
  33. IMPLEMENT_DYNCREATE(CGuiMDIFrame, CMDIFrameWnd)
  34. CGuiMDIFrame::CGuiMDIFrame()
  35. {
  36. sProfile = AfxGetAppName();
  37. sProfile.Replace(_T(' '), _T('_'));
  38. m_StyleDisplay=GUISTYLE_XP;
  39. m_InitClass=TRUE;
  40. }
  41. CGuiMDIFrame::~CGuiMDIFrame()
  42. {
  43. }
  44. BEGIN_MESSAGE_MAP(CGuiMDIFrame, CMDIFrameWnd)
  45. //{{AFX_MSG_MAP(CGuiMDIFrame)
  46. // NOTE - the ClassWizard will add and remove mapping macros here.
  47. ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
  48. ON_WM_SYSCOLORCHANGE()
  49. //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. //**************************************************************************
  52. void CGuiMDIFrame::OnSysColorChange( )
  53. {
  54. CMDIFrameWnd::OnSysColorChange( );
  55. GuiDrawLayer::IsThemeXP();
  56. }
  57. BOOL CGuiMDIFrame::PreTranslateMessage(MSG* pMsg) 
  58. {
  59. if (m_wndMenuBar.TranslateFrameMessage(pMsg))
  60. return TRUE;
  61. return CMDIFrameWnd::PreTranslateMessage(pMsg);
  62. }
  63. void CGuiMDIFrame::OnFilePrintPreview() 
  64. {
  65. // TODO: Add your command handler code here
  66. }
  67. BOOL CGuiMDIFrame::PreCreateWindow(CREATESTRUCT& cs)
  68. {
  69. // Restore main window position
  70. CWinApp* pApp = AfxGetApp();
  71. TCHAR szSection[256];
  72.   wsprintf(szSection, "%sMain", sProfile);
  73. // Restore main window position
  74.     CWinApp* app = AfxGetApp();
  75.     int s, t, b, r, l;
  76.   l =(int) pApp->GetProfileInt(szSection, _T("left"),10);
  77. t =(int) pApp->GetProfileInt(szSection, _T("top"),10);
  78. b =(int) pApp->GetProfileInt(szSection, _T("bottom"),400);
  79. r = (int)pApp->GetProfileInt(szSection, _T("right"),600);
  80. s = (int)pApp->GetProfileInt(szSection, _T("status"), SW_NORMAL);
  81. GuiDrawLayer::m_Style=(int)pApp->GetProfileInt(szSection, _T("Style"),GUISTYLE_XP);
  82. m_StyleDisplay=GuiDrawLayer::m_Style;
  83. // only restore if there is a previously saved position
  84. // restore the window's status
  85. app->m_nCmdShow = s;
  86.                              
  87. // restore the window's width and height
  88. cs.cx = r - l;
  89. cs.cy = b - t;
  90.                              
  91. // the following correction is needed when the taskbar is
  92.     // at the left or top and it is not "auto-hidden"
  93. RECT workArea;
  94. SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0);
  95. l += workArea.left;
  96. t += workArea.top;
  97.                              
  98. // make sure the window is not completely out of sight
  99. int max_x = GetSystemMetrics(SM_CXSCREEN) - GetSystemMetrics(SM_CXICON);
  100. int max_y = GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYICON);
  101. cs.x = min(l, max_x);
  102. cs.y = min(t, max_y);
  103. return CMDIFrameWnd::PreCreateWindow(cs);
  104. }
  105. void CGuiMDIFrame::StyleDispl(DWORD dwDsp)
  106. {
  107. m_StyleDisplay=dwDsp;
  108. GuiDrawLayer::IsThemeXP();
  109. GuiDrawLayer::m_Style=m_StyleDisplay;
  110. m_wndCool.StyleDispl(m_StyleDisplay);
  111. if(::IsWindow(m_MdiTabbed.GetSafeHwnd()))
  112. m_MdiTabbed.StyleDispl(m_StyleDisplay);
  113. m_wndStatusBar.StyleDispl(m_StyleDisplay);
  114. m_wndMenuBar.StyleDispl(m_StyleDisplay);
  115. m_wndToolBar.StyleDispl(m_StyleDisplay);
  116. m_dockTop->StyleDispl(m_StyleDisplay);
  117. m_dockLeft->StyleDispl(m_StyleDisplay);
  118. m_dockRight->StyleDispl(m_StyleDisplay);
  119. m_dockBottom->StyleDispl(m_StyleDisplay);
  120. m_NewMenu.StyleDispl(m_StyleDisplay);
  121. SendMessage(WM_NCPAINT);
  122. Invalidate(); 
  123. UpdateWindow();
  124. }
  125. BOOL CGuiMDIFrame::InitMDITabbed()
  126. {
  127. if(::IsWindow(m_MdiTabbed.GetSafeHwnd())) return TRUE;
  128. if (!m_MdiTabbed.Create(WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,0x333))
  129. return FALSE;
  130. if (::IsWindow(m_wndMenuBar.GetSafeHwnd())) m_wndMenuBar.SetTabbed(TRUE);
  131. return TRUE;
  132. }
  133. //*************************************************************************
  134. BOOL CGuiMDIFrame::PreCreateWindow(CREATESTRUCT& cs, UINT nIconID)
  135. {
  136. cs.lpszClass = AfxRegisterWndClass( 0, NULL, NULL,
  137. AfxGetApp()->LoadIcon(nIconID));
  138. ASSERT(cs.lpszClass);
  139. return CMDIFrameWnd::PreCreateWindow(cs);
  140. }
  141. //*************************************************************************
  142. void CGuiMDIFrame::ShowHideBar(CGuiControlBar* pBar)
  143. {
  144. if (pBar->IsWindowVisible())
  145. ShowControlBar(pBar, FALSE, FALSE);
  146. else
  147. ShowControlBar(pBar, TRUE, FALSE);
  148. }
  149. void CGuiMDIFrame::ShowHideBar(CControlBar* pBar)
  150. {
  151. if (pBar->IsWindowVisible())
  152. ShowControlBar(pBar, FALSE, FALSE);
  153. else
  154. ShowControlBar(pBar, TRUE, FALSE);
  155. }
  156. //*************************************************************************
  157. void CGuiMDIFrame::EnableDocking(DWORD dwDockStyle)
  158. {
  159. ASSERT((dwDockStyle & ~ (CBRS_ALIGN_ANY | CBRS_FLOAT_MULTI)) == 0);
  160. m_pFloatingFrameClass = RUNTIME_CLASS(CMiniDockFrameWnd);
  161. CGuiDocBarExten* pDock;
  162. DWORD dwStyle = WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  163. DWORD dwstyle;
  164. DockSpecialBars();
  165. pDock = new CGuiDocBarExten();
  166. pDock->Create(this,dwStyle|CBRS_TOP, AFX_IDW_DOCKBAR_TOP);
  167. dwstyle = pDock->GetBarStyle();
  168. dwstyle &= ~CBRS_BORDER_ANY;
  169. pDock->SetBarStyle(dwstyle);
  170. pDock = new CGuiDocBarExten();
  171. pDock->Create(this, dwStyle|CBRS_BOTTOM, AFX_IDW_DOCKBAR_BOTTOM);
  172. dwstyle = pDock->GetBarStyle();
  173. dwstyle &= ~CBRS_BORDER_ANY;
  174. pDock->SetBarStyle(dwstyle);
  175. pDock = new CGuiDocBarExten();
  176. pDock->Create(this,dwStyle|CBRS_LEFT, AFX_IDW_DOCKBAR_LEFT);
  177. dwstyle = pDock->GetBarStyle();
  178. dwstyle &= ~CBRS_BORDER_ANY;
  179. pDock->SetBarStyle(dwstyle);
  180. pDock = new CGuiDocBarExten();
  181. pDock->Create(this,dwStyle|CBRS_RIGHT, AFX_IDW_DOCKBAR_RIGHT);
  182. dwstyle = pDock->GetBarStyle();
  183. dwstyle &= ~CBRS_BORDER_ANY;
  184. pDock->SetBarStyle(dwstyle);
  185. m_pFloatingFrameClass = RUNTIME_CLASS(CGuiMiniFrame);
  186. }
  187. DWORD CGuiMDIFrame::CanDock(CRect rect, DWORD dwDockStyle, CDockBar** ppDockBar)
  188. {
  189. // dwDockStyle -- allowable styles of bar
  190. // don't allow to dock to floating unless multi is specified
  191. dwDockStyle &= CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI;
  192. if (ppDockBar != NULL)
  193. *ppDockBar = NULL;
  194. POSITION pos = m_listControlBars.GetHeadPosition();
  195. while (pos != NULL)
  196. {
  197. CDockBar* pDockBar = (CDockBar*)m_listControlBars.GetNext(pos);
  198. if (pDockBar->IsDockBar() && pDockBar->IsWindowVisible() &&
  199. (pDockBar->m_dwStyle & dwDockStyle & CBRS_ALIGN_ANY) &&
  200. (!pDockBar->m_bFloating ||
  201. (dwDockStyle & pDockBar->m_dwStyle & CBRS_FLOAT_MULTI)))
  202. {
  203. CRect rectBar;
  204. pDockBar->GetWindowRect(&rectBar);
  205. if (rectBar.Width() == 0)
  206. rectBar.right++;
  207. if (rectBar.Height() == 0)
  208. rectBar.bottom++;
  209. if (rectBar.IntersectRect(rectBar, rect))
  210. {
  211. if (ppDockBar != NULL)
  212. *ppDockBar = pDockBar;
  213. return pDockBar->m_dwStyle & dwDockStyle;
  214. }
  215. }
  216. }
  217. return 0;
  218. }
  219. void CGuiMDIFrame::DockSpecialBars()
  220. {
  221. DWORD dwStyle = WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  222. m_dockTop=new CGuiDocBarExtenEx();
  223. m_dockTop->Create(this,dwStyle|CBRS_TOP,CBRS_ALIGN_TOP);
  224. DWORD dwstyle;
  225. dwstyle = m_dockTop->GetBarStyle();
  226. dwstyle &= ~CBRS_BORDER_ANY;
  227. m_dockTop->SetBarStyle(dwstyle);
  228. m_dockBottom=new CGuiDocBarExtenEx();
  229. m_dockBottom->Create(this,dwStyle|CBRS_BOTTOM,CBRS_ALIGN_BOTTOM);
  230. dwstyle = m_dockBottom->GetBarStyle();
  231. dwstyle &= ~CBRS_BORDER_ANY;
  232. m_dockBottom->SetBarStyle(dwstyle);
  233. m_dockLeft=new CGuiDocBarExtenEx();
  234. m_dockLeft->Create(this,dwStyle|CBRS_LEFT,CBRS_ALIGN_LEFT);
  235. dwstyle = m_dockLeft->GetBarStyle();
  236. dwstyle &= ~CBRS_BORDER_ANY;
  237. m_dockLeft->SetBarStyle(dwstyle);
  238. m_dockRight=new CGuiDocBarExtenEx();
  239. m_dockRight->Create(this,dwStyle|CBRS_RIGHT,CBRS_ALIGN_RIGHT);
  240. dwstyle = m_dockRight->GetBarStyle();
  241. dwstyle &= ~CBRS_BORDER_ANY;
  242. m_dockRight->SetBarStyle(dwstyle);
  243. m_dockHideTop.Create(this,CBRS_ALIGN_TOP);
  244. m_dockHideBottom.Create(this,CBRS_ALIGN_BOTTOM);
  245. m_dockHideLeft.Create(this,CBRS_ALIGN_LEFT);
  246. m_dockHideRight.Create(this,CBRS_ALIGN_RIGHT);
  247. m_dockToolbarTop.Create(this,CBRS_ALIGN_TOP);
  248. m_dockToolbarBottom.Create(this,CBRS_ALIGN_BOTTOM);
  249. m_dockToolbarLeft.Create(this,CBRS_ALIGN_LEFT);
  250. m_dockToolbarRight.Create(this,CBRS_ALIGN_RIGHT);
  251. }
  252. /////////////////////////////////////////////////////////////////////////////
  253. // CGuiMDIFrame message handlers
  254. //***********************************************************************
  255. BOOL CGuiMDIFrame::DestroyWindow()
  256. {
  257. CWinApp* pApp = AfxGetApp();
  258. sProfile = AfxGetAppName();
  259. TCHAR szSection[256];
  260. wsprintf(szSection, "%sMain", sProfile);
  261. WINDOWPLACEMENT wp;
  262.     GetWindowPlacement(&wp);
  263.    pApp->WriteProfileString(szSection, NULL, NULL);
  264. pApp->WriteProfileInt(szSection, _T("left"),(int) wp.rcNormalPosition.left);
  265. pApp->WriteProfileInt(szSection, _T("right"),(int) wp.rcNormalPosition.right);
  266. pApp->WriteProfileInt(szSection, _T("bottom"), (int)wp.rcNormalPosition.bottom);
  267. pApp->WriteProfileInt(szSection, _T("top"), (int)wp.rcNormalPosition.top);
  268. pApp->WriteProfileInt(szSection, _T("status"),(int) wp.showCmd);
  269. pApp->WriteProfileInt(szSection, _T("Style"),(int) GuiDrawLayer::m_Style);
  270. pApp->WriteProfileInt(szSection, _T("Theme"),(int) GuiDrawLayer::m_Theme);
  271. SaveBarState(sProfile);
  272. SavePosBar(sProfile);
  273. return  CFrameWnd::DestroyWindow();
  274. }
  275. void CGuiMDIFrame::SavePosBar(CString szBars)
  276. {
  277. POSITION pos = m_listControlBars.GetHeadPosition();
  278.     while (pos != NULL)
  279.     {
  280.         CGuiControlBar* pBar = (CGuiControlBar*) m_listControlBars.GetNext(pos);
  281.         ASSERT(pBar != NULL);
  282.         if (pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  283.             pBar->SaveBar(szBars);
  284.     }
  285. }
  286. void CGuiMDIFrame::LoadPosBar(CString szBars)
  287. {
  288. POSITION pos = m_listControlBars.GetHeadPosition();
  289.     while (pos != NULL)
  290.     {
  291.         CGuiControlBar* pBar = (CGuiControlBar*) m_listControlBars.GetNext(pos);
  292.         ASSERT(pBar != NULL);
  293.         if (pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  294.             pBar->LoadStateBar(szBars);
  295.     }
  296. }
  297. //***********************************************************************
  298. BOOL CGuiMDIFrame::VerifyBarState(LPCTSTR lpszProfileName)
  299. {
  300.     CDockState state;
  301.     state.LoadState(lpszProfileName);
  302.     for (int i = 0; i < state.m_arrBarInfo.GetSize(); i++)
  303.     {
  304.         CControlBarInfo* pInfo = (CControlBarInfo*)state.m_arrBarInfo[i];
  305.         ASSERT(pInfo != NULL);
  306.         int nDockedCount = pInfo->m_arrBarID.GetSize();
  307.         if (nDockedCount > 0)
  308.         {
  309.             // dockbar
  310.             for (int j = 0; j < nDockedCount; j++)
  311.             {
  312.                 UINT nID = (UINT) pInfo->m_arrBarID[j];
  313.                 if (nID == 0) continue; // row separator
  314.                 if (nID > 0xFFFF)
  315.                     nID &= 0xFFFF; // placeholder - get the ID
  316.                 if (GetControlBar(nID) == NULL)
  317.                     return FALSE;
  318.             }
  319.         }
  320.         if (!pInfo->m_bFloating) // floating dockbars can be created later
  321.             if (GetControlBar(pInfo->m_nBarID) == NULL)
  322.                 return FALSE; // invalid bar ID
  323.     }
  324.     return TRUE;
  325. }
  326. void CGuiMDIFrame::LoadBars()
  327. {
  328. if (VerifyBarState(sProfile))
  329. {
  330. LoadBarState(sProfile);
  331. LoadPosBar(sProfile);
  332. }
  333. }
  334. void CGuiMDIFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
  335. {
  336. // TODO: Add your specialized code here and/or call the base class
  337. CMDIFrameWnd::OnUpdateFrameTitle(bAddToTitle);
  338. if(::IsWindow(m_MdiTabbed.GetSafeHwnd()))
  339. m_MdiTabbed.UpdateWindows();
  340. }
  341. int CGuiMDIFrame::InitMenu(UINT uIDMenu)
  342. {
  343. if (!m_wndMenuBar.CreateEx(this, WS_CHILD | WS_VISIBLE | CBRS_TOP
  344. | CBRS_GRIPPER | CBRS_SIZE_DYNAMIC ) ||
  345. !m_wndMenuBar.LoadMenuBar(uIDMenu))
  346. {
  347. TRACE0("Failed to create menubarn");
  348. return -1;      // fail to create
  349. }
  350. m_NewMenu.LoadMenu(uIDMenu);
  351. m_wndCool.Install(this);
  352. m_wndCool.LoadToolbar(uIDMenu);
  353. return 0;
  354. }
  355. //int CGuiMDIFrame::InitMenu(UINT uIDMenu)
  356. int CGuiMDIFrame::InitStatusBar(UINT *indicators,int nSize)
  357. {
  358. if (!m_wndStatusBar.Create(this) ||
  359. !m_wndStatusBar.SetIndicators(indicators,
  360.   nSize))
  361. {
  362. TRACE0("Failed to create status barn");
  363. return -1;      // fail to create
  364. }
  365. return 0;
  366. }
  367. int CGuiMDIFrame::InitToolBar(UINT uIDMenu)
  368. {
  369. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  370. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),uIDMenu) ||
  371. !m_wndToolBar.LoadToolBar(uIDMenu))
  372. {
  373. TRACE0("Failed to create toolbarn");
  374. return -1; // fail to create
  375. }
  376. // new code:  Serge Koroleuve
  377. IMAGEINFO ii;
  378. m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageInfo(0, &ii);
  379. int cx = ii.rcImage.right - ii.rcImage.left;
  380. int cy = ii.rcImage.bottom - ii.rcImage.top;
  381. int nCount = m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageCount();
  382. CImageList imageList;
  383. CBitmap bitmap;
  384. bitmap.LoadBitmap(uIDMenu);
  385. imageList.Create(cx, cy, ILC_COLORDDB|ILC_MASK, nCount, 0);
  386. imageList.Add(&bitmap, RGB(192,192,192));
  387. m_wndToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
  388. imageList.Detach();
  389. bitmap.Detach();
  390. // end of new code
  391. return 0;
  392. }