GuiOfficeBar.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:14k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Autor  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #include "stdafx.h"
  14. #include "..headerguiofficebar.h"
  15. #include "guidrawlayer.h"
  16. #include "resource.h"
  17. #define HORZF(dw) (dw & CBRS_ORIENT_HORZ)
  18. #define VERTF(dw) (dw & CBRS_ORIENT_VERT)
  19. #define CX_BORDER   1
  20. #define CY_BORDER   1
  21. enum btn{
  22. HTBACK=520,
  23. HTFORWAR=521,
  24. THMENU=522,
  25. HTCLOS=523
  26. };
  27. int ArrBtn[4]={HTBACK,HTFORWAR,THMENU,HTCLOS};
  28. void  _AfxAdjustRectangle(CRect& rect, CPoint pt)
  29. {
  30. int nXOffset = (pt.x < rect.left) ? (pt.x - rect.left) :
  31. (pt.x > rect.right) ? (pt.x - rect.right) : 0;
  32. int nYOffset = (pt.y < rect.top) ? (pt.y - rect.top) :
  33. (pt.y > rect.bottom) ? (pt.y - rect.bottom) : 0;
  34. rect.OffsetRect(nXOffset, nYOffset);
  35. }
  36. BEGIN_MESSAGE_MAP(CGuiOfficeBar,CGuiControlBar)
  37. ON_WM_CREATE()
  38. ON_WM_NCLBUTTONDOWN()
  39. ON_WM_NCLBUTTONUP()
  40. ON_WM_TIMER()
  41. ON_WM_NCMOUSEMOVE()
  42. ON_WM_NCHITTEST()
  43. ON_COMMAND(HTBACK,OnBack)
  44. ON_COMMAND(HTFORWAR,OnForWard)
  45. ON_COMMAND(THMENU,OnMenu)
  46. END_MESSAGE_MAP()
  47. CGuiOfficeBar::CGuiOfficeBar(void)
  48. {
  49. m_stateBtnBack=NORMAL;
  50. m_stateBtnClose=NORMAL;
  51. m_stateBtnFor=NORMAL;
  52. m_stateBtnMenu=NORMAL;
  53. m_StateBtn=NORMAL;
  54. m_nHits=-1;
  55. }
  56. CGuiOfficeBar::~CGuiOfficeBar(void)
  57. {
  58. }
  59. void CGuiOfficeBar::OnBack()
  60. {
  61. }
  62. void CGuiOfficeBar::OnForWard()
  63. {
  64. }
  65. void CGuiOfficeBar::OnMenu()
  66. {
  67. }
  68. int CGuiOfficeBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
  69. {
  70. if (CGuiControlBar::OnCreate(lpCreateStruct) == -1)
  71. return -1;
  72. m_ArrButtons[0].SetData(1,"Back");
  73. m_ArrButtons[0].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
  74. m_ArrButtons[1].SetData(2,"Forwar");
  75. m_ArrButtons[1].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
  76. m_ArrButtons[2].SetData(0,"Menu");
  77. m_ArrButtons[2].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
  78. m_ArrButtons[3].SetData(6,"Close");
  79. m_ArrButtons[3].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
  80. m_ArrButtons[0].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
  81. m_ArrButtons[1].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
  82. m_ArrButtons[2].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
  83. m_ArrButtons[3].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
  84. SetColorFondo(RGB(255,255,255));
  85. return 0;
  86. }
  87. void CGuiOfficeBar::DrawGripper(CDC* pDC,CRect* rc)
  88. {
  89. CRect gripper = rc;
  90. gripper.top =3;
  91. gripper.left+=4;
  92. gripper.right-=IsVert()?5:4;
  93. gripper.bottom =gripper.top +nGapGripper-3;
  94. //si la ventana esta activa pintamos el caption o el area del titulo de color azul 
  95. CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNHIGHLIGHT));
  96. CPen* cpold=pDC->SelectObject(&cp);
  97. //linea superior
  98. CBrush cb;
  99. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());//GuiDrawLayer::GetRGBCaptionXP());
  100. pDC->FillRect(gripper,&cb);
  101. pDC->SelectObject(cpold);
  102. gripper.DeflateRect(1, 1);
  103. CString m_caption;
  104. GetWindowText(m_caption);
  105. CFont m_cfont;
  106. m_cfont.CreateFont(-11,0,0,0,FW_SEMIBOLD,0,0,0,0,1,2,1,34,"Microsoft Sans Serif");
  107. CFont* m_fontOld=pDC->SelectObject(&m_cfont);
  108. int nMode = pDC->SetBkMode(TRANSPARENT);
  109. CSize SizeCad=pDC->GetTextExtent(m_caption);
  110. CRect rCText=gripper;
  111. rCText.top=6;
  112. rCText.bottom =rCText.top+14;
  113. rCText.left=34;
  114. int cont=SizeCad.cx;
  115. while(cont > 1 && gripper.Width()-60 > 0)
  116. {
  117. CSize coor=pDC->GetTextExtent(m_caption,m_caption.GetLength());
  118. if(coor.cx > gripper.Width()-60)
  119. {
  120. m_caption=m_caption.Left(m_caption.GetLength()-1);
  121. }
  122. else
  123. break;
  124. cont--;
  125. }
  126. //CRect gripper;
  127. //------------------------------------------------
  128. GetWindowRect( gripper );
  129. ScreenToClient( gripper );
  130. gripper.OffsetRect( -gripper.left, -gripper.top );
  131. //boton de Close
  132. m_ArrButtons[3].rcArea=gripper;
  133. m_ArrButtons[3].rcArea.left=m_ArrButtons[3].rcArea.right-20;
  134. m_ArrButtons[3].rcArea.right-=7;
  135. m_ArrButtons[3].rcArea.top+=4;
  136. m_ArrButtons[3].rcArea.bottom=m_ArrButtons[3].rcArea.top+13;
  137. //boton menu
  138. m_ArrButtons[2].rcArea=gripper;
  139. m_ArrButtons[2].rcArea.left=m_ArrButtons[3].rcArea.left-16;
  140. m_ArrButtons[2].rcArea.right=m_ArrButtons[2].rcArea.left+13;
  141. m_ArrButtons[2].rcArea.top+=4;
  142. m_ArrButtons[2].rcArea.bottom=m_ArrButtons[2].rcArea.top+13;
  143. //boton back
  144. m_ArrButtons[0].rcArea=gripper;
  145. m_ArrButtons[0].rcArea.left+=4;
  146. m_ArrButtons[0].rcArea.right=m_ArrButtons[0].rcArea.left+13;
  147. m_ArrButtons[0].rcArea.top+=4;
  148. m_ArrButtons[0].rcArea.bottom=m_ArrButtons[0].rcArea.top+13;
  149. //boton forward
  150. m_ArrButtons[1].rcArea=gripper;
  151. m_ArrButtons[1].rcArea.left+=m_ArrButtons[0].rcArea.right+2;
  152. m_ArrButtons[1].rcArea.right=m_ArrButtons[1].rcArea.left+13;
  153. m_ArrButtons[1].rcArea.top+=4;
  154. m_ArrButtons[1].rcArea.bottom=m_ArrButtons[1].rcArea.top+13;
  155. //m_rcCloseBtn.left-=4;
  156. //ClientToScreen(m_rcCloseBtn);
  157.  m_ArrButtons[0].Paint(pDC,m_stateBtnBack,m_ArrButtons[0].rcArea,::GetSysColor(COLOR_BTNFACE));
  158.  m_ArrButtons[1].Paint(pDC,m_stateBtnFor,m_ArrButtons[1].rcArea,::GetSysColor(COLOR_BTNFACE));
  159.  m_ArrButtons[2].Paint(pDC,m_stateBtnMenu,m_ArrButtons[2].rcArea,::GetSysColor(COLOR_BTNFACE));
  160.  m_ArrButtons[3].Paint(pDC,m_stateBtnClose,m_ArrButtons[3].rcArea,::GetSysColor(COLOR_BTNFACE));
  161. //------------------------------------------------
  162. if (gripper.Width() > 0 )
  163. pDC->TextOut(rCText.left+3,rCText.top,m_caption);
  164. //CRect gripper;
  165. //------------------------------------------------
  166. pDC->SetBkMode(nMode);
  167. pDC->SelectObject(m_fontOld);
  168. }
  169. void CGuiOfficeBar::ShowTitle(CString m_Caption)
  170. {
  171. SetWindowText(m_Caption);
  172. SendMessage(WM_COMMAND,WM_SHOWTITLE);
  173. }
  174. void CGuiOfficeBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
  175. {
  176. // TODO: Add your message handler code here and/or call default
  177. if( m_nHits == HTCLOS || m_nHits == HTBACK || m_nHits == HTFORWAR|| m_nHits == THMENU)
  178. {
  179. if (m_nHits == HTCLOS)
  180. m_stateBtnClose=PRESS;
  181. else if (m_nHits == HTBACK)
  182. m_stateBtnBack=PRESS;
  183. else if(m_nHits == HTFORWAR)
  184. m_stateBtnFor=PRESS;
  185. else if(m_nHits == THMENU)
  186. m_stateBtnMenu=PRESS;
  187. m_StateBtn=PRESS;
  188. SendMessage(WM_NCPAINT);
  189. SetTimer(1,100,0);
  190. return;
  191. if (nHitTest == HTCAPTION)
  192. SetCursor(::LoadCursor(NULL,IDC_SIZEALL));
  193. CGuiControlBar::OnNcLButtonDown(nHitTest, point);
  194. }
  195. void CGuiOfficeBar::OnNcLButtonUp(UINT nHitTest, CPoint point)
  196. {
  197. // TODO: Add your message handler code here and/or call default
  198. CRect rcT;
  199. point.y+=23;
  200. point.x+=5;
  201. if (m_stateBtnBack!=NORMAL)
  202. rcT=m_ArrButtons[0].rcArea;
  203. else if(m_stateBtnFor!=NORMAL)
  204. rcT=m_ArrButtons[1].rcArea;
  205. else if(m_stateBtnMenu!=NORMAL)
  206. rcT=m_ArrButtons[2].rcArea;
  207. else if(m_stateBtnClose!=NORMAL)
  208. rcT=m_ArrButtons[3].rcArea;
  209. ClientToScreen(rcT);
  210. if (rcT.PtInRect(point))
  211. {
  212. if (m_StateBtn ==PRESS)
  213. {
  214. if(m_stateBtnClose!=NORMAL)
  215.  GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
  216. else
  217. {
  218. SendMessage (WM_COMMAND,m_nHits);
  219. AfxGetMainWnd()->SendMessage(WM_COMMAND,m_nHits);
  220. }
  221. m_StateBtn=NORMAL;
  222. m_stateBtnBack=NORMAL;
  223. m_stateBtnClose=NORMAL;
  224. m_stateBtnFor=NORMAL;
  225. m_stateBtnMenu=NORMAL;
  226. m_nHits=-1;
  227. KillTimer(1);
  228. }
  229. //SendMessage(WM_NCPAINT);
  230. return;
  231. }
  232. CGuiControlBar::OnNcLButtonUp(nHitTest, point);
  233. }
  234. void CGuiOfficeBar::OnTimer(UINT nIDEvent)
  235. {
  236. // TODO: Add your message handler code here and/or call default
  237. if (m_StateBtn==NORMAL) return;
  238. CRect rc;
  239. CPoint pt(GetMessagePos());
  240. CRect rcT=CRect(0,0,0,0);
  241. if (m_stateBtnBack!=NORMAL)
  242. rcT=m_ArrButtons[0].rcArea;
  243. else if(m_stateBtnFor!=NORMAL)
  244. rcT=m_ArrButtons[1].rcArea;
  245. else if(m_stateBtnMenu!=NORMAL)
  246. rcT=m_ArrButtons[2].rcArea;
  247. else if(m_stateBtnClose!=NORMAL)
  248. rcT=m_ArrButtons[3].rcArea;
  249. ClientToScreen(rcT);
  250. pt.y+=23;
  251. pt.x+=5;
  252. if (!rcT.PtInRect(pt))
  253. {
  254. m_StateBtn=NORMAL;
  255. m_stateBtnBack=NORMAL;
  256. m_stateBtnClose=NORMAL;
  257. m_stateBtnFor=NORMAL;
  258. m_stateBtnMenu=NORMAL;
  259. m_nHits=-1;
  260. KillTimer(1);
  261. SendMessage(WM_NCPAINT); 
  262. }
  263. CGuiControlBar::OnTimer(nIDEvent);
  264. }
  265. void CGuiOfficeBar::OnNcMouseMove(UINT nHitTest, CPoint point)
  266. {
  267. // TODO: Add your message handler code here and/or call default
  268. if (m_StateBtn != NORMAL) return;
  269. if (m_nHits == HTCLOS)
  270. {
  271. m_StateBtn=OVER;
  272. m_stateBtnClose=OVER;
  273. m_stateBtnBack=NORMAL;
  274. m_stateBtnFor=NORMAL;
  275. m_stateBtnMenu=NORMAL;
  276. SendMessage(WM_NCPAINT);
  277. SetTimer(1,100,0);
  278. return;
  279. }
  280. if (m_nHits == HTBACK)
  281. {
  282. m_stateBtnBack=OVER;
  283. m_stateBtnClose=NORMAL;
  284. m_stateBtnFor=NORMAL;
  285. m_stateBtnMenu=NORMAL;
  286. m_StateBtn=OVER;
  287. SendMessage(WM_NCPAINT);
  288. SetTimer(1,100,0);
  289. return;
  290. }
  291. if (m_nHits == HTFORWAR)
  292. {
  293. m_stateBtnBack=NORMAL;
  294. m_stateBtnClose=NORMAL;
  295. m_stateBtnFor=OVER;
  296. m_stateBtnMenu=NORMAL;
  297. m_StateBtn=OVER;
  298. SendMessage(WM_NCPAINT);
  299. SetTimer(1,100,0);
  300. return;
  301. }
  302. if (m_nHits == THMENU)
  303. {
  304. m_stateBtnBack=NORMAL;
  305. m_stateBtnClose=NORMAL;
  306. m_stateBtnFor=NORMAL;
  307. m_stateBtnMenu=OVER;
  308. m_StateBtn=OVER;
  309. SendMessage(WM_NCPAINT);
  310. SetTimer(1,100,0);
  311. return;
  312. }
  313. CGuiControlBar::OnNcMouseMove(nHitTest, point);
  314. }
  315. UINT CGuiOfficeBar::OnNcHitTest(CPoint point)
  316. {
  317. // TODO: Add your message handler code here and/or call default
  318. CRect rcWindow;
  319. //no se convierte las coordenadas de pantalla porque el punto
  320. //entregado por esta funci髇 esta dado en el mismo sentido.
  321. GetWindowRect(rcWindow);
  322. CPoint pt=point;
  323. pt.y+=23;
  324. pt.x+=5;
  325. for(int i=0; i < 4; i++)
  326. {
  327. CRect rcT=m_ArrButtons[i].rcArea;
  328. ClientToScreen(rcT);
  329. if (rcT.PtInRect(pt))
  330. return m_nHits=ArrBtn[i];
  331. }
  332. m_nHits=-1;
  333. return CGuiControlBar::OnNcHitTest(point);
  334. }
  335. CGuiDockContextOffice::~CGuiDockContextOffice()
  336. {
  337. }
  338. void CGuiDockContextOffice::StartDrag(CPoint pt)
  339. {
  340. ASSERT_VALID(m_pBar);
  341. m_bDragging = TRUE;
  342. InitLoop();
  343. // GetWindowRect returns screen coordinates(not mirrored),
  344. // so if the desktop is mirrored then turn off mirroring
  345. // for the desktop dc so that we get correct focus rect drawn.
  346. // This layout change should be remembered, just in case ...
  347. if (m_pDC->GetLayout() & LAYOUT_RTL)
  348. m_pDC->SetLayout(LAYOUT_LTR);
  349. if (m_pBar->m_dwStyle & CBRS_SIZE_DYNAMIC)
  350. {
  351. // get true bar size (including borders)
  352. CRect rect;
  353. m_pBar->GetWindowRect(rect);
  354. m_ptLast = pt;
  355. AdjustWindowForFloat(rect);
  356. CSize sizeHorz = m_pBar->CalcDynamicLayout(0, LM_HORZ | LM_HORZDOCK);
  357. CSize sizeVert = m_pBar->CalcDynamicLayout(0, LM_VERTDOCK);
  358. CSize sizeFloat = m_pBar->CalcDynamicLayout(0, LM_HORZ | LM_MRUWIDTH);
  359. m_rectDragHorz = CRect(rect.TopLeft(), sizeHorz);
  360. m_rectDragVert = CRect(rect.TopLeft(), sizeVert);
  361. // calculate frame dragging rectangle
  362. m_rectFrameDragHorz = CRect(rect.TopLeft(), sizeFloat);
  363. m_rectFrameDragVert = CRect(rect.TopLeft(), sizeFloat);
  364. CMiniFrameWnd::CalcBorders(&m_rectFrameDragHorz);
  365. CMiniFrameWnd::CalcBorders(&m_rectFrameDragVert);
  366. // m_rectFrameDragHorz.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  367. // m_rectFrameDragVert.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  368. }
  369. else if (m_pBar->m_dwStyle & CBRS_SIZE_FIXED)
  370. {
  371. // get true bar size (including borders)
  372. CRect rect;
  373. m_pBar->GetWindowRect(rect);
  374. AdjustWindowForFloat(rect);
  375. m_ptLast = pt;
  376. CSize sizeHorz = m_pBar->CalcDynamicLayout(-1, LM_HORZ | LM_HORZDOCK);
  377. CSize sizeVert = m_pBar->CalcDynamicLayout(-1, LM_VERTDOCK);
  378. // calculate frame dragging rectangle
  379. m_rectFrameDragHorz = m_rectDragHorz = CRect(rect.TopLeft(), sizeHorz);
  380. m_rectFrameDragVert = m_rectDragVert = CRect(rect.TopLeft(), sizeVert);
  381. CMiniFrameWnd::CalcBorders(&m_rectFrameDragHorz);
  382. CMiniFrameWnd::CalcBorders(&m_rectFrameDragVert);
  383. // m_rectFrameDragHorz.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  384. // m_rectFrameDragVert.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  385. }
  386. else
  387. {
  388. // get true bar size (including borders)
  389. CRect rect;
  390. m_pBar->GetWindowRect(rect);
  391. AdjustWindowForFloat(rect);
  392. m_ptLast = pt;
  393. BOOL bHorz = HORZF(m_dwStyle);
  394. DWORD dwMode = !bHorz ? (LM_HORZ | LM_HORZDOCK) : LM_VERTDOCK;
  395. CSize size = m_pBar->CalcDynamicLayout(-1, dwMode);
  396. // calculate inverted dragging rect
  397. if (bHorz)
  398. {
  399. m_rectDragHorz = rect;
  400. m_rectDragVert = CRect(CPoint(pt.x - rect.Height()/2, rect.top), size);
  401. }
  402. else // vertical orientation
  403. {
  404. m_rectDragVert = rect;
  405. m_rectDragHorz = CRect(CPoint(rect.left, pt.y - rect.Width()/2), size);
  406. }
  407. // calculate frame dragging rectangle
  408. m_rectFrameDragHorz = m_rectDragHorz;
  409. m_rectFrameDragVert = m_rectDragVert;
  410. CMiniFrameWnd::CalcBorders(&m_rectFrameDragHorz);
  411. CMiniFrameWnd::CalcBorders(&m_rectFrameDragVert);
  412. // m_rectFrameDragHorz.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  413. // m_rectFrameDragVert.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);
  414. }
  415. // adjust rectangles so that point is inside
  416. _AfxAdjustRectangle(m_rectDragHorz, pt);
  417. _AfxAdjustRectangle(m_rectDragVert, pt);
  418. _AfxAdjustRectangle(m_rectFrameDragHorz, pt);
  419. _AfxAdjustRectangle(m_rectFrameDragVert, pt);
  420. // initialize tracking state and enter tracking loop
  421. m_dwOverDockStyle = CanDock();
  422. Move(pt);   // call it here to handle special keys
  423. Track();
  424. }
  425. void CGuiDockContextOffice::AdjustWindowForFloat(CRect& rect)
  426. {
  427. if( m_pBar->IsFloating())
  428. rect.top+=(GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYFRAME));
  429. }