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

对话框与窗口

开发平台:

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.  * -Patrick (skydive241) *
  22.  * -Stanimir Jordanov (Demosten) *
  23.  ****************************************************************************/
  24. #include "stdafx.h"
  25. #include "guiframewnd.h"
  26. #include "GuiMiniFrame.h"
  27. IMPLEMENT_DYNCREATE(CGuiFrameWnd, CFrameWnd)
  28. CGuiFrameWnd::CGuiFrameWnd(void)
  29. {
  30. m_MdiTabbed=FALSE;
  31. sProfile = AfxGetAppName();
  32. sProfile.Replace(_T(' '), _T('_'));
  33. m_StyleDisplay=GUISTYLE_XP;
  34. }
  35. CGuiFrameWnd::~CGuiFrameWnd(void)
  36. {
  37. }
  38. void CGuiFrameWnd::OnSysColorChange( )
  39. {
  40. CFrameWnd::OnSysColorChange( );
  41. GuiDrawLayer::IsThemeXP();
  42. }
  43. BOOL CGuiFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
  44. {
  45. // Restore main window position
  46. CWinApp* pApp = AfxGetApp();
  47. TCHAR szSection[256];
  48.   wsprintf(szSection, "%s-Main", sProfile);
  49. // Restore main window position
  50.     CWinApp* app = AfxGetApp();
  51.     int s, t, b, r, l;
  52. l = pApp->GetProfileInt(szSection, "left",10);
  53. t = pApp->GetProfileInt(szSection, "top",10);
  54. b = pApp->GetProfileInt(szSection, "bottom",400);
  55. r = pApp->GetProfileInt(szSection, "right",600);
  56. s = pApp->GetProfileInt(szSection, "status", SW_NORMAL);
  57. GuiDrawLayer::m_Style=(int)pApp->WriteProfileInt(szSection, _T("Style"),GUISTYLE_XP);
  58. GuiDrawLayer::m_Theme=(int)pApp->WriteProfileInt(szSection, _T("Theme"),0);
  59. // only restore if there is a previously saved position
  60. // restore the window's status
  61. app->m_nCmdShow = s;
  62.                              
  63. // restore the window's width and height
  64. cs.cx = r - l;
  65. cs.cy = b - t;
  66.                              
  67. // the following correction is needed when the taskbar is
  68.     // at the left or top and it is not "auto-hidden"
  69. RECT workArea;
  70. SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0);
  71. l += workArea.left;
  72. t += workArea.top;
  73.                              
  74. // make sure the window is not completely out of sight
  75. int max_x = GetSystemMetrics(SM_CXSCREEN) - GetSystemMetrics(SM_CXICON);
  76. int max_y = GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYICON);
  77. cs.x = min(l, max_x);
  78. cs.y = min(t, max_y);
  79. return CFrameWnd::PreCreateWindow(cs);
  80. }
  81. BOOL CGuiFrameWnd::PreTranslateMessage(MSG* pMsg) 
  82. {
  83. if (m_wndMenuBar.TranslateFrameMessage(pMsg))
  84. return TRUE;
  85. return CFrameWnd::PreTranslateMessage(pMsg);
  86. }
  87. //*************************************************************************
  88. BOOL CGuiFrameWnd::PreCreateWindow(CREATESTRUCT& cs, UINT nIconID)
  89. {
  90. cs.lpszClass = AfxRegisterWndClass( 0, NULL, NULL,
  91. AfxGetApp()->LoadIcon(nIconID));
  92. ASSERT(cs.lpszClass);
  93. return CFrameWnd::PreCreateWindow(cs);
  94. }
  95. void CGuiFrameWnd::StyleDispl(DWORD dwDsp)
  96. {
  97. m_StyleDisplay=dwDsp;
  98. GuiDrawLayer::m_Style=m_StyleDisplay;
  99. GuiDrawLayer::IsThemeXP();
  100. m_wndCool.StyleDispl(m_StyleDisplay);
  101. m_wndStatusBar.StyleDispl(m_StyleDisplay);
  102. m_wndMenuBar.StyleDispl(m_StyleDisplay);
  103. m_wndToolBar.StyleDispl(m_StyleDisplay);
  104. m_dockTop->StyleDispl(m_StyleDisplay);
  105. m_dockLeft->StyleDispl(m_StyleDisplay);
  106. m_dockRight->StyleDispl(m_StyleDisplay);
  107. m_dockBottom->StyleDispl(m_StyleDisplay);
  108. m_NewMenu.StyleDispl(m_StyleDisplay);
  109. SendMessage(WM_NCPAINT);
  110. Invalidate(); 
  111. UpdateWindow();
  112. }
  113. void CGuiFrameWnd::EnableDocking(DWORD dwDockStyle)
  114. {
  115. ASSERT((dwDockStyle & ~ (CBRS_ALIGN_ANY | CBRS_FLOAT_MULTI)) == 0);
  116. m_pFloatingFrameClass = RUNTIME_CLASS(CMiniDockFrameWnd);
  117. CGuiDocBarExten* pDock;
  118. DWORD dwStyle = WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  119. DWORD dwstyle;
  120. DockSpecialBars();
  121. pDock = new CGuiDocBarExten();
  122. pDock->Create(this,dwStyle|CBRS_TOP, AFX_IDW_DOCKBAR_TOP);
  123. dwstyle = pDock->GetBarStyle();
  124. dwstyle &= ~CBRS_BORDER_ANY;
  125. pDock->SetBarStyle(dwstyle);
  126. pDock = new CGuiDocBarExten();
  127. pDock->Create(this, dwStyle|CBRS_BOTTOM, AFX_IDW_DOCKBAR_BOTTOM);
  128. dwstyle = pDock->GetBarStyle();
  129. dwstyle &= ~CBRS_BORDER_ANY;
  130. pDock->SetBarStyle(dwstyle);
  131. pDock = new CGuiDocBarExten();
  132. pDock->Create(this,dwStyle|CBRS_LEFT, AFX_IDW_DOCKBAR_LEFT);
  133. dwstyle = pDock->GetBarStyle();
  134. dwstyle &= ~CBRS_BORDER_ANY;
  135. pDock->SetBarStyle(dwstyle);
  136. pDock = new CGuiDocBarExten();
  137. pDock->Create(this,dwStyle|CBRS_RIGHT, AFX_IDW_DOCKBAR_RIGHT);
  138. dwstyle = pDock->GetBarStyle();
  139. dwstyle &= ~CBRS_BORDER_ANY;
  140. pDock->SetBarStyle(dwstyle);
  141. m_pFloatingFrameClass = RUNTIME_CLASS(CGuiMiniFrame);
  142. }
  143. void CGuiFrameWnd::ShowHideBar(CGuiControlBar* pBar)
  144. {
  145. if (pBar->IsWindowVisible())
  146. ShowControlBar(pBar, FALSE, FALSE);
  147. else
  148. ShowControlBar(pBar, TRUE, FALSE);
  149. }
  150. void CGuiFrameWnd::ShowHideBar(CControlBar* pBar)
  151. {
  152. if (pBar->IsWindowVisible())
  153. ShowControlBar(pBar, FALSE, FALSE);
  154. else
  155. ShowControlBar(pBar, TRUE, FALSE);
  156. }
  157. void CGuiFrameWnd::SavePosBar(CString szBars)
  158. {
  159. POSITION pos = m_listControlBars.GetHeadPosition();
  160.     while (pos != NULL)
  161.     {
  162.         CGuiControlBar* pBar = (CGuiControlBar*) m_listControlBars.GetNext(pos);
  163.         ASSERT(pBar != NULL);
  164.         if (pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  165.             pBar->SaveBar(szBars);
  166.     }
  167. }
  168. void CGuiFrameWnd::LoadPosBar(CString szBars)
  169. {
  170. POSITION pos = m_listControlBars.GetHeadPosition();
  171.     while (pos != NULL)
  172.     {
  173.         CGuiControlBar* pBar = (CGuiControlBar*) m_listControlBars.GetNext(pos);
  174.         ASSERT(pBar != NULL);
  175.         if (pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  176.             pBar->LoadStateBar(szBars);
  177.     }
  178. }
  179. void CGuiFrameWnd::DockSpecialBars()
  180. {
  181. DWORD dwStyle = WS_CHILD| WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  182. m_dockTop=new CGuiDocBarExtenEx();
  183. m_dockTop->Create(this,dwStyle|CBRS_TOP,CBRS_ALIGN_TOP);
  184. DWORD dwstyle;
  185. dwstyle = m_dockTop->GetBarStyle();
  186. dwstyle &= ~CBRS_BORDER_ANY;
  187. m_dockTop->SetBarStyle(dwstyle);
  188. m_dockBottom=new CGuiDocBarExtenEx();
  189. m_dockBottom->Create(this,dwStyle|CBRS_BOTTOM,CBRS_ALIGN_BOTTOM);
  190. dwstyle = m_dockBottom->GetBarStyle();
  191. dwstyle &= ~CBRS_BORDER_ANY;
  192. m_dockBottom->SetBarStyle(dwstyle);
  193. m_dockLeft=new CGuiDocBarExtenEx();
  194. m_dockLeft->Create(this,dwStyle|CBRS_LEFT,CBRS_ALIGN_LEFT);
  195. dwstyle = m_dockLeft->GetBarStyle();
  196. dwstyle &= ~CBRS_BORDER_ANY;
  197. m_dockLeft->SetBarStyle(dwstyle);
  198. m_dockRight=new CGuiDocBarExtenEx();
  199. m_dockRight->Create(this,dwStyle|CBRS_RIGHT,CBRS_ALIGN_RIGHT);
  200. dwstyle = m_dockRight->GetBarStyle();
  201. dwstyle &= ~CBRS_BORDER_ANY;
  202. m_dockRight->SetBarStyle(dwstyle);
  203. m_dockHideTop.Create(this,CBRS_ALIGN_TOP);
  204. m_dockHideBottom.Create(this,CBRS_ALIGN_BOTTOM);
  205. m_dockHideLeft.Create(this,CBRS_ALIGN_LEFT);
  206. m_dockHideRight.Create(this,CBRS_ALIGN_RIGHT);
  207. m_dockToolbarTop.Create(this,CBRS_ALIGN_TOP);
  208. m_dockToolbarBottom.Create(this,CBRS_ALIGN_BOTTOM);
  209. m_dockToolbarLeft.Create(this,CBRS_ALIGN_LEFT);
  210. m_dockToolbarRight.Create(this,CBRS_ALIGN_RIGHT);
  211. }
  212. /////////////////////////////////////////////////////////////////////////////
  213. // CGuiMDIFrame message handlers
  214. //***********************************************************************
  215. BOOL CGuiFrameWnd::DestroyWindow()
  216. {
  217. CWinApp* pApp = AfxGetApp();
  218. TCHAR szSection[256];
  219. wsprintf(szSection, "%s-Main", sProfile);
  220. WINDOWPLACEMENT wp;
  221.     GetWindowPlacement(&wp);
  222. pApp->WriteProfileString(szSection, NULL, NULL);
  223. pApp->WriteProfileInt(szSection, "left", wp.rcNormalPosition.left);
  224. pApp->WriteProfileInt(szSection, "right", wp.rcNormalPosition.right);
  225. pApp->WriteProfileInt(szSection, "bottom", wp.rcNormalPosition.bottom);
  226. pApp->WriteProfileInt(szSection, "top", wp.rcNormalPosition.top);
  227. pApp->WriteProfileInt(szSection, "status", wp.showCmd);
  228. pApp->WriteProfileInt(szSection, _T("Style"),(int) GuiDrawLayer::m_Style);
  229. pApp->WriteProfileInt(szSection, _T("Theme"),(int) GuiDrawLayer::m_Theme);
  230. SaveBarState(sProfile);
  231. SavePosBar(sProfile);
  232. return CFrameWnd::DestroyWindow();
  233. }
  234. //***********************************************************************
  235. BOOL CGuiFrameWnd::VerifyBarState(LPCTSTR lpszProfileName)
  236. {
  237.     CDockState state;
  238.     state.LoadState(lpszProfileName);
  239.     for (int i = 0; i < state.m_arrBarInfo.GetSize(); i++)
  240.     {
  241.         CControlBarInfo* pInfo = (CControlBarInfo*)state.m_arrBarInfo[i];
  242.         ASSERT(pInfo != NULL);
  243.         int nDockedCount = pInfo->m_arrBarID.GetSize();
  244.         if (nDockedCount > 0)
  245.         {
  246.             // dockbar
  247.             for (int j = 0; j < nDockedCount; j++)
  248.             {
  249.                 UINT nID = (UINT) pInfo->m_arrBarID[j];
  250.                 if (nID == 0) continue; // row separator
  251.                 if (nID > 0xFFFF)
  252.                     nID &= 0xFFFF; // placeholder - get the ID
  253.                 if (GetControlBar(nID) == NULL)
  254.                     return FALSE;
  255.             }
  256.         }
  257.         if (!pInfo->m_bFloating) // floating dockbars can be created later
  258.             if (GetControlBar(pInfo->m_nBarID) == NULL)
  259.                 return FALSE; // invalid bar ID
  260.     }
  261.     return TRUE;
  262. }
  263. void CGuiFrameWnd::LoadBars()
  264. {
  265. if (VerifyBarState(sProfile))
  266. {
  267. LoadBarState(sProfile);
  268. LoadPosBar(sProfile);
  269. }
  270. }
  271. BEGIN_MESSAGE_MAP(CGuiFrameWnd, CFrameWnd)
  272. ON_WM_CREATE()
  273. ON_WM_SYSCOLORCHANGE()
  274. END_MESSAGE_MAP()
  275. int CGuiFrameWnd::InitMenu(UINT uIDMenu)
  276. {
  277. if (!m_wndMenuBar.CreateEx(this, WS_CHILD | WS_VISIBLE | CBRS_TOP
  278. | CBRS_GRIPPER | CBRS_SIZE_DYNAMIC ) ||
  279. !m_wndMenuBar.LoadMenuBar(uIDMenu))
  280. {
  281. TRACE0("Failed to create menubarn");
  282. return -1;      // fail to create
  283. }
  284. m_NewMenu.LoadMenu(uIDMenu);
  285. m_wndCool.Install(this);
  286. m_wndCool.LoadToolbar(uIDMenu);
  287. return 0;
  288. }
  289. int CGuiFrameWnd::InitStatusBar(const UINT* lpIDArray,int nSize)
  290. {
  291. if (!m_wndStatusBar.Create(this) ||
  292. !m_wndStatusBar.SetIndicators(lpIDArray,
  293.   nSize))
  294. {
  295. TRACE0("Failed to create status barn");
  296. return -1;      // fail to create
  297. }
  298. return 0;
  299. }
  300. int CGuiFrameWnd::InitToolBar(UINT uIDMenu)
  301. {
  302. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  303. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),uIDMenu) ||
  304. !m_wndToolBar.LoadToolBar(uIDMenu))
  305. {
  306. TRACE0("Failed to create toolbarn");
  307. return -1; // fail to create
  308. }
  309. // new code:  Serge Koroleuve
  310. IMAGEINFO ii;
  311. m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageInfo(0, &ii);
  312. int cx = ii.rcImage.right - ii.rcImage.left;
  313. int cy = ii.rcImage.bottom - ii.rcImage.top;
  314. int nCount = m_wndToolBar.GetToolBarCtrl().GetImageList()->GetImageCount();
  315. CImageList imageList;
  316. CBitmap bitmap;
  317. bitmap.LoadBitmap(uIDMenu);
  318. imageList.Create(cx, cy, ILC_COLORDDB|ILC_MASK, nCount, 0);
  319. imageList.Add(&bitmap, RGB(192,192,192));
  320. m_wndToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
  321. imageList.Detach();
  322. bitmap.Detach();
  323. // end of new code
  324. return 0;
  325. }
  326. int CGuiFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  327. {
  328. lpCreateStruct->style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
  329. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  330. return -1;
  331. // TODO:  Add your specialized creation code here
  332. return 0;
  333. }
  334. BOOL CGuiFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) 
  335. {
  336. // only do this once
  337. ASSERT_VALID_IDR(nIDResource);
  338. ASSERT(m_nIDHelp == 0 || m_nIDHelp == nIDResource);
  339. m_nIDHelp = nIDResource; // ID for help context (+HID_BASE_RESOURCE)
  340. CString strFullString;
  341. if (strFullString.LoadString(nIDResource))
  342. AfxExtractSubString(m_strTitle, strFullString, 0); // first sub-string
  343. VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
  344. // attempt to create the window
  345. LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource);
  346. LPCTSTR lpszTitle = m_strTitle;
  347. if (!Create(lpszClass, lpszTitle, dwDefaultStyle, rectDefault,pParentWnd, NULL, 0L, pContext))
  348. {
  349. return FALSE; // will self destruct on failure normally
  350. }
  351. // save the default menu handle
  352. ASSERT(m_hWnd != NULL);
  353. m_hMenuDefault = ::GetMenu(m_hWnd);
  354. // load accelerator resource
  355. LoadAccelTable(MAKEINTRESOURCE(nIDResource));
  356. if (pContext == NULL) // send initial update
  357. SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
  358. return TRUE;
  359. }