annotate src/win32/BitmapControl.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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 }