DXGI 文本输出轨迹

Posted

技术标签:

【中文标题】DXGI 文本输出轨迹【英文标题】:DXGI text output trail 【发布时间】:2016-08-01 18:06:28 【问题描述】:

我正在尝试通过 TextOut 移动文本

这里是代码

IDXGISurface1* g_pSurface1 = NULL;
HRESULT hr = pSwapChain->GetBuffer(0, __uuidof(IDXGISurface1), (void**)&g_pSurface1);

if (SUCCEEDED(hr))

    hr = g_pSurface1->GetDC(FALSE, &hdc);
    if (SUCCEEDED(hr))
    


        TextOut(hdc, pos.x, pos.y, L"DXGI's GDI text output works", strlen("DXGI's GDI text output works") + 1);

        g_pSurface1->ReleaseDC(NULL);
    
    else
    
        MessageBox(0,0,0,0);
    
    g_pSurface1->Release();

else

    MessageBox(0,0,0,0);

pDevContext->OMSetRenderTargets(1, &pRenderTarget, pDepth);

在哪里

 pos.x and pos.y are mouse coordinates

当我移动文本或子窗口时GDI and DirectX rendering

我有这个

【问题讨论】:

你为什么使用 GDI 而不是 DirectWrite? 因为我不能使用 DirectWrite 为什么不呢?您的问题不清楚为什么要使用较旧的 GDI 互操作? 一般我想用Qt,所以DirectWrite不是跨平台的。 好的,但是 GDI 也不是跨平台的。 【参考方案1】:

strlen 用于 ANSI,不能与 Unicode 混合使用。而是使用“wide-c-string”函数wcsxxx。例如wcslen:

const wchar_t* text = L"DXGI's GDI text output works";
TextOut(hdc, pos.x, pos.y, text, wcslen(text));

要消除痕迹,您必须手动擦除背景。例如:

case WM_MOUSEMOVE:

    HDC hdc = GetDC(hWnd);

    //erase background:
    RECT rc;
    GetClientRect(hWnd, &rc);
    HBRUSH brush = CreateSolidBrush(RGB(128, 128, 255));
    FillRect(hdc, &rc, brush);
    DeleteObject(brush);

    //draw text:
    const wchar_t *text = L"DXGI's GDI text output works";
    SetBkMode(hdc, OPAQUE);
    SetBkColor(hdc, RGB(255,255,255));
    TextOut(hdc, LOWORD(lParam), HIWORD(lParam), text, wcslen(text));
    ReleaseDC(hWnd, hdc);
    break;

编辑,将其与 Direct3D 混合

case WM_MOUSEMOVE:

    //call directx rendering to reset the background:
    Render(); 

    //draw text:
    HDC hdc = GetDC(hWnd);
    const wchar_t *text = L"DXGI's GDI text output works";
    SetBkMode(hdc, OPAQUE);
    SetBkColor(hdc, RGB(255,255,255));
    TextOut(hdc, LOWORD(lParam), HIWORD(lParam), text, wcslen(text));
    ReleaseDC(hWnd, hdc);
    break;

【讨论】:

这里有没有其他方法可以在不填充颜色的情况下清除背景? 因为我在通过 GDI 渲染文本的同一窗口上也有实时 DirectX 渲染 如果背景是纯色的话会比较容易。但在您的情况下,您必须将背景保存为位图。使用DrawText 而不是TextOut,恢复旧的文本矩形。绘制整个背景会更容易。您可以使用 DirectX 绘制到缓冲区以加快重新绘制。在您的情况下,您可能希望专注于使用子窗口的上一个问题。 请注意,如果您在循环中渲染 direct3d,它会以每秒 30 帧的速度(或您拥有的任何帧速率)进行绘制。所以这不是一个坚实的背景,而是看起来是静态的动画。这里发生的情况是,当您按住鼠标按钮时,主循环中的渲染会停止,因此您只需自己调用 Render() 函数即可。你可以在 DirectX 中完成所有的绘图,你真的不需要 GDI。见编辑。

以上是关于DXGI 文本输出轨迹的主要内容,如果未能解决你的问题,请参考以下文章

DXGI:尝试从输出(监视器)中获取正确的显示模式

自定义输出分辨率 DuplicateOutput DXGI

运动物体的轨迹

DXGI EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组

DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败

uniapp怎么让文字输出到文本框