// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. // Copyright (C) 1999-2003 Forgotten // Copyright (C) 2004 Forgotten and the VBA development team // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2, or(at your option) // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software Foundation, // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // ZoomControl.cpp : implementation file // #include "stdafx.h" #include "vba.h" #include "ZoomControl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif bool ZoomControl::isRegistered = false; ///////////////////////////////////////////////////////////////////////////// // ZoomControl ZoomControl::ZoomControl() { ZeroMemory(colors, 3*64); selected = -1; registerClass(); } ZoomControl::~ZoomControl() { } BEGIN_MESSAGE_MAP(ZoomControl, CWnd) //{{AFX_MSG_MAP(ZoomControl) ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_ERASEBKGND() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // ZoomControl message handlers void ZoomControl::registerClass() { if(!isRegistered) { WNDCLASS wc; ZeroMemory(&wc, sizeof(wc)); wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; wc.lpfnWndProc = (WNDPROC)::DefWindowProc; wc.hInstance = AfxGetInstanceHandle(); wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "VbaZoomControl"; AfxRegisterClass(&wc); isRegistered = true; } } void ZoomControl::OnPaint() { CPaintDC dc(this); // device context for painting RECT rect; GetClientRect(&rect); int w = rect.right - rect.left; int h = rect.bottom - rect.top; CDC memDC ; memDC.CreateCompatibleDC(&dc); CBitmap bitmap, *pOldBitmap; bitmap.CreateCompatibleBitmap(&dc, w, h); pOldBitmap = memDC.SelectObject(&bitmap); int multX = w / 8; int multY = h / 8; int i; for(i = 0; i < 64; i++) { CBrush b; b.CreateSolidBrush(RGB(colors[i*3+2], colors[i*3+1], colors[i*3])); RECT r; int x = i & 7; int y = i / 8; r.top = y*multY; r.left = x*multX; r.bottom = r.top + multY; r.right = r.left + multX; memDC.FillRect(&r, &b); b.DeleteObject(); } CPen pen; pen.CreatePen(PS_SOLID, 1, RGB(192,192,192)); CPen *old = (CPen *)memDC.SelectObject(&pen); for(i = 0; i < 8; i++) { memDC.MoveTo(0, i * multY); memDC.LineTo(w, i * multY); memDC.MoveTo(i * multX, 0); memDC.LineTo(i * multX, h); } if(selected != -1) { CPen pen2; pen2.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); CPen *old2 = (CPen*)memDC.SelectObject(&pen2); int startX = (selected & 7)*multX+1; int startY = (selected / 8)*multY+1; int endX = startX + multX-2; int endY = startY + multY-2; memDC.MoveTo(startX, startY); memDC.LineTo(endX, startY); memDC.LineTo(endX, endY); memDC.LineTo(startX, endY); memDC.LineTo(startX, startY-1); memDC.SelectObject(old2); pen2.DeleteObject(); } memDC.SelectObject(old); pen.DeleteObject(); dc.BitBlt(0,0,w,h, &memDC,0,0, SRCCOPY); memDC.SelectObject(pOldBitmap); bitmap.DeleteObject(); memDC.DeleteDC(); } void ZoomControl::OnLButtonDown(UINT nFlags, CPoint point) { RECT rect; GetClientRect(&rect); int height = rect.bottom - rect.top; int width = rect.right - rect.left; int multX = width / 8; int multY = height / 8; selected = point.x / multX + 8 * (point.y / multY); int c = point.x / multX + 8 * (point.y/multY); u16 color = colors[c*3] << 7 | colors[c*3+1] << 2 | (colors[c*3+2] >> 3); GetParent()->PostMessage(WM_COLINFO, color, 0); Invalidate(); } BOOL ZoomControl::OnEraseBkgnd(CDC* pDC) { return TRUE; } void ZoomControl::setColors(const u8 *c) { memcpy(colors, c, 3*64); selected = -1; Invalidate(); }