Bildschirm-Lupe
-
hallo,
ich möcht ein fenster welches sich mit den mausbewegungen mitbewegt ca 5*4cm groß ist und den bildschirminhalt der darunter liegt doppelt so groß darstellt.ich kenne diverse produkte die das tun, aber ich möchte halt eine eigene programmieren, hab nur leider keine ahnung wich ich das fenster an den mauszeiger häng, den mauszeiger selbst noch versteck und den bildschirminhalt zoome.
Danke
-
Hallo!
Versuch sowas
destinationRect beinhaltet Ausgabekoordinaten im Clientbereich.
zoomSizeX, zoomSizeY ist die zu vergrössernde Pixelanzahl (11x11 Pixel)
CPoint m_MousePos; // MauszeigerkoordinatenViel Spaß
Valerijvoid CColorTableVLCDlgBar::paintZoom2CDC ( CDC& dc, CRect destinationRect ) { int zoomSizeX = 11; // 2*n+1 int zoomSizeY = 11; // 2*n+1 BITMAPINFOHEADER* pBuffer = (BITMAPINFOHEADER*) new char[sizeof(BITMAPINFOHEADER) + ((zoomSizeX * 3 + 3) & 0xfffffffc) * zoomSizeY]; pBuffer->biSize = sizeof(BITMAPINFOHEADER); pBuffer->biWidth = zoomSizeX; pBuffer->biHeight = zoomSizeY; pBuffer->biPlanes = 1; pBuffer->biBitCount = 24; pBuffer->biCompression = BI_RGB; pBuffer->biSizeImage = 0; pBuffer->biXPelsPerMeter = 0; pBuffer->biYPelsPerMeter = 0; pBuffer->biClrUsed = 0; pBuffer->biClrImportant = 0; char *p = (char*) (pBuffer+1); // p points to beginning of buffer for(int y = m_MousePos.y+(zoomSizeY-1)/2; y >= m_MousePos.y-(zoomSizeY-1)/2; --y) // DIBs are upside down { for(int x = m_MousePos.x-(zoomSizeX-1)/2 ; x <= m_MousePos.x+(zoomSizeX-1)/2; ++x) { int r,g,b; int rgb = GetPixel(dc.m_hDC, x, y); r = rgb % 0x100; rgb /= 0x100; g = rgb % 0x100; rgb /= 0x100; b = rgb % 0x100; *p++ = b; *p++ = g; *p++ = r; } p += ((zoomSizeX * 3 + 3) & 0xfffffffc) - zoomSizeX * 3; // pad to 4 byte boundaries } StretchDIBits(dc.m_hDC, destinationRect.left, destinationRect.top, destinationRect.right - destinationRect.left, destinationRect.bottom - destinationRect.top, 0, 0, zoomSizeX, zoomSizeY, pBuffer+1,(BITMAPINFO*) pBuffer,DIB_RGB_COLORS, SRCCOPY); delete [] (char*) pBuffer; RECT rect; rect.top = destinationRect.top + (destinationRect.bottom-destinationRect.top)/zoomSizeY*((zoomSizeY-1)/2) - 1; rect.left = destinationRect.left + (destinationRect.right-destinationRect.left)/zoomSizeX*((zoomSizeX-1)/2) - 1; rect.bottom = destinationRect.top + (destinationRect.bottom-destinationRect.top)/zoomSizeY*((zoomSizeY+1)/2); rect.right = destinationRect.left + (destinationRect.right-destinationRect.left)/zoomSizeX*((zoomSizeX+1)/2); CPen dotPen(PS_DOT, 1, RGB(0,0,0)); CPen *oldPen; oldPen = dc.SelectObject(&dotPen); dc.MoveTo(rect.left, rect.top); dc.LineTo(rect.right, rect.top); dc.LineTo(rect.right, rect.bottom); dc.LineTo(rect.left, rect.bottom); dc.LineTo(rect.left, rect.top); dc.SelectObject(oldPen); }