es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué se ve pixelado e impreciso direct2d?

Creé una ventana con capas y agregué algunos rectángulos redondeados, elipses y texto para crear una ventana personalizada.

Esto es, en resumen, cómo lo escribí:

Código no traducible

Seguí la documentación de Microsoft.

La ventana se ve así: Enlace a la imagen

Tiene un tamaño de 300 por 400 píxeles.
El texto, las esquinas y las elipses se ven pixelados e imprecisos.

¿Qué me falta en mi programa? Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en WinAPI, Visual-C++ y Direct2D, hay algunas cosas que puedes hacer para mejorar la apariencia de tu ventana personalizada:

    1. Configura las propiedades del destino de renderizado para utilizar D2D1_RENDER_TARGET_TYPE_HARDWARE, ya que esto permitirá aceleración por hardware y anti-aliasing:
    D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2dFactory);
    
    D2D1_RENDER_TARGET_PROPERTIES renderProps = D2D1::RenderTargetProperties(
        D2D1_RENDER_TARGET_TYPE_HARDWARE,
        D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_IGNORE),
        0.0f,
        0.0f
    );
    
    d2dFactory->CreateHwndRenderTarget(
        renderProps,
        D2D1::HwndRenderTargetProperties(hwnd, D2D1::SizeU(clientRect.right, clientRect.bottom)),
        &pRenderTarget
    );
    
    1. Configura el modo de anti-aliasing a D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, ya que esto aplicará anti-aliasing a cada primitiva individual:
    pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
    
    1. Configura el modo de anti-aliasing de texto a D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE, ya que esto proporcionará un texto más claro:
    pRenderTarget->SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE);
    
    1. Utiliza el modo de mezcla D2D1_PRIMITIVE_BLEND_SOURCE_OVER al dibujar primitivas, ya que esto asegurará que se mezclen correctamente:
    pRenderTarget->BeginDraw();
    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
    
    pRenderTarget->FillRoundedRectangle(
        roundedRect,
        SCB_DARK_BLUE
    );
    
    pRenderTarget->DrawTextA(
        title,
        titleSize,
        pTextFormat,
        RectF(185, 2, 255, 2),
        SCB_WHITE
    );
    
    pRenderTarget->FillEllipse(
        Ellipse(
            Point2F(20, 10),
            6, 6
        ),
        SCB_RED
    );
    
    pRenderTarget->EndDraw();
    

    Siguiendo estas sugerencias, podrás mejorar la apariencia de tu ventana personalizada y hacer que el texto, las esquinas y las elipses se vean más precisas y menos pixeladas.

Comments are closed.