我正在遵循 direct2d 教程,当我编译代码时,我收到一个错误,指出某个函数已过时,我应该替换它,我寻找方法用 Visual Studio 给我的解决方案替换该函数(在发布之前) stackoverflow)但它不起作用,或者我不知道如何调用它们。
主.cpp
// Because the CreateWindow function takes its size in pixels,
// obtain the system DPI and use it to scale the window size.
FLOAT dpiX, dpiY;
// The factory returns the current system DPI. This is also the value it will use
// to create its own windows.
m_pDirect2dFactory->GetDesktopDpi(&dpiX, &dpiY);
// Create the window.
m_hwnd = CreateWindow(
L"D2DDemoApp",
L"Direct2D Demo App",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<UINT>(ceil(640.f * dpiX / 96.f)),
static_cast<UINT>(ceil(480.f * dpiY / 96.f)),
NULL,
NULL,
HINST_THISCOMPONENT,
this
);
错误
1>------ Build started: Project: entt, Configuration: Debug x64 ------
1>Using triplet "x64-windows-static" from "C:\Users\Jule\vcpkg\installed\x64-windows-static\"
1>main.cpp
1>C:\Users\Jule\source\repos\entt\entt\main.cpp(154,27): error C4996: 'ID2D1Factory::GetDesktopDpi': Deprecated. Use DisplayInformation::LogicalDpi for Windows Store Apps or GetDpiForWindow for desktop apps.
1>Done building project "entt.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
教程:https://learn.microsoft.com/en-us/windows/win32/direct2d/direct2d-quickstart
我自己刚刚完成了本教程并遇到了同样的问题。评论中@Julio Enrique提供的解决方案是正确的。然而,我一开始并没有意识到他把
dpiX
和dpiY
都替换成了x
,所以它对我不起作用。因此,我为本示例教程找到了更简单的删除和替换修复。对于遇到此问题的其他人,请尝试以下修复:
// obtain the system DPI and use it to scale the window size.
FLOAT dpiX, dpiY;
// The following will return the current system DPI. This is the value used
// to create a window with the correct dimensions.
dpiX = (FLOAT) GetDpiForWindow (GetDesktopWindow ());
dpiY = dpiX;
// Create the window.
m_hwnd = CreateWindow(
L"D2DDemoApp",
L"Direct2D Demo App",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<UINT>(ceil(640.f * dpiX / 96.f)),
static_cast<UINT>(ceil(480.f * dpiY / 96.f)),
NULL,
NULL,
HINST_THISCOMPONENT,
this
);
hr = m_hwnd ? S_OK : E_FAIL;
if (SUCCEEDED(hr))
{
ShowWindow(m_hwnd, SW_SHOWNORMAL);
UpdateWindow(m_hwnd);
}
@Julio Enrique还指出,请确保在 Visual Studio 链接器选项中或通过以下编译指示链接所需的 Direct2D 库(即 d2d1.lib
):
#pragma comment(lib, "d2d1.lib")
Pull Request以修复 Microsoft 网站上的文档。
它确实没有错误,但又出现了另一个错误: 1) winbase.h(9258,11):错误C2061
1>C:\ Program Files(x86)\ Windows Kits \ Include .0.22621.0 \ um \ winbase.h(9258,11):错误C2061:语法错误:标识符“FILE_INFO_BY_HANDLE_CLASS” 1>(编译源文件'SimpleDirect2dApplication.cpp')
WINBASE 中的内容:WINBAS 如何出错
https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/begin/LearnWin32/OpenDialogBox [在此输入图像描述][1] 这里我查看了Direct2Dcircle、D2Dclock、Draw Circle。 他们都没有构建:错误 1>LINK:致命错误 LNK1327:运行 mt.exe 期间失败 使用 Insights 重建将最后一行指定为 丙:... epose\Direcct2DCircle asewin.h 那是什么问题? 所有样本在 winbas mt.exe 上均失败 并且 --.manifist 未加载并使用 notpad 复制并重新加载到目录
第二天我知道总是有不同的地方看起来,我去了 D2D 页面并出现上述程序错误。 5) 两组例子完全不同,D2D下的例子更清晰,并且可以与GDI+集成,如GDI例子所示 然而,wWinMain 和 Win 过程不直接吗? 为什么代码结构中有这个复杂的过程/ [1]:https://i.sstatic.net/TMhuqM8J.png 很多问题,但微软对我们来说
谢谢你 艾尔沃夫