rlm@1: // BitmapControl.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "BitmapControl.h" rlm@1: rlm@1: bool BitmapControl::isRegistered = false; rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // BitmapControl rlm@1: rlm@1: IMPLEMENT_DYNCREATE(BitmapControl, CScrollView) rlm@1: rlm@1: BitmapControl::BitmapControl() rlm@1: { rlm@1: w = 0; rlm@1: h = 0; rlm@1: data = NULL; rlm@1: bmpInfo = NULL; rlm@1: stretch = false; rlm@1: registerClass(); rlm@1: CSize sizeTotal; rlm@1: sizeTotal.cx = sizeTotal.cy = 0; rlm@1: SetScrollSizes(MM_TEXT, sizeTotal); rlm@1: } rlm@1: rlm@1: BitmapControl::~BitmapControl() rlm@1: { rlm@1: } rlm@1: rlm@1: rlm@1: BEGIN_MESSAGE_MAP(BitmapControl, CScrollView) rlm@1: //{{AFX_MSG_MAP(BitmapControl) rlm@1: ON_WM_ERASEBKGND() rlm@1: ON_WM_SIZE() rlm@1: ON_WM_LBUTTONDOWN() rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // BitmapControl drawing rlm@1: rlm@1: void BitmapControl::OnInitialUpdate() rlm@1: { rlm@1: CScrollView::OnInitialUpdate(); rlm@1: rlm@1: CSize sizeTotal; rlm@1: // TODO: calculate the total size of this view rlm@1: sizeTotal.cx = sizeTotal.cy = 100; rlm@1: SetScrollSizes(MM_TEXT, sizeTotal); rlm@1: } rlm@1: rlm@1: void BitmapControl::OnDraw(CDC* dc) rlm@1: { rlm@1: RECT r; rlm@1: GetClientRect(&r); rlm@1: int w1 = r.right - r.left; rlm@1: int h1 = r.bottom - r.top; rlm@1: CDC memDC; rlm@1: memDC.CreateCompatibleDC(dc); rlm@1: if(!stretch) { rlm@1: if(w > w1) rlm@1: w1 = w; rlm@1: if(h > h1) rlm@1: h1 = h; rlm@1: } rlm@1: CBitmap bitmap, *pOldBitmap; rlm@1: bitmap.CreateCompatibleBitmap(dc, w1, h1); rlm@1: pOldBitmap = memDC.SelectObject(&bitmap); rlm@1: if(stretch) { rlm@1: bmpInfo->bmiHeader.biWidth = w; rlm@1: bmpInfo->bmiHeader.biHeight = -h; rlm@1: rlm@1: StretchDIBits(memDC.GetSafeHdc(), rlm@1: 0, rlm@1: 0, rlm@1: w1, rlm@1: h1, rlm@1: 0, rlm@1: 0, rlm@1: w, rlm@1: h, rlm@1: data, rlm@1: bmpInfo, rlm@1: DIB_RGB_COLORS, rlm@1: SRCCOPY); rlm@1: } else { rlm@1: FillOutsideRect(&memDC, CBrush::FromHandle(GetSysColorBrush(COLOR_BTNFACE))); rlm@1: rlm@1: bmpInfo->bmiHeader.biWidth = w; rlm@1: bmpInfo->bmiHeader.biHeight = -h; rlm@1: SetDIBitsToDevice(memDC.GetSafeHdc(), rlm@1: 0, rlm@1: 0, rlm@1: w, rlm@1: h, rlm@1: 0, rlm@1: 0, rlm@1: 0, rlm@1: h, rlm@1: data, rlm@1: bmpInfo, rlm@1: DIB_RGB_COLORS); rlm@1: } rlm@1: rlm@1: dc->BitBlt(0,0,w1,h1, rlm@1: &memDC,0,0,SRCCOPY); rlm@1: memDC.SelectObject(pOldBitmap); rlm@1: rlm@1: bitmap.DeleteObject(); rlm@1: memDC.DeleteDC(); rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // BitmapControl diagnostics rlm@1: rlm@1: #ifdef _DEBUG rlm@1: void BitmapControl::AssertValid() const rlm@1: { rlm@1: CScrollView::AssertValid(); rlm@1: } rlm@1: rlm@1: void BitmapControl::Dump(CDumpContext& dc) const rlm@1: { rlm@1: CScrollView::Dump(dc); rlm@1: } rlm@1: #endif //_DEBUG rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // BitmapControl message handlers rlm@1: rlm@1: BOOL BitmapControl::OnEraseBkgnd(CDC* pDC) rlm@1: { rlm@1: return TRUE; rlm@1: } rlm@1: rlm@1: void BitmapControl::OnSize(UINT nType, int cx, int cy) rlm@1: { rlm@1: if(!stretch) rlm@1: CScrollView::OnSize(nType, cx, cy); rlm@1: } rlm@1: rlm@1: void BitmapControl::OnLButtonDown(UINT nFlags, CPoint pt) rlm@1: { rlm@1: if(!data) rlm@1: return; rlm@1: int x = pt.x; rlm@1: int y = pt.y; rlm@1: rlm@1: WPARAM point; rlm@1: rlm@1: if(stretch) { rlm@1: RECT rect; rlm@1: GetClientRect(&rect); rlm@1: rlm@1: int height = rect.bottom - rect.top; rlm@1: int width = rect.right - rect.left; rlm@1: rlm@1: int xx = (x * w) / width; rlm@1: int yy = (y * h) / height; rlm@1: rlm@1: point = xx | (yy<<16); rlm@1: rlm@1: int xxx = xx / 8; rlm@1: int yyy = yy / 8; rlm@1: rlm@1: for(int i = 0; i < 8; i++) { rlm@1: memcpy(&colors[i*3*8], &data[xxx * 8 * 3 + rlm@1: w * yyy * 8 * 3 + rlm@1: i * w * 3], 8 * 3); rlm@1: } rlm@1: } else { rlm@1: POINT p; rlm@1: p.x = GetScrollPos(SB_HORZ); rlm@1: p.y = GetScrollPos(SB_VERT); rlm@1: rlm@1: p.x += x; rlm@1: p.y += y; rlm@1: rlm@1: if(p.x >= w || rlm@1: p.y >= h) rlm@1: return; rlm@1: rlm@1: point = p.x | (p.y<<16); rlm@1: rlm@1: int xxx = p.x / 8; rlm@1: int yyy = p.y / 8; rlm@1: rlm@1: for(int i = 0; i < 8; i++) { rlm@1: memcpy(&colors[i*3*8], &data[xxx * 8 * 3 + rlm@1: w * yyy * 8 * 3 + rlm@1: i * w * 3], 8 * 3); rlm@1: } rlm@1: } rlm@1: rlm@1: GetParent()->SendMessage(WM_MAPINFO, rlm@1: point, rlm@1: (LPARAM)colors); rlm@1: } rlm@1: rlm@1: void BitmapControl::setBmpInfo(BITMAPINFO *info) rlm@1: { rlm@1: bmpInfo = info; rlm@1: } rlm@1: rlm@1: void BitmapControl::setData(u8 *d) rlm@1: { rlm@1: data = d; rlm@1: } rlm@1: rlm@1: void BitmapControl::setSize(int w1, int h1) rlm@1: { rlm@1: if(w != w1 || h != h1) { rlm@1: w = w1; rlm@1: h = h1; rlm@1: SIZE s; rlm@1: s.cx = w; rlm@1: s.cy = h; rlm@1: SetScrollSizes(MM_TEXT, s); rlm@1: } rlm@1: } rlm@1: rlm@1: void BitmapControl::refresh() rlm@1: { rlm@1: Invalidate(); rlm@1: } rlm@1: rlm@1: rlm@1: void BitmapControl::registerClass() rlm@1: { rlm@1: if(!isRegistered) { rlm@1: WNDCLASS wc; rlm@1: ZeroMemory(&wc, sizeof(wc)); rlm@1: wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; rlm@1: wc.lpfnWndProc = (WNDPROC)::DefWindowProc; rlm@1: wc.hInstance = AfxGetInstanceHandle(); rlm@1: wc.hIcon = NULL; rlm@1: wc.hCursor = LoadCursor(NULL, IDC_ARROW); rlm@1: wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); rlm@1: wc.lpszMenuName = NULL; rlm@1: wc.lpszClassName = "VbaBitmapControl"; rlm@1: AfxRegisterClass(&wc); rlm@1: isRegistered = true; rlm@1: } rlm@1: } rlm@1: rlm@1: void BitmapControl::setStretch(bool b) rlm@1: { rlm@1: if(b != stretch) { rlm@1: stretch = b; rlm@1: Invalidate(); rlm@1: } rlm@1: } rlm@1: rlm@1: bool BitmapControl::getStretch() rlm@1: { rlm@1: return stretch; rlm@1: } rlm@1: rlm@1: void BitmapControl::PostNcDestroy() rlm@1: { rlm@1: }