1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
#include <mxtk/mx.h>
#include "utlvector.h"
//-----------------------------------------------------------------------------
// Purpose: Helper class that automagically sets up and destroys a memory device-
// context for flicker-free refershes
//-----------------------------------------------------------------------------
class CDrawHelper
{
public:
// Construction/destruction
CDrawHelper( mxWindow *widget);
CDrawHelper( mxWindow *widget, COLORREF bgColor );
CDrawHelper( mxWindow *widget, int x, int y, int w, int h, COLORREF bgColor );
CDrawHelper( mxWindow *widget, RECT& bounds );
CDrawHelper( mxWindow *widget, RECT& bounds, COLORREF bgColor );
virtual ~CDrawHelper( void );
// Allow caller to draw onto the memory dc, too
HDC GrabDC( void );
// Compute text size
static int CalcTextWidth( const char *font, int pointsize, int weight, PRINTF_FORMAT_STRING const char *fmt, ... );
static int CalcTextWidth( HFONT font, PRINTF_FORMAT_STRING const char *fmt, ... );
int CalcTextWidthW( const char *font, int pointsize, int weight, PRINTF_FORMAT_STRING const wchar_t *fmt, ... );
int CalcTextWidthW( HFONT font, PRINTF_FORMAT_STRING const wchar_t *fmt, ... );
void DrawColoredTextW( const char *font, int pointsize, int weight, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const wchar_t *fmt, ... );
void DrawColoredTextW( HFONT font, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const wchar_t *fmt, ... );
void DrawColoredTextCharsetW( const char *font, int pointsize, int weight, DWORD charset, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const wchar_t *fmt, ... );
void CalcTextRect( const char *font, int pointsize, int weight, int maxwidth, RECT& rcText, PRINTF_FORMAT_STRING const char *fmt, ... );
// Draw text
void DrawColoredText( const char *font, int pointsize, int weight, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const char *fmt, ... );
void DrawColoredText( HFONT font, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const char *fmt, ... );
void DrawColoredTextCharset( const char *font, int pointsize, int weight, DWORD charset, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const char *fmt, ... );
void DrawColoredTextMultiline( const char *font, int pointsize, int weight, COLORREF clr, RECT& rcText, PRINTF_FORMAT_STRING const char *fmt, ... );
// Draw a line
void DrawColoredLine( COLORREF clr, int style, int width, int x1, int y1, int x2, int y2 );
void DrawColoredPolyLine( COLORREF clr, int style, int width, CUtlVector< POINT >& points );
// Draw a blending ramp
POINTL DrawColoredRamp( COLORREF clr, int style, int width, int x1, int y1, int x2, int y2, float rate, float sustain );
// Draw a filled rect
void DrawFilledRect( COLORREF clr, int x1, int y1, int x2, int y2 );
// Draw an outlined rect
void DrawOutlinedRect( COLORREF clr, int style, int width, int x1, int y1, int x2, int y2 );
void DrawOutlinedRect( COLORREF clr, int style, int width, RECT& rc );
void DrawFilledRect( HBRUSH br, RECT& rc );
void DrawFilledRect( COLORREF clr, RECT& rc );
void DrawGradientFilledRect( RECT& rc, COLORREF clr1, COLORREF clr2, bool vertical );
void DrawLine( int x1, int y1, int x2, int y2, COLORREF clr, int thickness );
// Draw a triangle
void DrawTriangleMarker( RECT& rc, COLORREF fill, bool inverted = false );
void DrawCircle( COLORREF clr, int x, int y, int radius, bool filled = true );
// Get width/height of draw area
int GetWidth( void );
int GetHeight( void );
// Get client rect for drawing
void GetClientRect( RECT& rc );
void StartClipping( RECT& clipRect );
void StopClipping( void );
// Remap rect if we're using a clipped viewport
void OffsetSubRect( RECT& rc );
private:
// Internal initializer
void Init( mxWindow *widget, int x, int y, int w, int h, COLORREF bgColor);
void ClipToRects( void );
// The window we are drawing on
HWND m_hWnd;
// The final DC
HDC m_dcReal;
// The working DC
HDC m_dcMemory;
// Client area and offsets
RECT m_rcClient;
int m_x, m_y;
int m_w, m_h;
// Bitmap for drawing in the memory DC
HBITMAP m_bmMemory;
HBITMAP m_bmOld;
// Remember the original default color
COLORREF m_clrOld;
CUtlVector < RECT > m_ClipRects;
HRGN m_ClipRegion;
};
|