我在Direct2D/DirectWrite中渲染文本,但调用SetLineSpacing()TextFormat或TextLayout似乎没有任何效果.有谁知道为什么?
主要文章有一个头文件和一个源文件.复制这两个文件并添加几个标题后:
#include <Windows.h>
#include <d2d1.h>
#pragma comment(lib, "d2d1")
#include <dwrite.h>
#include <d2d1helper.h>
#include "SafeRelease.h"
Run Code Online (Sandbox Code Playgroud)
//安全的重新发布文件
template<class Interface>
inline void
SafeRelease(
Interface **ppInterfaceToRelease
)
{
if (*ppInterfaceToRelease != NULL)
{
(*ppInterfaceToRelease)->Release();
(*ppInterfaceToRelease) = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
当我试图编译这个项目时,我收到一个错误:
错误1错误LNK2019:未解析的外部符号__imp__DWriteCreateFactory @ 12在函数"private:long __thiscall SimpleText :: CreateDeviceIndependentResources(void)"中引用(?CreateDeviceIndependentResources @ SimpleText @@ AAEJXZ)
不知道为什么.所有?标题包括在内.希望你们中的一些人能够帮助解决这个问题.
谢谢.
我在Direct2D下使用SharpDx开发Metro应用程序.我用了一些图片deviceContext.如何将我的图片保存到png文件?
D2D1是Win32中Direct2D技术的命名空间.但是我不明白这个名字的词源.该D2D部分最有可能是指d I整流器 2D,但最后1个谜题我...
也有不少与"1"类作为后缀:IDWriteFactory1,IDWriteFont1,IDWriteTextLayout1等-什么是他们的目的,并从差异无后缀的相似的对象?
我正在创建一个 Direct2D 应用程序,API 概述页面显示第一步是创建一个工厂...我尝试使用此函数
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);
Run Code Online (Sandbox Code Playgroud)
但它给出了错误
Error 62 error LNK2019: unresolved external symbol _D2D1CreateFactory@16 referenced in function "long __cdecl D2D1CreateFactory(enum D2D1_FACTORY_TYPE,struct _GUID const &,void * *)" (?D2D1CreateFactory@@YAJW4D2D1_FACTORY_TYPE@@ABU_GUID@@PAPAX@Z
Run Code Online (Sandbox Code Playgroud)
我从 WinMain 函数中调用 D2D1CreateFactory 函数。
这就是我初始化工厂指针的方式
ID2D1Factory *factory;
Run Code Online (Sandbox Code Playgroud)
这些是包含目录和库目录
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86
Run Code Online (Sandbox Code Playgroud)
我有使用 direct3D 的经验,所以我熟悉设备和渲染目标,但我的印象是对于 direct2D 工厂是第一位的,所以我没有创建任何设备、渲染目标等...
任何帮助表示赞赏。
.abcd我正在尝试为文件类型(如下所示)创建一个 Windows 预览处理程序,该处理程序根据所选文件的内容使用 GDI+ 和 Direct2D 在预览窗口中进行绘制。我使用了 Microsoft 给出的示例,在此处进行了解释,并使用此处给出的代码示例。.abcd虽然这原则上有效(请参阅下面的简化示例),但我遇到了仅对每个其他单击的文件显示预览的问题;在其他情况下,会出现错误“无法预览此文件”。微软的例子中并非如此,可能与加载/卸载资源有关。
我依靠 Direct2D 从文件内容高效地创建位图图形,而如果需要,可以在预览中省略 GDI+ 并用 Direct2D 组件替换。
下面给出了一个精简但仍然全面的代码示例。dll.cpp它由和两个文件组成main.cpp,其中dll.cpp处理预览处理程序的注册。使用 Visual Studio 2022,可以按如下方式执行该示例:
RecipePreviewHandler.cpp为main.cpp下面给出的。dll.cpp为下面的代码。.abcd通过在构建文件夹中的 Powershell 中运行来注册文件的预览处理程序regsvr32.exe RecipePreviewHandler.dll,然后重新启动“资源管理器”进程。.abcd文件,单击它们,然后观察上述预览窗格的行为。regsvr32.exe /u RecipePreviewHandler.dll在 Powershell 中运行并重新启动“prevhost”进程来取消注册预览处理程序。在尝试解决该问题时,我发现删除可以消除上述问题,但在调整预览窗格大小以及在文件之间切换时(其中多个文件的预览相互重叠)PostQuitMessage(0);会在预览中引入许多工件(不适用于本示例) .abcd,但对于更复杂和变化的绘图)。由于我现在真的不知道该怎么办,该如何解决呢?
main.cpp:
#define _CRT_SECURE_NO_WARNINGS
#include <shlwapi.h>
#include <shobjidl.h>
#include <gdiplus.h>
#include <new>
#include <windows.h> …Run Code Online (Sandbox Code Playgroud) 我可以使用以下代码为 IWICBitmap 创建 ID2D1RenderTarget...
D2D1_FACTORY_OPTIONS options;
ZeroMemory(&options, sizeof(D2D1_FACTORY_OPTIONS));
#if defined(_DEBUG)
// If the project is in a debug build, enable Direct2D debugging via SDK Layers
options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;
#endif
ThrowIfFailed(D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
__uuidof(ID2D1Factory1),
&options,
&m_d2dFactory
));
D2D1_RENDER_TARGET_PROPERTIES props;
props = D2D1::RenderTargetProperties();
m_d2dFactory->CreateWicBitmapRenderTarget(m_pTheBitmap.Get(), &props, &m_target);
Run Code Online (Sandbox Code Playgroud)
但如果我想将 ID2D1Effect 应用于此位图,只有当我有 ID2D1DeviceContext 时才可以这样做。如何获取 IWICBitmap 的 ID2D1DeviceContext?
我正在尝试将刚刚从压缩文件中提取到内存中的图像文件(png,但可以是任何内容)转换为 ID2D1Bitmap 以使用 Direct 2D 进行绘制。我试图寻找一些文档,但我只能找到接收“const char* path”或询问我图像的宽度和高度的方法,而我事先无法知道。在谷歌上搜索它让我无处可去。
该文件是内存中的原始文件,我想避免将图像提取到硬盘中并放入临时文件中,只是为了从那里读取数据。
有任何想法吗?
我需要捕获给定窗口HWND句柄的窗口屏幕并将捕获结果存储在ID2D1Bitmap对象中,以便通过渲染目标绘制此位图。
我怎样才能达到这个结果?
我正在开发一个需要修改屏幕上已有内容的程序。所以我只有一个ID2D1Bitmap我使用创建的pRenderTarget->CopyFromRenderTarget。
我想做的是将效果应用于该位图。效果只会返回ID2D1Image,但我需要有一个ID2D1Bitmap.
有没有办法做到这一点?
编辑1:
ID2D1Bitmap* myBitmap //the bitmap I want to apply the effect to
ID2D1Effect* effect = NULL;
pDeviceContext->CreateEffect(CLSID_D2D1Saturation, &effect);
effect->SetValue(D2D1_SATURATION_PROP_SATURATION, 0.0f);
effect->SetInput(0, myBitmap);
ID2D1Image* pImg = NULL;
effect->GetOutput(&pImg);
Run Code Online (Sandbox Code Playgroud)
如果我投射此图像,getPixelSize() 会引发访问冲突。