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

对话框与窗口

开发平台:

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