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 EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组
DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败