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

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. //-----------------------------------------------------------------------//
  3. // This is a part of the GuiLib MFC Extention.  //
  4. // Autor  :  Francisco Campos  //
  5. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  6. // This code is provided "as is", with absolutely no warranty expressed  //
  7. // or implied. Any use is at your own risk.  //
  8. // You must obtain the author's consent before you can include this code //
  9. // in a software library.  //
  10. // If the source code in  this file is used in any application  //
  11. // then acknowledgement must be made to the author of this program  //
  12. // fcampos@tutopia.com  //
  13. //-----------------------------------------------------------------------//
  14. #include "stdafx.h"
  15. #include "GuiOutLook.h"
  16. #include "resource.h"
  17. #include "GuiDrawlayer.h"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CGuiOutLook
  25. IMPLEMENT_DYNCREATE(CGuiOutLook, CWnd)
  26. CGuiOutLook::CGuiOutLook()
  27. {
  28. m_ArrayButtons.RemoveAll();
  29. m_sizeImage=CSize(20,20);
  30. m_ActualButtonPres=-1;
  31. m_cbkg=::GetSysColor(COLOR_3DSHADOW);
  32. m_NumBottoms=0;
  33. m_mouseMove=-1;
  34. m_ultimoBotonResal=-1;
  35. m_Avance=0;    //avance del scroll
  36. m_iDrawFrameUp=FALSE; //dibujar o no los botones arriba 
  37. m_iDrawFrameDown=FALSE;     //y abajo
  38. m_bIsXp=FALSE;
  39. }
  40. CItems::CItems(CGuiToolButton* button,HICON hIcon,CString szMessage,CString szToolTip)
  41. {
  42. m_bt=button;
  43. m_bt->SethIcon(hIcon);
  44. m_bt->SetToolTip(szToolTip);
  45. m_szMessage=szMessage;
  46. m_btipo=TRUE;
  47. }
  48. CGuiOutLook::~CGuiOutLook()
  49. {
  50. /* Modified By SunZhenyu 2003/8/22, Add next 7 lines. */
  51. for(int i=0; i<m_ArrayButtons.GetSize(); i++)
  52. {
  53. CItems * p = (CItems*)m_ArrayButtons[i];
  54. if( p )
  55. delete p;
  56. }
  57. m_ArrayButtons.RemoveAll();
  58. }
  59. BEGIN_MESSAGE_MAP(CGuiOutLook, CWnd)
  60. //{{AFX_MSG_MAP(CGuiOutLook)
  61. ON_WM_CREATE()
  62. ON_WM_ERASEBKGND()
  63. ON_WM_PAINT()
  64. ON_WM_SIZE()
  65. ON_WM_LBUTTONDOWN()
  66. ON_WM_LBUTTONUP()
  67. ON_WM_TIMER()
  68. ON_WM_SYSCOLORCHANGE()
  69. //}}AFX_MSG_MAP
  70. END_MESSAGE_MAP()
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CGuiOutLook message handlers
  73. BOOL CGuiOutLook::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) 
  74. {
  75. mnID=nID;
  76. return CWnd::Create(NULL,_T(""), dwStyle|WS_CHILD, rect, pParentWnd, nID);
  77. }
  78. BOOL CGuiOutLook::PreTranslateMessage(MSG* pMsg) 
  79. {
  80. return CWnd::PreTranslateMessage(pMsg);
  81. }
  82. int CGuiOutLook::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  83. {
  84. if (CWnd::OnCreate(lpCreateStruct) == -1)
  85. return -1;
  86. return 0;
  87. }
  88. BOOL CGuiOutLook::OnEraseBkgnd(CDC* pDC) 
  89. {
  90. // TODO: Add your message handler code here and/or call default
  91. CBrush cbm;
  92. CRect rect;
  93. GetClientRect(&rect);
  94. rect.left+=1;
  95. rect.OffsetRect(-1,0);
  96. cbm.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
  97. pDC->FillRect(rect,&cbm);
  98. return TRUE;
  99. }
  100. void CGuiOutLook::OnLButtonDown(UINT nFlags, CPoint point) 
  101. {
  102. // TODO: Add your message handler code here and/or call default
  103. int m_iNumBotton= m_ArrayButtons.GetSize();
  104. CClientDC  dc(this);
  105. m_bPressU=FALSE;
  106. m_bPressD=FALSE;
  107. if (m_iDrawFrameUp==TRUE)
  108. {
  109. if (m_rectArrowUp.PtInRect(point))
  110. {
  111. dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP|DFCS_PUSHED);
  112. m_bPressU=TRUE;
  113. SetTimer(1,100,NULL);
  114. m_bPressU=FALSE;
  115. }
  116. }
  117. if (m_iDrawFrameDown==TRUE)
  118. {
  119. if (m_rectArrowDown.PtInRect(point))
  120. {
  121. dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN|DFCS_PUSHED);
  122. m_bPressD=TRUE;
  123. SetTimer(1,100,NULL);
  124. m_bPressD=FALSE;
  125. }
  126. }
  127. CWnd::OnLButtonDown(nFlags, point);
  128. }
  129. void CGuiOutLook::OnTimer(UINT nIDEvent) 
  130. {
  131. if (nIDEvent == 1)
  132. {
  133. CPoint pt(GetMessagePos());
  134. CRect m_rc;
  135. ScreenToClient(&pt);
  136. GetClientRect(m_rc);
  137. if (!m_rc.PtInRect(pt))
  138. {
  139. KillTimer(1);
  140. CClientDC dc(this);
  141. if (m_bPressU==TRUE)
  142. dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP);
  143. if (m_bPressD==TRUE)
  144. dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN);
  145. }
  146. }
  147. CWnd::OnTimer(nIDEvent);
  148. }
  149. void CGuiOutLook::OnLButtonUp(UINT nFlags, CPoint point) 
  150. {
  151. // TODO: Add your message handler code here and/or call default
  152. CClientDC dc(this);
  153. //------------------------------
  154. if (m_iDrawFrameUp==TRUE)
  155. {
  156. if (m_rectArrowUp.PtInRect(point))
  157. {
  158. m_Avance+=50;
  159. RecalLayout();
  160. }
  161. else
  162. dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP);
  163. }
  164. //-----------------------------
  165. if (m_iDrawFrameDown==TRUE)
  166. {
  167. if (m_rectArrowDown.PtInRect(point))
  168. {
  169. m_Avance-=50;
  170. RecalLayout();
  171. }
  172. else
  173. dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN);
  174. }
  175. //------------------------------
  176. CWnd::OnLButtonUp(nFlags, point);
  177. }
  178. void CGuiOutLook::RecalLayout()
  179. {
  180. static int m_iLastHeigh=0; //se almacena el ultimo valor de altura del area cliente
  181. CRect rect;
  182. CRect m_rectC;
  183. GetClientRect(&m_rectC);
  184. CClientDC dc(this);
  185. int iMitad;
  186. int iMinRequerido=0;
  187. iMitad= m_rectC.Width()/2;
  188. iMitad-=(m_sizeImage.cx/2); //posici髇 a partir del cual se pintan los botones
  189. iMitad--;
  190. m_iDrawFrameUp=FALSE; //dibujar o no los botones arriba 
  191. m_iDrawFrameDown=FALSE;     //y abajo
  192. int m_iNumBotton= m_ArrayButtons.GetSize();
  193. for( int iCont=1; iCont< m_iNumBotton;iCont++)
  194. {
  195. CItems* cit=(CItems*)m_ArrayButtons[iCont];
  196. CSize sz=cit->m_bt->GetSizeButton();
  197. iMinRequerido+=sz.cy+18;
  198. }
  199. int iy=5+m_Avance; //a partir de esta posici髇 se comienza a escribir
  200. //calculo real del espacio que ocuparan los botones
  201. CRect rcMsg;
  202. for( iCont=1; iCont< m_iNumBotton;iCont++)
  203. {
  204. CItems* cit=(CItems*)m_ArrayButtons[iCont];
  205. rect.left=iMitad;
  206. rect.top=iy;
  207. rect.bottom=rect.top+m_sizeImage.cy+6;
  208. rect.right=rect.left+m_sizeImage.cx+6;
  209. cit->m_bt->MoveWindow(rect);
  210. iy+=rect.Height()+18;
  211. }
  212. DeleteDC(dc);
  213. if (iy > m_rectC.Height())
  214. m_iDrawFrameDown=TRUE;
  215. if (m_Avance < 0)
  216. m_iDrawFrameUp=TRUE;
  217. m_iLastHeigh=m_rectC.Height();
  218. Invalidate();
  219. UpdateWindow();
  220. }
  221. void CGuiOutLook::OnSysColorChange() 
  222. {
  223. CWnd::OnSysColorChange();
  224. int m_iNumBotton= m_ArrayButtons.GetSize();
  225. for( int iCont=1; iCont< m_iNumBotton;iCont++)
  226. {
  227. CItems* cit=(CItems*)m_ArrayButtons[iCont];
  228. cit->m_bt->SetColor(GuiDrawLayer::GetRGBColorXP());
  229. }
  230. Invalidate ();
  231. UpdateWindow ();
  232. }
  233. void CGuiOutLook::OnSize(UINT nType, int cx, int cy) 
  234. {
  235. CWnd::OnSize(nType, cx, cy);
  236. if (m_NumBottoms > 0)
  237. RecalLayout();
  238. }
  239. BOOL CGuiOutLook::OnCommand(WPARAM wParam, LPARAM lParam)
  240. {
  241. HWND hwnd = (HWND) lParam;
  242. for (int i=1; i < m_NumBottoms+1;i++)
  243. {
  244. if (((CItems*) m_ArrayButtons [i])->m_bt->m_hWnd== hwnd)
  245. {
  246. int x=((CItems*) m_ArrayButtons [i])->m_bt->GetDlgCtrlID();
  247. CWnd* pParent= GetParent();
  248. pParent->SendMessage (WM_COMMAND,x);
  249. AfxGetMainWnd()->SendMessage(WM_COMMAND,x);
  250. return TRUE;
  251. }
  252. }
  253. return FALSE;
  254. }
  255. void CGuiOutLook::OnPaint() 
  256. {
  257. CPaintDC dc(this); // device context for painting
  258. CRect rect;
  259. GetClientRect(&rect);
  260. CRect rcMsg;
  261. int iy=0;
  262. int m_iNumBotton= m_ArrayButtons.GetSize();
  263. int iMitad= rect.Width()/2;
  264. iMitad-=(m_sizeImage.cx/2); //posici髇 a partir del cual se pintan los botones
  265. iMitad--;
  266. int nMode=dc.SetBkMode(TRANSPARENT);
  267. CFont* cfont = dc.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  268. for( int iCont=1; iCont< m_iNumBotton;iCont++)
  269. {
  270. CItems* cit=(CItems*)m_ArrayButtons[iCont];
  271. CRect rcWin;
  272. cit->m_bt->GetWindowRect(rcWin);
  273. ScreenToClient(rcWin);
  274. rcMsg=rcWin;
  275. rcMsg.top=rcWin.bottom+2;
  276. rcMsg.bottom=rcMsg.top+16;
  277. rcMsg.left=rect.left;
  278. rcMsg.right=rect.right;
  279. dc.DrawText(cit->m_szMessage,rcMsg,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  280. }
  281. dc.SetBkMode(nMode);
  282. dc.SelectObject(cfont);
  283. if (m_iDrawFrameUp==TRUE)
  284. {
  285. m_rectArrowUp.top=5;
  286. m_rectArrowUp.bottom=m_rectArrowUp.top+16;
  287. m_rectArrowUp.right=rect.right-5;
  288. m_rectArrowUp.left=m_rectArrowUp.right-16;
  289. dc.DrawFrameControl(m_rectArrowUp,DFC_SCROLL,DFCS_SCROLLUP);
  290. }
  291. if (m_iDrawFrameDown==TRUE)
  292. {
  293. m_rectArrowDown.bottom=rect.bottom-5;
  294. m_rectArrowDown.top=m_rectArrowDown.bottom-16;
  295. m_rectArrowDown.right=rect.right-5;
  296. m_rectArrowDown.left=m_rectArrowDown.right-16;
  297. dc.DrawFrameControl(m_rectArrowDown,DFC_SCROLL,DFCS_SCROLLDOWN);
  298. }
  299. }
  300. void CGuiOutLook::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
  301. {
  302. CBitmap cbmp;
  303. BITMAP hbmp;
  304. cbmp.LoadBitmap(nBitmapID);
  305. cbmp.GetBitmap(&hbmp);
  306. m_imageList.Create(nBitmapID,cx,nGrow,crMask);
  307. m_imageList.Add(&cbmp,crMask);
  308. m_sizeImage=CSize(cx,hbmp.bmHeight);
  309. }
  310. void  CGuiOutLook::AddItem(UINT Cmd,CString m_szCaption,int nIndex,CString m_ToolTip)
  311. {
  312. CGuiToolButton* m_guib=new CGuiToolButton();
  313. m_NumBottoms++;
  314. m_guib->Create(_T(""), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, 
  315. CRect(0,0,0,0), this, Cmd);
  316. //m_guib->SetColor(GuiDrawLayer::GetRGBColorShadow());
  317. //m_guib->ShowDark(FALSE);
  318. m_ArrayButtons.SetAtGrow(m_NumBottoms, new CItems
  319. (m_guib,m_imageList.ExtractIcon(nIndex),m_szCaption,m_ToolTip));
  320. RecalLayout();
  321. }