Como adicionar suporte para vários monitores

DirectWrite inclui suporte para sistemas com vários monitores. Monitores diferentes podem ter geometria de pixel diferente (RGB, BGR ou FLAT) ou outros atributos. Para obter mais informações sobre geometria de pixels, consulte o tópico de referência DWRITE_PIXEL_GEOMETRY. Este tópico mostrará como adicionar suporte para vários monitores ao seu aplicativo DirectWrite.

Para suportar vários monitores, é necessário manipular a mensagem da janela WM_WINDOWPOSCHANGED. Esta mensagem é enviada quando a janela é movida, portanto, você deve verificar se a janela foi movida para um monitor diferente, conforme mostrado no código a seguir.

case WM_WINDOWPOSCHANGED:
    {
        HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONULL);
        if (monitor != g_monitor)
        {
            g_monitor = monitor;
            if (g_spRenderTarget != NULL)
            {
                IDWriteRenderingParams* pRenderingParams = NULL;
                g_spDWriteFactory->CreateMonitorRenderingParams(monitor, &pRenderingParams);

                g_spRenderTarget->SetTextRenderingParams(pRenderingParams);

                SafeRelease(&pRenderingParams);
            }

            InvalidateRect(hwnd, NULL, TRUE);
        }
    }
    break;

Se a janela estiver localizada em um novo monitor, você deverá criar parâmetros de renderização para o novo monitor usando o IDWriteFactory::CreateMonitorRenderingParams método.

Observação

Não use o IDWriteFactory::CreateRenderingParams método para criar os parâmetros de renderização, porque ele sempre cria parâmetros para o monitor primário.

 

Quando você tiver um IDWriteRenderingParams objeto, defina os parâmetros de renderização para o destino de renderização usando o ID2DRenderTarget::SetTextRenderingParams método.

Finalmente, use a função InvalidateRect para fazer com que a janela seja redesenhada com os novos parâmetros de renderização.