GuiMiniFrameWnd.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.  * *
  21.  ****************************************************************************/
  22. #include "stdafx.h"
  23. #include "GuiMiniFrameWnd.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. // CGuiMiniFrameWnd
  32. #define NORMAL 0 
  33. #define OVER   1
  34. #define PRESS  2
  35. IMPLEMENT_DYNCREATE(CGuiMiniFrameWnd, CMiniFrameWnd)
  36. CGuiMiniFrameWnd::CGuiMiniFrameWnd()
  37. {
  38. pControl=NULL;
  39. m_stateBtn=NORMAL;
  40. bDestroy=FALSE;
  41. bClick=FALSE;
  42. nSizeLine=0;
  43. }
  44. CGuiMiniFrameWnd::~CGuiMiniFrameWnd()
  45. {
  46. }
  47. BEGIN_MESSAGE_MAP(CGuiMiniFrameWnd, CMiniFrameWnd)
  48. //{{AFX_MSG_MAP(CGuiMiniFrameWnd)
  49. // NOTE - the ClassWizard will add and remove mapping macros here.
  50. ON_WM_NCLBUTTONDOWN()
  51. // ON_WM_NCLBUTTONDBLCLK()
  52. ON_WM_NCMOUSEMOVE()
  53. ON_WM_NCHITTEST()
  54. //}}AFX_MSG_MAP
  55. ON_WM_CLOSE()
  56. ON_WM_NCPAINT()
  57. ON_WM_SIZE()
  58. ON_WM_ACTIVATE()
  59. ON_WM_CANCELMODE()
  60. ON_WM_NCACTIVATE()
  61. ON_WM_PAINT()
  62. ON_WM_TIMER()
  63. ON_WM_SETFOCUS()
  64. ON_WM_NCCALCSIZE()
  65. ON_WM_NCLBUTTONDOWN()
  66. ON_WM_SETFOCUS()
  67. END_MESSAGE_MAP()
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CGuiMiniFrameWnd message handlers
  70. void CGuiMiniFrameWnd::OnNcPaint()
  71. {
  72. // TODO: Add your message handler code here
  73. CRect rcWindow;
  74. CRect rcClient;
  75. CWindowDC dc(this);
  76. CDC m_dc; //contexto de dispositivo en memoria
  77. CBitmap m_bitmap;
  78. //la idea es tomar el area de la ventana y area  cliente , luego debemos
  79. //igualar el area de coordenadas de ventana al cliente
  80. GetWindowRect(&rcWindow);
  81. GetClientRect(&rcClient);
  82. int nSize=rcClient.right;
  83. ScreenToClient(rcWindow);
  84.     rcClient.OffsetRect(-rcWindow.TopLeft());
  85.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  86.   
  87. m_dc.CreateCompatibleDC(&dc);
  88. m_bitmap.CreateCompatibleBitmap(&dc,rcWindow.Width(),rcWindow.Height());
  89. CBitmap *m_OldBitmap=m_dc.SelectObject(&m_bitmap);
  90. //aqui debe utilizarse la brocha que define GuiDrawLayer, si no hacemos la siguiente
  91. //linea usted vera un horrible color negro, a cambio del dibujo.
  92. CBrush cb;
  93. cb.CreateSolidBrush(!bClick? GuiDrawLayer::GetRGBMenu(): GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));
  94. m_dc.FillRect(rcWindow, &cb);
  95. CRect rcCaption=rcClient;
  96. rcCaption.InflateRect(1,1);
  97. dc.Draw3dRect(rcCaption,GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorBTNHigh());
  98. DrawGripper(&m_dc,&rcClient);
  99. dc.IntersectClipRect(rcWindow);
  100.     dc.ExcludeClipRect(rcClient);//asi evitamos el parpadeo
  101. //rcWindow.InflateRect(1,1);
  102. dc.BitBlt(rcWindow.left,rcWindow.top,rcWindow.Width(),rcWindow.Height(),&m_dc,0,0,SRCCOPY);
  103. ReleaseDC(&dc);
  104. m_dc.SelectObject(m_OldBitmap);
  105. m_bitmap.DeleteObject();
  106. m_dc.DeleteDC();
  107. //CMiniFrameWnd::OnNcPaint();
  108. }
  109. void CGuiMiniFrameWnd::DrawGripper(CDC* pDC,CRect* rc)
  110. {
  111. CRect gripper = rc;
  112. gripper.top =3;
  113. gripper.left-=1;
  114. gripper.right+=2;
  115. gripper.bottom +=2;
  116. if (gripper.right < 0) return;
  117. int nCaption=::GetSystemMetrics(SM_CYSMCAPTION);
  118. //si la ventana esta activa pintamos el caption o el area del titulo de color azul 
  119. CBrush cb;
  120. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow());//GuiDrawLayer::GetRGBCaptionXP());
  121. pDC->Draw3dRect(gripper,GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  122. if (!bClick)
  123. {
  124. CRect rcLineLeft=gripper;
  125. CBrush cb1;
  126. cb1.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));//GuiDrawLayer::GetRGBCaptionXP());
  127. rcLineLeft.top=-1;
  128. rcLineLeft.right=rcLineLeft.left+nSizeLine;
  129. rcLineLeft.bottom=1;
  130. pDC->Draw3dRect(rcLineLeft,GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  131. gripper.top-=2;
  132. pDC->FillRect(gripper,&cb1);
  133. rcLineLeft=gripper;
  134. rcLineLeft.top+=1;
  135. rcLineLeft.left+=2;
  136. rcLineLeft.right-=1;
  137. rcLineLeft.bottom-=1;
  138. pDC->Draw3dRect(rcLineLeft,GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorBTNHigh());
  139. //------------- draw minigripper ------------------
  140.    int ncalc=gripper.Width()/2;
  141.    ncalc-=5;
  142.    CRect rcgri=gripper;
  143.    rcgri.top+=5;
  144.    rcgri.left=ncalc;
  145.    rcgri.right=rcgri.left+20;
  146.    rcgri.bottom=rcgri.top+1;
  147.    pDC->Draw3dRect(rcgri,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorShadow());
  148.    rcgri.top+=2;
  149.    rcgri.bottom=rcgri.top+1;
  150.    pDC->Draw3dRect(rcgri,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorShadow());
  151. //-------------------------------------------------
  152. return;
  153. }
  154. CRect rcLineLeft=gripper;
  155. rcLineLeft.top+=nCaption+2;
  156. rcLineLeft.left+=2;
  157. rcLineLeft.right-=1;
  158. rcLineLeft.bottom-=1;
  159. pDC->Draw3dRect(rcLineLeft,GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  160. gripper.DeflateRect(1, 1);
  161. CString m_caption;
  162. GetWindowText(m_caption);
  163. CFont m_cfont;
  164. m_cfont.CreateFont(-11,0,0,0,FW_BOLD,0,0,0,0,1,2,1,34,_T("Verdana"));
  165. CFont* m_fontOld=pDC->SelectObject(&m_cfont);
  166. int nMode = pDC->SetBkMode(TRANSPARENT);
  167. CSize SizeCad=pDC->GetTextExtent(m_caption);
  168. CRect rCText=gripper;
  169. rCText.top=6;
  170. rCText.bottom =rCText.top+14;
  171. int cont=SizeCad.cx;
  172. while(cont > 1 && gripper.Width() > 0)
  173. {
  174. CSize coor=pDC->GetTextExtent(m_caption,m_caption.GetLength());
  175. if(coor.cx > gripper.Width()-10)
  176. {
  177. m_caption=m_caption.Left(m_caption.GetLength()-1);
  178. }
  179. else
  180. break;
  181. cont--;
  182. }
  183. if (gripper.Width() > 0 )
  184. {
  185. pDC->SetTextColor(GuiDrawLayer::GetRGBTitleMenu());
  186. pDC->TextOut(rCText.left+3,rCText.top,m_caption);
  187. }
  188. //CRect gripper;
  189. //------------------------------------------------
  190. GetWindowRect( gripper );
  191. ScreenToClient( gripper );
  192. gripper.OffsetRect( -gripper.left, -gripper.top );
  193. gripper.left=gripper.right-20;
  194. gripper.right-=4;
  195. gripper.top+=4;
  196. gripper.bottom=gripper.top+nCaption;
  197. m_rcCloseBtn=gripper;
  198. if (m_stateBtn==NORMAL)
  199. m_btn.Paint(pDC,m_stateBtn,gripper,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));
  200. else if (m_stateBtn==OVER)
  201. m_btn.Paint(pDC,m_stateBtn,gripper,GuiDrawLayer::GetRGBFondoXP());
  202. else
  203. m_btn.Paint(pDC,m_stateBtn,gripper,GuiDrawLayer::GetRGBPressBXP());
  204. pDC->SetBkMode(nMode);
  205. pDC->SelectObject(m_fontOld);
  206. }
  207. void CGuiMiniFrameWnd::OnClose()
  208. {
  209. OnCancelMode();
  210. }
  211. BOOL CGuiMiniFrameWnd::Create(CWnd* pParentWnd,CWnd* pControl1,const RECT& rc,LPCTSTR lpszWindowName,int nSize)
  212. {
  213. // TODO: Add your specialized code here and/or call the base class
  214. pControl=pControl1;
  215. pParent=pParentWnd;
  216. nSizeLine=nSize;
  217. if (pControl->IsWindowVisible()) 
  218. {
  219. delete this;
  220. return false;
  221. }
  222. LPCTSTR lpszClassName=::AfxRegisterWndClass(CS_DBLCLKS,
  223. ::LoadCursor(NULL,IDC_ARROW),
  224. ::GetSysColorBrush(COLOR_BTNFACE),
  225. NULL);
  226. dwStyle = WS_POPUP|MFS_SYNCACTIVE|MFS_MOVEFRAME|MFS_4THICKFRAME;
  227. m_btn.SetData(6,_T("Close"));
  228. m_btn.SetImageList(IDB_GUI_DOCKBAR,9,10,RGB(255,0,255));
  229. m_btn.SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
  230. CPoint pt (rc.left, rc.bottom);
  231. CRect rcCtrl;
  232. pControl->GetWindowRect(rcCtrl);
  233. BOOL bResp= CMiniFrameWnd::Create(NULL, lpszWindowName,dwStyle, CRect (pt.x, pt.y-2, rc.left+rcCtrl.Width(), rc.top+rcCtrl.Height()), pControl1->GetParentFrame(), 0);
  234. pControl->SetWindowPos (NULL, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_SHOWWINDOW);
  235. pControl->SetParent (this);
  236. pControl->ShowWindow(SW_SHOW);
  237. ShowWindow (SW_SHOW);
  238. SetTimer(1010,100,NULL);
  239. SendMessage(WM_SIZE);
  240. if (!bResp) return FALSE;
  241. return TRUE;
  242. }
  243. BOOL CGuiMiniFrameWnd::PreTranslateMessage(MSG* pMsg)
  244. {
  245. // TODO: Add your specialized code here and/or call the base class
  246. if (!bClick) 
  247. switch ( pMsg->message )
  248.     {
  249.         case WM_KEYDOWN:
  250.             // Default action for <Escape> key
  251.             if ( pMsg->wParam == VK_ESCAPE )
  252.             {
  253. bClick=TRUE;
  254. pParent->UnlockWindowUpdate();
  255. pParent->Invalidate();
  256. pParent->UpdateWindow();
  257.             OnCancelMode();
  258. pParent->SetFocus();
  259. PostMessage (WM_DESTROY);
  260. DestroyWindow();
  261. bDestroy=TRUE;
  262. return TRUE;
  263.                 
  264.             }
  265.             break;
  266.         case WM_LBUTTONUP:
  267. bClick=TRUE;
  268. pParent->UnlockWindowUpdate();
  269. pParent->Invalidate();
  270. pParent->UpdateWindow();
  271. CWnd* pBar = GetWindow( GW_CHILD );
  272. if( pBar == NULL ) return FALSE;
  273. long rt=pBar->SendMessage(pMsg->wParam,pMsg->lParam);
  274. OnCancelMode();
  275. DestroyWindow();
  276. //KillTimer(8889);
  277. return FALSE;
  278. break;
  279.  }
  280. return CMiniFrameWnd::PreTranslateMessage(pMsg);
  281. }
  282. void CGuiMiniFrameWnd::PostNcDestroy()
  283. {
  284. // TODO: Add your specialized code here and/or call the base class
  285.  bDestroy=TRUE;
  286.  delete this;
  287. }
  288. void CGuiMiniFrameWnd::RecalLayout()
  289. {
  290. CRect rc;
  291. CWnd* pBar = GetWindow( GW_CHILD );
  292.     if( pBar == NULL ) return ;
  293. pBar->GetWindowRect(&rc);
  294. CRect rcWin;
  295. GetWindowRect(&rcWin);
  296. rc.left=rcWin.left;
  297. rc.top=rcWin.top;
  298. rc.right+=3;
  299. rc.bottom+=3;
  300. MoveWindow(rc);
  301. }
  302. void CGuiMiniFrameWnd::OnSize(UINT nType, int cx, int cy)
  303. {
  304. CMiniFrameWnd::OnSize(nType, cx, cy);
  305. RecalLayout();
  306. // TODO: Add your message handler code here
  307. }
  308. void CGuiMiniFrameWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  309. {
  310. CMiniFrameWnd::OnActivate(nState, pWndOther, bMinimized);
  311. if ( nState == WA_INACTIVE && !bClick)
  312.     {
  313. bClick=TRUE;
  314. pParent->UnlockWindowUpdate();
  315. pParent->Invalidate();
  316. pParent->UpdateWindow();
  317. OnCancelMode();
  318. PostMessage (WM_DESTROY);
  319. DestroyWindow();
  320. return ;
  321.     }
  322. else
  323. RecalLayout();
  324. // TODO: Add your message handler code here
  325. }
  326. void CGuiMiniFrameWnd::OnCancelMode()
  327. {
  328. pControl->ShowWindow(SW_HIDE);
  329. pControl->SetParent (pParent);
  330. // TODO: Add your message handler code here
  331. }
  332. BOOL CGuiMiniFrameWnd::OnNcActivate(BOOL bActive)
  333. {
  334. // TODO: Add your message handler code here and/or call default
  335. BOOL bNc=CMiniFrameWnd::OnNcActivate(bActive);
  336. RecalLayout();
  337. SendMessage( WM_NCPAINT );
  338. return bNc;
  339. }
  340. void CGuiMiniFrameWnd::OnPaint()
  341. {
  342. CPaintDC dc(this); // device context for painting
  343. SendMessage( WM_NCPAINT );
  344. // TODO: Add your message handler code here
  345. // Do not call CMiniFrameWnd::OnPaint() for painting messages
  346. }
  347. void CGuiMiniFrameWnd::OnTimer(UINT nIDEvent)
  348. {
  349. // TODO: Add your message handler code here and/or call default
  350. if (nIDEvent==8889)
  351. {
  352. OnCancelMode();
  353. pParent->SetFocus();
  354. PostMessage (WM_DESTROY);
  355. DestroyWindow();
  356. bDestroy=TRUE;
  357. return;
  358. }
  359. if (m_stateBtn==NORMAL) return;
  360. CRect rc;
  361. CPoint pt(GetMessagePos());
  362. CRect rcT=m_rcCloseBtn;
  363. ClientToScreen(rcT);
  364. pt.y+=23;
  365. pt.x+=5;
  366. if (!rcT.PtInRect(pt))
  367. {
  368. m_stateBtn=NORMAL;
  369. KillTimer(1010);
  370. SendMessage(WM_NCPAINT); 
  371. }
  372. CMiniFrameWnd::OnTimer(nIDEvent);
  373. }
  374. void CGuiMiniFrameWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
  375. {
  376. // TODO: Add your message handler code here and/or call default
  377. if (bClick==TRUE)
  378. {
  379. lpncsp->rgrc[0].top +=19;
  380. lpncsp->rgrc[0].right-=1;
  381. lpncsp->rgrc[0].bottom-=1;
  382. }
  383. else
  384. {
  385. lpncsp->rgrc[0].top +=9;
  386. lpncsp->rgrc[0].left-=1;
  387. }
  388. CMiniFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
  389. }
  390. void CGuiMiniFrameWnd::OnSetFocus(CWnd* pOldWnd)
  391. {
  392. SendMessage(WM_NCACTIVATE);
  393. CMiniFrameWnd::OnSetFocus(pOldWnd);
  394. // TODO: Add your message handler code here
  395. }
  396. UINT CGuiMiniFrameWnd::OnNcHitTest(CPoint point)
  397. {
  398. // TODO: Add your message handler code here and/or call default
  399. CRect rcWindow;
  400. //no se convierte las coordenadas de pantalla porque el punto
  401. //entregado por esta funci髇 esta dado en el mismo sentido.
  402. GetWindowRect(rcWindow);
  403. int it=0;
  404. CRect rcT=m_rcCloseBtn;
  405. ClientToScreen(rcT);
  406. CPoint pt=point;
  407. pt.y+=23;
  408. pt.x+=5;
  409. if (rcT.PtInRect(pt))
  410. return HTCLOSE;
  411. else
  412. return HTCAPTION;
  413. return CMiniFrameWnd::OnNcHitTest(point);
  414. }
  415. void CGuiMiniFrameWnd::OnNcMouseMove(UINT nHitTest, CPoint point)
  416. {
  417. // TODO: Add your message handler code here and/or call default
  418.         
  419. if (m_stateBtn != NORMAL) return;
  420. if (nHitTest == HTCLOSE)
  421. {
  422. m_stateBtn=OVER;
  423. SetTimer(1,100,0);
  424. SendMessage(WM_NCPAINT);
  425. }
  426. else if (nHitTest == HTCAPTION && !bClick)
  427. {
  428. SetCursor (LoadCursor(NULL, IDC_SIZEALL));
  429. }
  430. CMiniFrameWnd::OnNcMouseMove(nHitTest, point);
  431. }
  432. void CGuiMiniFrameWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
  433. {
  434. if (bClick==FALSE)
  435. {
  436. pParent->UnlockWindowUpdate();
  437. pParent->Invalidate();
  438. pParent->UpdateWindow();
  439. bClick=TRUE;
  440. dwStyle|=MFS_MOVEFRAME|MFS_4THICKFRAME;
  441. CRect rc;
  442. GetWindowRect(rc);
  443. rc.DeflateRect(1,1);
  444. MoveWindow(rc);
  445. }
  446. if (nHitTest == HTCLOSE)
  447. {
  448. m_stateBtn=PRESSBTN;
  449. OnCancelMode();
  450. DestroyWindow();
  451. return;
  452. }
  453. SetCursor (LoadCursor(NULL, IDC_SIZEALL));
  454. SendMessage(WM_NCPAINT);
  455. CMiniFrameWnd::OnNcLButtonDown(nHitTest, point);
  456. }