?
Hallo!
Versuch sowas
destinationRect beinhaltet Ausgabekoordinaten im Clientbereich.
zoomSizeX, zoomSizeY ist die zu vergrössernde Pixelanzahl (11x11 Pixel)
CPoint m_MousePos; // Mauszeigerkoordinaten
Viel Spaß
Valerij
void 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);
}