-
Notifications
You must be signed in to change notification settings - Fork 0
/
BitmapViewer.cpp
130 lines (104 loc) · 3.39 KB
/
BitmapViewer.cpp
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// BitmapViewer.cpp : implementation file
//
#include "stdafx.h"
#include "CustomControlDemo.h"
#include "BitmapViewer.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBitmapViewer
CBitmapViewer::CBitmapViewer()
{
RegisterWindowClass();
}
CBitmapViewer::~CBitmapViewer()
{
}
// Register the window class if it has not already been registered.
BOOL CBitmapViewer::RegisterWindowClass()
{
WNDCLASS wndcls;
HINSTANCE hInst = AfxGetInstanceHandle();
if (!(::GetClassInfo(hInst, BITMAPVIEWER_CLASSNAME, &wndcls)))
{
// otherwise we need to register a new class
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
wndcls.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = BITMAPVIEWER_CLASSNAME;
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
BEGIN_MESSAGE_MAP(CBitmapViewer, CWnd)
//{{AFX_MSG_MAP(CBitmapViewer)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBitmapViewer message handlers
void CBitmapViewer::OnPaint()
{
// Draw the bitmap - if we have one.
if (m_Bitmap.GetSafeHandle() != NULL)
{
CPaintDC dc(this); // device context for painting
// Create memory DC
CDC MemDC;
if (!MemDC.CreateCompatibleDC(&dc))
return;
// Get Size of Display area
CRect rect;
GetClientRect(rect);
// Get size of bitmap
BITMAP bm;
m_Bitmap.GetBitmap(&bm);
// Draw the bitmap
CBitmap* pOldBitmap = (CBitmap*) MemDC.SelectObject(&m_Bitmap);
dc.StretchBlt(0, 0, rect.Width(), rect.Height(),
&MemDC,
0, 0, bm.bmWidth, bm.bmHeight,
SRCCOPY);
MemDC.SelectObject(pOldBitmap);
}
// Do not call CWnd::OnPaint() for painting messages
}
BOOL CBitmapViewer::OnEraseBkgnd(CDC* pDC)
{
// If we have an image then don't perform any erasing, since the OnPaint
// function will simply draw over the background
if (m_Bitmap.GetSafeHandle() != NULL)
return TRUE;
// Obviously we don't have a bitmap - let the base class deal with it.
return CWnd::OnEraseBkgnd(pDC);
}
void CBitmapViewer::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
// In our case this is not needed - yet - so just drop through to
// the base class
CWnd::PreSubclassWindow();
}
/////////////////////////////////////////////////////////////////////////////
// CBitmapViewer methods
BOOL CBitmapViewer::Create(CWnd* pParentWnd, const RECT& rect, UINT nID, DWORD dwStyle /*=WS_VISIBLE*/)
{
return CWnd::Create(BITMAPVIEWER_CLASSNAME, _T(""), dwStyle, rect, pParentWnd, nID);
}
BOOL CBitmapViewer::SetBitmap(UINT nIDResource)
{
return m_Bitmap.LoadBitmap(nIDResource);
}