ButtonST.cpp
上传用户:clj987822
上传日期:2022-04-25
资源大小:13296k
文件大小:14k
源码类别:

其他智力游戏

开发平台:

Visual C++

  1. // ButtonST.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "RussianGame.h"
  5. #include "ButtonST.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define TOOLTIP_ID 1
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CButtonST
  14. CButtonST::CButtonST()
  15. {
  16. m_MouseOnButton=FALSE;
  17. m_hIconIn=NULL;
  18. m_hIconOut=NULL;
  19. m_cxIcon=0;
  20. m_cyIcon=0;
  21. m_hCursor=NULL;
  22. m_bIsFlat=TRUE;
  23. m_bDrawBorder=TRUE;
  24. m_nAlign=ST_ALIGN_HORIZ;
  25. m_bShowText=TRUE;
  26. m_bDrawFlatFocus=FALSE;
  27. m_strToolTip.Empty();
  28. SetDefaultInactiveBgColor(FALSE);
  29. SetDefaultInactiveFgColor(FALSE);
  30. SetDefaultActiveBgColor(FALSE);
  31. SetDefaultActiveFgColor(FALSE);
  32. }
  33. CButtonST::~CButtonST()
  34. {
  35. if(m_hIconIn!=NULL)::DeleteObject(m_hIconIn);
  36. if(m_hIconOut!=NULL)::DeleteObject(m_hIconOut);
  37. if(m_hCursor!=NULL)::DestroyCursor(m_hCursor);
  38. }
  39. BEGIN_MESSAGE_MAP(CButtonST, CButton)
  40. //{{AFX_MSG_MAP(CButtonST)
  41. ON_WM_CAPTURECHANGED()
  42. ON_WM_SETCURSOR()
  43. ON_WM_MOUSEMOVE()
  44. ON_WM_KILLFOCUS()
  45. //}}AFX_MSG_MAP
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CButtonST message handlers
  49. void CButtonST::AddToolTip(const CString &strTip)
  50. {
  51. m_ctrlToolTip.UpdateTipText(strTip,this,TOOLTIP_ID);
  52. }
  53. void CButtonST::DrawBorder(BOOL bEnable)
  54. {
  55. m_bDrawBorder=bEnable;
  56. }
  57. void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  58. {
  59. #ifdef ST_USE_MEMDC
  60. CDC *pdrawDC=CDC::FromHandle(lpDIS->hDC );
  61. CMemDC memDC(pdrawDC);
  62. CDC *pDC=&memDC;
  63. #else
  64. CDC * pDC=CDC.FromHandle(lpDIS->hDC );
  65. #endif
  66. CPen *pOldPen;
  67. BOOL bIsPressed=(lpDIS->itemState & ODS_SELECTED);
  68. BOOL bIsFocused=(lpDIS->itemState & ODS_FOCUS);
  69. BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
  70.   CRect itemRect = lpDIS->rcItem;
  71.   if (m_bIsFlat == FALSE)
  72.   {
  73.     if (bIsFocused)
  74.     {
  75.       CBrush br(RGB(0,0,0));  
  76.       pDC->FrameRect(&itemRect, &br);
  77.       itemRect.DeflateRect(1, 1);
  78.     }
  79.   }
  80.   // Prepare draw... paint button's area with background color
  81.   COLORREF bgColor;
  82.   if ((m_MouseOnButton == TRUE) || (bIsPressed))
  83.     bgColor = GetActiveBgColor();
  84.   else
  85.     bgColor = GetInactiveBgColor();
  86.   CBrush br(bgColor);
  87.   pDC->FillRect(&itemRect, &br);
  88. // Disegno lo sfondo del bottone
  89. //CBrush br(GetSysColor(COLOR_BTNFACE));  
  90. //pDC->FillRect(&itemRect, &br);
  91.   // Draw pressed button
  92.   if (bIsPressed)
  93.   {
  94.     if (m_bIsFlat == TRUE)
  95.     {
  96.       if (m_bDrawBorder == TRUE)
  97.       {
  98.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco
  99.         CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro
  100. //CPen penBtnShadow(PS_SOLID, 0, RGB(255,0,0));   // Grigio scuro
  101.         // Disegno i bordi a sinistra e in alto
  102.         // Dark gray line
  103.         pOldPen = pDC->SelectObject(&penBtnShadow);
  104.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  105.         pDC->LineTo(itemRect.left, itemRect.top);
  106.         pDC->LineTo(itemRect.right, itemRect.top);
  107.         // Disegno i bordi a destra e in basso
  108.         // White line
  109.         pDC->SelectObject(penBtnHiLight);
  110.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  111.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  112.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  113.         //
  114.         pDC->SelectObject(pOldPen);
  115.       }
  116.     }
  117.     else    
  118.     {
  119.       CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
  120.       pDC->FrameRect(&itemRect, &brBtnShadow);
  121.     }
  122.   }
  123.   else // ...else draw non pressed button
  124.   {
  125.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
  126.     CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
  127.     CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
  128.     CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
  129.     if (m_bIsFlat == TRUE)
  130.     {
  131.       if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
  132.       {
  133.        // Disegno i bordi a sinistra e in alto
  134.         // White line
  135.         pOldPen = pDC->SelectObject(&penBtnHiLight);
  136.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  137.         pDC->LineTo(itemRect.left, itemRect.top);
  138.         pDC->LineTo(itemRect.right, itemRect.top);
  139.         // Disegno i bordi a destra e in basso
  140.         // Dark gray line
  141.         pDC->SelectObject(penBtnShadow);
  142.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  143.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  144.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  145.         //
  146.         pDC->SelectObject(pOldPen);
  147.       }
  148.     }
  149.     else
  150.     {
  151.       // Disegno i bordi a sinistra e in alto
  152.       // White line
  153.       pOldPen = pDC->SelectObject(&penBtnHiLight);
  154.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  155.       pDC->LineTo(itemRect.left, itemRect.top);
  156.       pDC->LineTo(itemRect.right, itemRect.top);
  157.       // Light gray line
  158.       pDC->SelectObject(pen3DLight);
  159.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
  160.       pDC->LineTo(itemRect.left+1, itemRect.top+1);
  161.       pDC->LineTo(itemRect.right, itemRect.top+1);
  162.       // Disegno i bordi a destra e in basso
  163.       // Black line
  164.       pDC->SelectObject(pen3DDKShadow);
  165.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  166.       pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  167.       pDC->LineTo(itemRect.right-1, itemRect.top-1);
  168.       // Dark gray line
  169.       pDC->SelectObject(penBtnShadow);
  170.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
  171.       pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
  172.       pDC->LineTo(itemRect.right-2, itemRect.top);
  173.       //
  174.       pDC->SelectObject(pOldPen);
  175.     }
  176.   }
  177.   // Read the button title
  178.   CString sTitle;
  179.   GetWindowText(sTitle);
  180.   // If we don't want the title displayed
  181.   if (m_bShowText == FALSE) sTitle.Empty();
  182.   CRect captionRect = lpDIS->rcItem;
  183.   // Draw the icon
  184.   if (m_hIconIn != NULL)
  185.   {
  186.     DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
  187.   }
  188.   // Write the button title (if any)
  189.   if (sTitle.IsEmpty() == FALSE)
  190.   {
  191.     // Disegno la caption del bottone
  192.     // Se il bottone e' premuto muovo la captionRect di conseguenza
  193.     if (bIsPressed)
  194.       captionRect.OffsetRect(1, 1);
  195.     
  196.     // ONLY FOR DEBUG 
  197.     // Evidenzia il rettangolo in cui verra' centrata la caption 
  198.     //CBrush brBtnShadow(RGB(255, 0, 0));
  199.     //pDC->FrameRect(&captionRect, &brBtnShadow);
  200. #ifdef ST_USE_MEMDC
  201. // Get dialog's font
  202.     CFont *pCurrentFont = GetFont(); 
  203.     CFont *pOldFont = pDC->SelectObject(pCurrentFont);
  204. #endif
  205.     if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
  206. {
  207.       pDC->SetTextColor(GetActiveFgColor());
  208.       pDC->SetBkColor(GetActiveBgColor());
  209.     } 
  210. else 
  211. {
  212.       pDC->SetTextColor(GetInactiveFgColor());
  213.       pDC->SetBkColor(GetInactiveBgColor());
  214.     }
  215.     // Center text
  216.     CRect centerRect = captionRect;
  217.     pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
  218.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
  219. /* RFU
  220.     captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);
  221.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);
  222. */
  223.     pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  224.                    TRUE, 0, (CBrush*)NULL);
  225. #ifdef ST_USE_MEMDC
  226.     pDC->SelectObject(pOldFont);
  227. #endif
  228.   }
  229.   if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
  230.   {
  231.     // Draw the focus rect
  232.     if (bIsFocused)
  233.     {
  234.       CRect focusRect = itemRect;
  235.       focusRect.DeflateRect(3, 3);
  236.       pDC->DrawFocusRect(&focusRect);
  237.     }
  238.   }
  239. } // End of DrawItem
  240. void CButtonST::DrawTheIcon(CDC *pDC, CString *title, RECT *rcItem, CRect *captionRect, BOOL IsPressed, BOOL IsDisabled)
  241. {
  242. CRect iconRect=rcItem;
  243. switch(m_nAlign)
  244. {
  245. case ST_ALIGN_HORIZ:
  246. if(title->IsEmpty())
  247. {
  248. iconRect.left +=((iconRect.Width()-m_cxIcon)/2);
  249. }
  250. else
  251. {
  252. iconRect.left+=3;
  253. captionRect->left +=m_cxIcon+3;
  254. }
  255. iconRect.top +=((iconRect.Height()-m_cyIcon)/2);
  256. break;
  257. case ST_ALIGN_VERT:
  258. iconRect.left +=((iconRect.Width()-m_cxIcon)/2);
  259. if (title->IsEmpty())
  260. {
  261. iconRect.top +=((iconRect.Height()-m_cyIcon)/2);
  262. }
  263. else
  264. {
  265. captionRect->top +=m_cyIcon;
  266. }
  267. break;
  268. }
  269. if(IsPressed) iconRect.OffsetRect(1,1);
  270. pDC->DrawState(iconRect.TopLeft(),iconRect.Size(),(m_MouseOnButton==TRUE || IsPressed)?m_hIconIn:m_hIconOut,
  271. (IsDisabled? DSS_DISABLED:DSS_NORMAL),(CBrush*)NULL);
  272. }
  273. void CButtonST::OnCaptureChanged(CWnd *pWnd) 
  274. {
  275. if(m_MouseOnButton==TRUE)
  276. {
  277. ReleaseCapture();
  278. Invalidate();
  279. }
  280. // TODO: Add your message handler code here
  281. CButton::OnCaptureChanged(pWnd);
  282. }
  283. BOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  284. {
  285. // TODO: Add your message handler code here and/or call default
  286. if(m_hCursor!=NULL)
  287. {
  288. ::SetCursor(m_hCursor);
  289. return TRUE;
  290. }
  291. return CButton::OnSetCursor(pWnd, nHitTest, message);
  292. }
  293. void CButtonST::OnMouseMove(UINT nFlags, CPoint point) 
  294. {
  295. // TODO: Add your message handler code here and/or call default
  296. CWnd * pWnd;
  297. CWnd* pParent;
  298. CButton::OnMouseMove(nFlags, point);
  299. if(nFlags & MK_LBUTTON && m_MouseOnButton==FALSE)return;
  300. if(m_bIsFlat==FALSE)return;
  301. pWnd=GetActiveWindow();
  302. pParent=GetOwner();
  303. if((GetCapture()!=this) &&
  304. (
  305. #ifndef ST_LIKEIE
  306. pWnd!=NULL &&
  307. #endif
  308. pParent!=NULL))
  309. {
  310. m_MouseOnButton=TRUE;
  311. SetCapture();
  312. Invalidate();
  313. }
  314. else
  315. {
  316. CRect rc;
  317. GetClientRect(&rc);
  318. if(!rc.PtInRect(point))
  319. {
  320. if(m_MouseOnButton==TRUE)
  321. {
  322. m_MouseOnButton=FALSE;
  323. Invalidate();
  324. }
  325. if(!(nFlags & MK_LBUTTON))ReleaseCapture();
  326. }
  327. }
  328. }
  329. void CButtonST::OnKillFocus(CWnd* pNewWnd) 
  330. {
  331. CButton::OnKillFocus(pNewWnd);
  332. if(m_bIsFlat==FALSE)return;
  333. if(m_MouseOnButton==TRUE)
  334. {
  335. m_MouseOnButton=FALSE;
  336. Invalidate();
  337. }
  338. // TODO: Add your message handler code here
  339. }
  340. BOOL CButtonST::GetShowText()
  341. {
  342. return m_bShowText;
  343. }
  344. int CButtonST::GetAlign()
  345. {
  346. return m_nAlign;
  347. }
  348. BOOL CButtonST::GetFlat()
  349. {
  350. return m_bIsFlat;
  351. }
  352. const COLORREF CButtonST::GetActiveBgColor()
  353. {
  354. return m_crActiveBg;
  355. }
  356. const COLORREF CButtonST::GetActiveFgColor()
  357. {
  358. return m_crActiveFg;
  359. }
  360. BOOL CButtonST::GetFlatFocus()
  361. {
  362. return m_bDrawFlatFocus;
  363. }
  364. const COLORREF CButtonST::GetInactiveBgColor()
  365. {
  366. return m_crInactiveBg;
  367. }
  368. const COLORREF CButtonST::GetInactiveFgColor()
  369. {
  370. return m_crInactiveFg;
  371. }
  372. const char * CButtonST::GetVersionC()
  373. {
  374. return "2.3";
  375. }
  376. const short CButtonST::GetVersionI()
  377. {
  378. return 23;
  379. }
  380. void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
  381. {
  382. m_crActiveBg=crNew;
  383. if(bRepaint==TRUE)Invalidate();
  384. }
  385. void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
  386. {
  387. m_crActiveFg=crNew;
  388. if(bRepaint==TRUE)Invalidate();
  389. }
  390. void CButtonST::SetAlign(int nAlign)
  391. {
  392. switch(nAlign)
  393. {
  394. case ST_ALIGN_HORIZ:
  395. m_nAlign=ST_ALIGN_HORIZ;
  396. break;
  397. case ST_ALIGN_VERT:
  398. m_nAlign=ST_ALIGN_VERT;
  399. break;
  400. }
  401. Invalidate();
  402. }
  403. BOOL CButtonST::SetBtnCursor(int nCursorId)
  404. {
  405. HINSTANCE hInstResource;
  406. if(m_hCursor!=NULL)::DestroyCursor(m_hCursor);
  407. m_hCursor=NULL;
  408. if(nCursorId!=-1)
  409. {
  410. hInstResource=AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),RT_GROUP_CURSOR);
  411. m_hCursor=(HCURSOR)::LoadImage(hInstResource,MAKEINTRESOURCE(nCursorId),IMAGE_CURSOR,0,0,0);
  412. if(m_hCursor==NULL)return FALSE;
  413. }
  414. return true;
  415. }
  416. void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
  417. {
  418. m_crActiveBg=::GetSysColor(COLOR_BTNFACE);
  419. if(bRepaint==TRUE)Invalidate();
  420. }
  421. void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
  422. {
  423. m_crActiveFg=::GetSysColor(COLOR_BTNTEXT);
  424. if(bRepaint==TRUE)Invalidate();
  425. }
  426. void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
  427. {
  428. m_crInactiveBg=::GetSysColor(COLOR_BTNFACE);
  429. if(bRepaint==TRUE)Invalidate();
  430. }
  431. void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
  432. {
  433. m_crInactiveFg=::GetSysColor(COLOR_BTNTEXT);
  434. if(bRepaint==TRUE)Invalidate();
  435. }
  436. void CButtonST::SetFlat(BOOL bState)
  437. {
  438. m_bIsFlat=bState;
  439. Invalidate();
  440. }
  441. void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
  442. {
  443. m_bDrawFlatFocus=bDrawFlatFocus;
  444. if(bRepaint==TRUE)Invalidate();
  445. }
  446. void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
  447. {
  448. m_crInactiveBg=crNew;
  449. if(bRepaint==TRUE)Invalidate();
  450. }
  451. void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
  452. {
  453. m_crInactiveFg=crNew;
  454. if(bRepaint==TRUE)Invalidate();
  455. }
  456. void CButtonST::SetShowText(BOOL bShow)
  457. {
  458. m_bShowText=bShow;
  459. Invalidate();
  460. }
  461. void CButtonST::SetIcon(int nIconInId, int nIconOutId,BYTE cx,BYTE cy)
  462. {
  463. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),
  464. RT_GROUP_ICON);
  465. // Set icon when the mouse is IN the button
  466. m_hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
  467.   
  468. // Set icon when the mouse is OUT the button
  469. m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
  470.   
  471. m_cxIcon = cx;
  472. m_cyIcon = cy;
  473. RedrawWindow();
  474. }
  475. void CButtonST::PreSubclassWindow() 
  476. {
  477. // TODO: Add your specialized code here and/or call the base class
  478.   CRect rect;
  479.   GetClientRect ( &rect );
  480.   // Add BS_OWNERDRAW style
  481.   SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
  482.   // Create tooltips
  483.   m_ctrlToolTip.Create ( this );
  484.   m_ctrlToolTip.AddTool ( this, m_strToolTip, rect, TOOLTIP_ID );
  485.   
  486. CButton::PreSubclassWindow();
  487. }