2010-05-05 10 views

Respuesta

5
  1. Seleccione su CBitmap obj en un memDC A (usando CDC :: SelectObject())
  2. Crear un nuevo CBitmap con tamaño deseado y seleccionarlo en otro MemDC B
  3. Uso CDC :: StretchBlt (. ..) para estirar bmp en MemDC a en MemDC B
  4. cancelar la selección de objetos CBitmap (mediante la selección de lo que se volvió de las llamadas anteriores a SelectObject)
  5. utilizar su nuevo CBitmap
+0

No estoy seguro de cómo usar todas esas funciones; en qué orden, utilizando qué versión de la función, y cómo se puede utilizar un CDC para un CBitmap. ¿Podría proporcionar algún código? – Smashery

+0

¿Y cuál de los códigos de operación de trama a utilizar? http://msdn.microsoft.com/en-us/library/dd183370(v=VS.85).aspx – Smashery

+0

@Smashery - SRCCOPY sería correcto – SysAdmin

0

Aquí hay una implementación resuelta de la respuesta de @Smashery.

Lo uso para escalar basado en DPI, pero debe ser fácil de adaptar a escalas arbitrarias.

std::shared_ptr<CBitmap> AppHiDpiScaleBitmap (CBitmap &bmp) 
{ 
    BITMAP bm = { 0 }; 
    bmp.GetBitmap (&bm); 
    auto size = CSize (bm.bmWidth, bm.bmHeight); 

    CWindowDC screenCDC (NULL); 
    auto dpiX = screenCDC.GetDeviceCaps (LOGPIXELSX); 
    auto dpiY = screenCDC.GetDeviceCaps (LOGPIXELSY); 

    auto hiSize = CSize ((dpiX * size.cx)/96, (dpiY * size.cy)/96); 

    std::shared_ptr<CBitmap> res (new CBitmap()); 
    res->CreateCompatibleBitmap (&screenCDC, hiSize.cx, hiSize.cy); 

    CDC srcCompatCDC; 
    srcCompatCDC.CreateCompatibleDC (&screenCDC); 
    CDC destCompatCDC; 
    destCompatCDC.CreateCompatibleDC (&screenCDC); 

    CMemDC srcDC (srcCompatCDC, CRect (CPoint(), size)); 
    auto oldSrcBmp = srcDC.GetDC().SelectObject (&bmp); 

    CMemDC destDC (destCompatCDC, CRect(CPoint(), hiSize)); 
    auto oldDestBmp = destDC.GetDC().SelectObject (res.get()); 

    destDC.GetDC().StretchBlt (0, 0, hiSize.cx, hiSize.cy, &srcDC.GetDC(), 0, 0, size.cx, size.cy, SRCCOPY); 

    srcDC.GetDC().SelectObject (oldSrcBmp); 
    destDC.GetDC().SelectObject (oldDestBmp); 

    return res; 
} 
Cuestiones relacionadas