rlm@1
|
1 // BitmapControl.cpp : implementation file
|
rlm@1
|
2 //
|
rlm@1
|
3
|
rlm@1
|
4 #include "stdafx.h"
|
rlm@1
|
5 #include "BitmapControl.h"
|
rlm@1
|
6
|
rlm@1
|
7 bool BitmapControl::isRegistered = false;
|
rlm@1
|
8
|
rlm@1
|
9 /////////////////////////////////////////////////////////////////////////////
|
rlm@1
|
10 // BitmapControl
|
rlm@1
|
11
|
rlm@1
|
12 IMPLEMENT_DYNCREATE(BitmapControl, CScrollView)
|
rlm@1
|
13
|
rlm@1
|
14 BitmapControl::BitmapControl()
|
rlm@1
|
15 {
|
rlm@1
|
16 w = 0;
|
rlm@1
|
17 h = 0;
|
rlm@1
|
18 data = NULL;
|
rlm@1
|
19 bmpInfo = NULL;
|
rlm@1
|
20 stretch = false;
|
rlm@1
|
21 registerClass();
|
rlm@1
|
22 CSize sizeTotal;
|
rlm@1
|
23 sizeTotal.cx = sizeTotal.cy = 0;
|
rlm@1
|
24 SetScrollSizes(MM_TEXT, sizeTotal);
|
rlm@1
|
25 }
|
rlm@1
|
26
|
rlm@1
|
27 BitmapControl::~BitmapControl()
|
rlm@1
|
28 {
|
rlm@1
|
29 }
|
rlm@1
|
30
|
rlm@1
|
31
|
rlm@1
|
32 BEGIN_MESSAGE_MAP(BitmapControl, CScrollView)
|
rlm@1
|
33 //{{AFX_MSG_MAP(BitmapControl)
|
rlm@1
|
34 ON_WM_ERASEBKGND()
|
rlm@1
|
35 ON_WM_SIZE()
|
rlm@1
|
36 ON_WM_LBUTTONDOWN()
|
rlm@1
|
37 //}}AFX_MSG_MAP
|
rlm@1
|
38 END_MESSAGE_MAP()
|
rlm@1
|
39
|
rlm@1
|
40 /////////////////////////////////////////////////////////////////////////////
|
rlm@1
|
41 // BitmapControl drawing
|
rlm@1
|
42
|
rlm@1
|
43 void BitmapControl::OnInitialUpdate()
|
rlm@1
|
44 {
|
rlm@1
|
45 CScrollView::OnInitialUpdate();
|
rlm@1
|
46
|
rlm@1
|
47 CSize sizeTotal;
|
rlm@1
|
48 // TODO: calculate the total size of this view
|
rlm@1
|
49 sizeTotal.cx = sizeTotal.cy = 100;
|
rlm@1
|
50 SetScrollSizes(MM_TEXT, sizeTotal);
|
rlm@1
|
51 }
|
rlm@1
|
52
|
rlm@1
|
53 void BitmapControl::OnDraw(CDC* dc)
|
rlm@1
|
54 {
|
rlm@1
|
55 RECT r;
|
rlm@1
|
56 GetClientRect(&r);
|
rlm@1
|
57 int w1 = r.right - r.left;
|
rlm@1
|
58 int h1 = r.bottom - r.top;
|
rlm@1
|
59 CDC memDC;
|
rlm@1
|
60 memDC.CreateCompatibleDC(dc);
|
rlm@1
|
61 if(!stretch) {
|
rlm@1
|
62 if(w > w1)
|
rlm@1
|
63 w1 = w;
|
rlm@1
|
64 if(h > h1)
|
rlm@1
|
65 h1 = h;
|
rlm@1
|
66 }
|
rlm@1
|
67 CBitmap bitmap, *pOldBitmap;
|
rlm@1
|
68 bitmap.CreateCompatibleBitmap(dc, w1, h1);
|
rlm@1
|
69 pOldBitmap = memDC.SelectObject(&bitmap);
|
rlm@1
|
70 if(stretch) {
|
rlm@1
|
71 bmpInfo->bmiHeader.biWidth = w;
|
rlm@1
|
72 bmpInfo->bmiHeader.biHeight = -h;
|
rlm@1
|
73
|
rlm@1
|
74 StretchDIBits(memDC.GetSafeHdc(),
|
rlm@1
|
75 0,
|
rlm@1
|
76 0,
|
rlm@1
|
77 w1,
|
rlm@1
|
78 h1,
|
rlm@1
|
79 0,
|
rlm@1
|
80 0,
|
rlm@1
|
81 w,
|
rlm@1
|
82 h,
|
rlm@1
|
83 data,
|
rlm@1
|
84 bmpInfo,
|
rlm@1
|
85 DIB_RGB_COLORS,
|
rlm@1
|
86 SRCCOPY);
|
rlm@1
|
87 } else {
|
rlm@1
|
88 FillOutsideRect(&memDC, CBrush::FromHandle(GetSysColorBrush(COLOR_BTNFACE)));
|
rlm@1
|
89
|
rlm@1
|
90 bmpInfo->bmiHeader.biWidth = w;
|
rlm@1
|
91 bmpInfo->bmiHeader.biHeight = -h;
|
rlm@1
|
92 SetDIBitsToDevice(memDC.GetSafeHdc(),
|
rlm@1
|
93 0,
|
rlm@1
|
94 0,
|
rlm@1
|
95 w,
|
rlm@1
|
96 h,
|
rlm@1
|
97 0,
|
rlm@1
|
98 0,
|
rlm@1
|
99 0,
|
rlm@1
|
100 h,
|
rlm@1
|
101 data,
|
rlm@1
|
102 bmpInfo,
|
rlm@1
|
103 DIB_RGB_COLORS);
|
rlm@1
|
104 }
|
rlm@1
|
105
|
rlm@1
|
106 dc->BitBlt(0,0,w1,h1,
|
rlm@1
|
107 &memDC,0,0,SRCCOPY);
|
rlm@1
|
108 memDC.SelectObject(pOldBitmap);
|
rlm@1
|
109
|
rlm@1
|
110 bitmap.DeleteObject();
|
rlm@1
|
111 memDC.DeleteDC();
|
rlm@1
|
112 }
|
rlm@1
|
113
|
rlm@1
|
114 /////////////////////////////////////////////////////////////////////////////
|
rlm@1
|
115 // BitmapControl diagnostics
|
rlm@1
|
116
|
rlm@1
|
117 #ifdef _DEBUG
|
rlm@1
|
118 void BitmapControl::AssertValid() const
|
rlm@1
|
119 {
|
rlm@1
|
120 CScrollView::AssertValid();
|
rlm@1
|
121 }
|
rlm@1
|
122
|
rlm@1
|
123 void BitmapControl::Dump(CDumpContext& dc) const
|
rlm@1
|
124 {
|
rlm@1
|
125 CScrollView::Dump(dc);
|
rlm@1
|
126 }
|
rlm@1
|
127 #endif //_DEBUG
|
rlm@1
|
128
|
rlm@1
|
129 /////////////////////////////////////////////////////////////////////////////
|
rlm@1
|
130 // BitmapControl message handlers
|
rlm@1
|
131
|
rlm@1
|
132 BOOL BitmapControl::OnEraseBkgnd(CDC* pDC)
|
rlm@1
|
133 {
|
rlm@1
|
134 return TRUE;
|
rlm@1
|
135 }
|
rlm@1
|
136
|
rlm@1
|
137 void BitmapControl::OnSize(UINT nType, int cx, int cy)
|
rlm@1
|
138 {
|
rlm@1
|
139 if(!stretch)
|
rlm@1
|
140 CScrollView::OnSize(nType, cx, cy);
|
rlm@1
|
141 }
|
rlm@1
|
142
|
rlm@1
|
143 void BitmapControl::OnLButtonDown(UINT nFlags, CPoint pt)
|
rlm@1
|
144 {
|
rlm@1
|
145 if(!data)
|
rlm@1
|
146 return;
|
rlm@1
|
147 int x = pt.x;
|
rlm@1
|
148 int y = pt.y;
|
rlm@1
|
149
|
rlm@1
|
150 WPARAM point;
|
rlm@1
|
151
|
rlm@1
|
152 if(stretch) {
|
rlm@1
|
153 RECT rect;
|
rlm@1
|
154 GetClientRect(&rect);
|
rlm@1
|
155
|
rlm@1
|
156 int height = rect.bottom - rect.top;
|
rlm@1
|
157 int width = rect.right - rect.left;
|
rlm@1
|
158
|
rlm@1
|
159 int xx = (x * w) / width;
|
rlm@1
|
160 int yy = (y * h) / height;
|
rlm@1
|
161
|
rlm@1
|
162 point = xx | (yy<<16);
|
rlm@1
|
163
|
rlm@1
|
164 int xxx = xx / 8;
|
rlm@1
|
165 int yyy = yy / 8;
|
rlm@1
|
166
|
rlm@1
|
167 for(int i = 0; i < 8; i++) {
|
rlm@1
|
168 memcpy(&colors[i*3*8], &data[xxx * 8 * 3 +
|
rlm@1
|
169 w * yyy * 8 * 3 +
|
rlm@1
|
170 i * w * 3], 8 * 3);
|
rlm@1
|
171 }
|
rlm@1
|
172 } else {
|
rlm@1
|
173 POINT p;
|
rlm@1
|
174 p.x = GetScrollPos(SB_HORZ);
|
rlm@1
|
175 p.y = GetScrollPos(SB_VERT);
|
rlm@1
|
176
|
rlm@1
|
177 p.x += x;
|
rlm@1
|
178 p.y += y;
|
rlm@1
|
179
|
rlm@1
|
180 if(p.x >= w ||
|
rlm@1
|
181 p.y >= h)
|
rlm@1
|
182 return;
|
rlm@1
|
183
|
rlm@1
|
184 point = p.x | (p.y<<16);
|
rlm@1
|
185
|
rlm@1
|
186 int xxx = p.x / 8;
|
rlm@1
|
187 int yyy = p.y / 8;
|
rlm@1
|
188
|
rlm@1
|
189 for(int i = 0; i < 8; i++) {
|
rlm@1
|
190 memcpy(&colors[i*3*8], &data[xxx * 8 * 3 +
|
rlm@1
|
191 w * yyy * 8 * 3 +
|
rlm@1
|
192 i * w * 3], 8 * 3);
|
rlm@1
|
193 }
|
rlm@1
|
194 }
|
rlm@1
|
195
|
rlm@1
|
196 GetParent()->SendMessage(WM_MAPINFO,
|
rlm@1
|
197 point,
|
rlm@1
|
198 (LPARAM)colors);
|
rlm@1
|
199 }
|
rlm@1
|
200
|
rlm@1
|
201 void BitmapControl::setBmpInfo(BITMAPINFO *info)
|
rlm@1
|
202 {
|
rlm@1
|
203 bmpInfo = info;
|
rlm@1
|
204 }
|
rlm@1
|
205
|
rlm@1
|
206 void BitmapControl::setData(u8 *d)
|
rlm@1
|
207 {
|
rlm@1
|
208 data = d;
|
rlm@1
|
209 }
|
rlm@1
|
210
|
rlm@1
|
211 void BitmapControl::setSize(int w1, int h1)
|
rlm@1
|
212 {
|
rlm@1
|
213 if(w != w1 || h != h1) {
|
rlm@1
|
214 w = w1;
|
rlm@1
|
215 h = h1;
|
rlm@1
|
216 SIZE s;
|
rlm@1
|
217 s.cx = w;
|
rlm@1
|
218 s.cy = h;
|
rlm@1
|
219 SetScrollSizes(MM_TEXT, s);
|
rlm@1
|
220 }
|
rlm@1
|
221 }
|
rlm@1
|
222
|
rlm@1
|
223 void BitmapControl::refresh()
|
rlm@1
|
224 {
|
rlm@1
|
225 Invalidate();
|
rlm@1
|
226 }
|
rlm@1
|
227
|
rlm@1
|
228
|
rlm@1
|
229 void BitmapControl::registerClass()
|
rlm@1
|
230 {
|
rlm@1
|
231 if(!isRegistered) {
|
rlm@1
|
232 WNDCLASS wc;
|
rlm@1
|
233 ZeroMemory(&wc, sizeof(wc));
|
rlm@1
|
234 wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
|
rlm@1
|
235 wc.lpfnWndProc = (WNDPROC)::DefWindowProc;
|
rlm@1
|
236 wc.hInstance = AfxGetInstanceHandle();
|
rlm@1
|
237 wc.hIcon = NULL;
|
rlm@1
|
238 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
rlm@1
|
239 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
rlm@1
|
240 wc.lpszMenuName = NULL;
|
rlm@1
|
241 wc.lpszClassName = "VbaBitmapControl";
|
rlm@1
|
242 AfxRegisterClass(&wc);
|
rlm@1
|
243 isRegistered = true;
|
rlm@1
|
244 }
|
rlm@1
|
245 }
|
rlm@1
|
246
|
rlm@1
|
247 void BitmapControl::setStretch(bool b)
|
rlm@1
|
248 {
|
rlm@1
|
249 if(b != stretch) {
|
rlm@1
|
250 stretch = b;
|
rlm@1
|
251 Invalidate();
|
rlm@1
|
252 }
|
rlm@1
|
253 }
|
rlm@1
|
254
|
rlm@1
|
255 bool BitmapControl::getStretch()
|
rlm@1
|
256 {
|
rlm@1
|
257 return stretch;
|
rlm@1
|
258 }
|
rlm@1
|
259
|
rlm@1
|
260 void BitmapControl::PostNcDestroy()
|
rlm@1
|
261 {
|
rlm@1
|
262 }
|