为什么 ID2D1Factory::GetDesktopDpi 过时了?

问题描述 投票:0回答:2

我正在遵循 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

c direct3d direct2d
2个回答
1
投票

我自己刚刚完成了本教程并遇到了同样的问题。评论中@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 网站上的文档。


0
投票
现在 2024 年 11 月 10 日,此示例尚未修复。 我遇到了同样的错误: .cpp(112,22):警告 C4996:“ID2D1Factory::GetDesktopDpi”:已弃用。对于 Windows 应用商店应用程序使用 DisplayInformation::LogicalDpi,对于桌面应用程序使用 GetDpiForWindow。 // m_pD2DFactory->GetDesktopDpi(&dpiX, &dpiY); 使用推荐的解决方案,并添加 #pragma comment(lib, "d2d1.lib")

它确实没有错误,但又出现了另一个错误: 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 如何出错

  1. D2D 仅包含此内容而没有其他内容? #include“SimpleDirect2dApplication.h” 您能解释一下为什么没有 d2d 指令或任何其他指令,并且程序可以运行吗? {这是否意味着 vs2022 已经自动引用了所有参考文献?]

  2. 这是我第一次接触 D2D,而之前我在 GDI+ 上度过了很多时光。 D2D 似乎是从 2 天开始阅读另一个 GDI 命令流映射,但在更冗长的情况下添加了一些内容和冗长的内容。 COM的使用,如CoUninitialize(); 这是否意味着我们与 GDI+[win32] 一起使用的 Wind32 已更改为 COM 结构?

4)我从:第一天开始: 它看起来如此复杂,没有明显的好处或理由。

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 很多问题,但微软对我们来说

谢谢你 艾尔沃夫

© www.soinside.com 2019 - 2024. All rights reserved.