rlm@1: // ZoomControl.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "ZoomControl.h" rlm@1: rlm@1: bool ZoomControl::isRegistered = false; rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // ZoomControl rlm@1: rlm@1: ZoomControl::ZoomControl() rlm@1: { rlm@1: ZeroMemory(colors, 3*64); rlm@1: selected = -1; rlm@1: registerClass(); rlm@1: } rlm@1: rlm@1: ZoomControl::~ZoomControl() rlm@1: {} rlm@1: rlm@1: BEGIN_MESSAGE_MAP(ZoomControl, CWnd) rlm@1: //{{AFX_MSG_MAP(ZoomControl) rlm@1: ON_WM_PAINT() rlm@1: ON_WM_LBUTTONDOWN() rlm@1: ON_WM_ERASEBKGND() rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // ZoomControl message handlers rlm@1: rlm@1: void ZoomControl::registerClass() rlm@1: { rlm@1: if (!isRegistered) rlm@1: { 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 = "VbaZoomControl"; rlm@1: AfxRegisterClass(&wc); rlm@1: isRegistered = true; rlm@1: } rlm@1: } rlm@1: rlm@1: void ZoomControl::OnPaint() rlm@1: { rlm@1: CPaintDC dc(this); // device context for painting rlm@1: rlm@1: RECT rect; rlm@1: GetClientRect(&rect); rlm@1: rlm@1: int w = rect.right - rect.left; rlm@1: int h = rect.bottom - rect.top; rlm@1: rlm@1: CDC memDC ; rlm@1: memDC.CreateCompatibleDC(&dc); rlm@1: CBitmap bitmap, *pOldBitmap; rlm@1: bitmap.CreateCompatibleBitmap(&dc, w, h); rlm@1: rlm@1: pOldBitmap = memDC.SelectObject(&bitmap); rlm@1: rlm@1: int multX = w / 8; rlm@1: int multY = h / 8; rlm@1: rlm@1: int i; rlm@1: for (i = 0; i < 64; i++) rlm@1: { rlm@1: CBrush b; rlm@1: b.CreateSolidBrush(RGB(colors[i*3+2], colors[i*3+1], colors[i*3])); rlm@1: rlm@1: RECT r; rlm@1: int x = i & 7; rlm@1: int y = i / 8; rlm@1: r.top = y*multY; rlm@1: r.left = x*multX; rlm@1: r.bottom = r.top + multY; rlm@1: r.right = r.left + multX; rlm@1: memDC.FillRect(&r, &b); rlm@1: b.DeleteObject(); rlm@1: } rlm@1: rlm@1: CPen pen; rlm@1: pen.CreatePen(PS_SOLID, 1, RGB(192, 192, 192)); rlm@1: CPen *old = (CPen *)memDC.SelectObject(&pen); rlm@1: rlm@1: for (i = 0; i < 8; i++) rlm@1: { rlm@1: memDC.MoveTo(0, i * multY); rlm@1: memDC.LineTo(w, i * multY); rlm@1: memDC.MoveTo(i * multX, 0); rlm@1: memDC.LineTo(i * multX, h); rlm@1: } rlm@1: rlm@1: if (selected != -1) rlm@1: { rlm@1: CPen pen2; rlm@1: pen2.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); rlm@1: CPen *old2 = (CPen *)memDC.SelectObject(&pen2); rlm@1: rlm@1: int startX = (selected & 7)*multX+1; rlm@1: int startY = (selected / 8)*multY+1; rlm@1: int endX = startX + multX-2; rlm@1: int endY = startY + multY-2; rlm@1: rlm@1: memDC.MoveTo(startX, startY); rlm@1: memDC.LineTo(endX, startY); rlm@1: memDC.LineTo(endX, endY); rlm@1: memDC.LineTo(startX, endY); rlm@1: memDC.LineTo(startX, startY-1); rlm@1: memDC.SelectObject(old2); rlm@1: pen2.DeleteObject(); rlm@1: } rlm@1: memDC.SelectObject(old); rlm@1: pen.DeleteObject(); rlm@1: rlm@1: dc.BitBlt(0, 0, w, h, rlm@1: &memDC, 0, 0, SRCCOPY); rlm@1: rlm@1: memDC.SelectObject(pOldBitmap); rlm@1: bitmap.DeleteObject(); rlm@1: memDC.DeleteDC(); rlm@1: } rlm@1: rlm@1: void ZoomControl::OnLButtonDown(UINT nFlags, CPoint point) rlm@1: { 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 multX = width / 8; rlm@1: int multY = height / 8; rlm@1: rlm@1: selected = point.x / multX + 8 * (point.y / multY); rlm@1: rlm@1: int c = point.x / multX + 8 * (point.y/multY); rlm@1: u16 color = colors[c*3] << 7 | rlm@1: colors[c*3+1] << 2 | rlm@1: (colors[c*3+2] >> 3); rlm@1: rlm@1: GetParent()->PostMessage(WM_COLINFO, rlm@1: color, rlm@1: 0); rlm@1: rlm@1: Invalidate(); rlm@1: } rlm@1: rlm@1: BOOL ZoomControl::OnEraseBkgnd(CDC*pDC) rlm@1: { rlm@1: return TRUE; rlm@1: } rlm@1: rlm@1: void ZoomControl::setColors(const u8 *c) rlm@1: { rlm@1: memcpy(colors, c, 3*64); rlm@1: selected = -1; rlm@1: Invalidate(); rlm@1: }