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; // 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);
    }
    

Log in to reply