Separator.cpp
上传用户:hnhkjn
上传日期:2007-01-02
资源大小:13k
文件大小:6k
源码类别:

Static控件

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Separator.cpp : source file for CSeparator.
  3. //
  4. // Written by Michael Dunn (mdunn at inreach dot com).  Copyright and all
  5. // that stuff.  Use however you like but give me credit where it's due.  I'll
  6. // know if you don't. bwa ha ha ha ha!
  7. //
  8. /////////////////////////////////////////////////////////////////////////////
  9. #include "stdafx.h"
  10. #include "Separator.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CSeparator
  18. CSeparator::CSeparator()
  19. {
  20. }
  21. CSeparator::~CSeparator()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CSeparator, CStatic)
  25. //{{AFX_MSG_MAP(CSeparator)
  26. ON_WM_PAINT()
  27. //}}AFX_MSG_MAP
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CSeparator message handlers
  31. // This function draws the horizontal line, followed by the text. The general
  32. // idea for the line drawing comes from Hans Buehler's article at
  33. // http://www.codeguru.com/staticctrl/draw_bevel.shtml
  34. //
  35. // Note that this class is intended to be just a simple separator, so the
  36. // only static styles I implement here are SS_LEFT, SS_CENTER, SS_RIGHT, and
  37. // SS_NOPREFIX.  Also note that the line is always drawn vertically centered
  38. // in the control, so if you make the control tall enough you can get the 
  39. // text totally above the line.
  40. void CSeparator::OnPaint() 
  41. {
  42. CPaintDC dc(this);                      // device context for painting
  43. CRect    rectWnd;                       // RECT of the static control
  44. CRect    rectText;                      // RECT in which text will be drawn
  45. CString  cstrText;                      // text to draw
  46. CFont*   pfontOld;
  47. UINT     uFormat;                       // format for CDC::DrawText()
  48. DWORD    dwStyle = GetStyle();          // this window's style
  49.     // Get the screen & client coords.
  50.     GetWindowRect ( rectWnd );
  51.     GetClientRect ( rectText );
  52.     // If the control is taller than it is wide, draw a vertical line.
  53.     // No text is drawn in this case.
  54.     if ( rectWnd.Height() > rectWnd.Width() )
  55.         {
  56.         dc.Draw3dRect( 
  57.             rectWnd.Width()/2, 0,       // upper-left point
  58.             2, rectWnd.Height(),        // width & height  
  59.             ::GetSysColor(COLOR_3DSHADOW),
  60.             ::GetSysColor(COLOR_3DHIGHLIGHT) );
  61.         /************************************************************
  62.         If you feel adventurous, here is the code to do vertical text
  63.         drawing.  I have it commented out because getting the text
  64.         aligned correctly over the line looks like it'll be a pain.
  65.         // Start by getting this control's font, and then tweak it a bit.
  66.         LOGFONT lf;
  67.         GetFont()->GetObject ( sizeof(LOGFONT), &lf );
  68.         // Text will be rotated counter-clockwise 90 degrees.
  69.         lf.lfOrientation = lf.lfEscapement = 900;
  70.         // We need a TrueType font to get rotated text.  MS Sans Serif
  71.         // won't cut it!
  72.         lstrcpy ( lf.lfFaceName, _T("Tahoma") );
  73.         // Create a font with the tweaked attributes.
  74.         CFont font;
  75.         font.CreateFontIndirect ( &lf );
  76.         pfontOld = dc.SelectObject ( &font );
  77.         dc.SetBkColor ( ::GetSysColor(COLOR_BTNFACE) );
  78.         GetWindowText ( cstrText );
  79.         dc.DrawText ( cstrText, rectText,
  80.                       DT_VCENTER | DT_CENTER | DT_SINGLELINE );
  81.         dc.SelectObject ( pfontOld );
  82.         font.DeleteObject();
  83.         ************************************************************/
  84.         }
  85.     else
  86.         {
  87.         // We're drawing a horizontal separator.
  88.         // The text will always be at the top of the control.  Also check
  89.         // if the SS_NOPREFIX style is set.                                        
  90.         uFormat = DT_TOP;
  91.         if ( dwStyle & SS_NOPREFIX )
  92.             {
  93.             uFormat |= DT_NOPREFIX;
  94.             }
  95.         // Voila!  One 3D line coming up.
  96.         dc.Draw3dRect (
  97.             0, rectWnd.Height()/2,      // upper-left point
  98.             rectWnd.Width(), 2,         // width & height
  99.             ::GetSysColor(COLOR_3DSHADOW),
  100.             ::GetSysColor(COLOR_3DHIGHLIGHT) );
  101.         // Now get the text to be drawn.  I add two spaces to the string
  102.         // to make a bit of space between the end of the line and the text.
  103.         // Space is added to one or both ends of the text as appropriate.
  104.         // Along the way, I add another formatting flag to uFormat.
  105.         GetWindowText ( cstrText );
  106.         if ( dwStyle & SS_CENTER )
  107.             {
  108.             cstrText = _T("  ") + cstrText;
  109.             cstrText += _T("  ");
  110.             uFormat |= DT_CENTER;
  111.             }
  112.         else if ( dwStyle & SS_RIGHT )
  113.             {
  114.             cstrText = _T("  ") + cstrText;
  115.             uFormat |= DT_RIGHT;
  116.             }
  117.         else
  118.             {
  119.             cstrText += _T("  ");
  120.         
  121.             uFormat |= DT_LEFT;
  122.             }
  123.         // Get the font for the text.
  124.     
  125.         pfontOld = dc.SelectObject ( GetFont() );
  126.         // Set the background color to the same as the dialog, so the text
  127.         // will be opaque.  This erases all traces of the 3D line as the
  128.         // text is drawn over it.  (No need to call CDC::SetBkMode() because
  129.         // the default mode for a DC is opaque.)
  130.         dc.SetBkColor ( ::GetSysColor(COLOR_BTNFACE) );
  131.         dc.DrawText ( cstrText, rectText, uFormat );
  132.         // Clean up GDI objects like a good lil' programmer.
  133.         dc.SelectObject ( pfontOld );
  134.         }
  135. }