问题的屏幕截图:
这里是相关的代码位-为清楚起见,省略了错误处理等。
D2D1_BITMAP_PROPERTIES1 bp;
bp.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;
bp.dpiX = 96.0f;
bp.dpiY = 96.0f;
bp.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
bp.colorContext = nullptr;
...
d2dDeviceContext->SetTarget(targetBitmap);
....
writeFactory->CreateTextFormat(L"Arial", nullptr, DWRITE_FONT_WEIGHT_LIGHT, DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL, 32.0f, L"en-US", &textFormatAccountCreds);
textFormatAccountCreds->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING);
textFormatAccountCreds->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR);
std::wostringstream outAccountName;
outAccountName << "Account Name:";
writeFactory->CreateTextLayout(outAccountName.str().c_str(), (UINT32)outAccountName.str().size(), textFormatAccountCreds, (float)800,
(float)600, &textLayoutAccountName);
const float color[4] = { 1.0f, 0.5f, 0.3f, 1.0f };
immediateContext->ClearRenderTargetView(renderTargetView, color);
d2dDeviceContext->BeginDraw();
d2dDeviceContext->DrawTextLayout(D2D1::Point2F(2.0f, 5.0f), textLayoutAccountName, blackBrush);
d2dDeviceContext->EndDraw();
swapChain->Present(0, 0);
如您在屏幕快照中所见,文本的渲染效果很差-具体来说,第一个“ n”似乎在左侧被截断,第一个“ u”似乎被截断,大写字母“ N”具有发生一些奇怪的混叠。我可以更改文本的大小/位置,并且呈现问题的表现方式有所不同,但是仍然存在。
我在这里想念什么?我已经看过MSDN上的大多数DirectWrite文档,还不清楚我的问题是什么。我确实看到有人提到我应该相对于dpi比例指定文本的起始位置,但是示例非常模糊。
值得一提的是,我将Direct3D和DirectWrite与Direct2D一起使用,就像在this tutorial中看到的那样。不知道这是否引起我的问题。
我将非常感谢您的协助。非常感谢。
答案 0 :(得分:0)
我知道了。向VTT欢呼,向我指出正确的方向。
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInstance,
NULL
);
...
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = 800;
sd.BufferDesc.Height = 600;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = 4;
sd.SampleDesc.Quality = m4xMsaaQuality - 1;
sd.Windowed = TRUE;
sd.Flags = 0;
显然,您传递给CreateWindow INCLUDE空间的窗口菜单和边框的尺寸,因此可以在窗口内绘制的空间的ACTUAL尺寸较小。
RECT rect;
GetClientRect(hWnd, &rect);
// Returns 784 x 561
因此解决方案是: -忽略在DXGI_SWAP_CHAIN_DESC中指定sd.BufferDesc.Width和sd.BufferDesc.Height,因为当它们设置为0时,它们将从父窗口继承尺寸。 -稍后需要实际窗口尺寸时,请使用GetClientRect获取实际尺寸。