首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EmfToWmfBits api总是返回0

EmfToWmfBits api总是返回0
EN

Stack Overflow用户
提问于 2019-09-09 04:08:28
回答 1查看 193关注 0票数 0

我想使用EmfToWmfBits api。首先,我将尝试创建一个Metafile类,然后调用这个api。我认为问题在于我创建这门课的方式。

代码语言:javascript
复制
 Metafile myMetafile(szArglist[1]);

这种方式给出了对象myMetafile,但它不包含任何内容。我的意思是这个对象中的本地映像是NULL,它应该指向我磁盘上的图元文件。因此,稍后当我调用EmfToWmfBits api时,它给了我零。

我想问题可能是Metafile类应该使用wchar字符串。磁盘上的文件名不是wchar?我试过这样做。

代码语言:javascript
复制
 Metafile myMetafile(L"bird.emf");

还有这个。

代码语言:javascript
复制
 Metafile myMetafile(L"鸟.emf");

我确信emf文件与exe位于同一个目录中。但他们都失败了。

这是我使用的代码。

代码语言:javascript
复制
#include <iostream>
#include <stdio.h>
#include <WINDOWS.H>
#include <shellapi.h>
#include <gdiplus.h>

#pragma comment(lib,"gdiplus.lib")
#pragma comment(lib, "shell32.lib")

using namespace Gdiplus;


int main(int argc, char **argv)
{
    UINT size1 = 0;
    int argcount;
    LPWSTR* szArglist;

    if (argc < 2) {
        std::cout << "Please input a file name" << std::endl;
        return 0;
    }


    szArglist = CommandLineToArgvW(GetCommandLineW(), &argcount);
    Metafile myMetafile(szArglist[1]);
    LocalFree(szArglist);
    HENHMETAFILE hEmf = myMetafile.GetHENHMETAFILE();
    size1 = Metafile::EmfToWmfBits(
        hEmf,
        0,
        NULL,
        MM_ANISOTROPIC,
        EmfToWmfBitsFlagsEmbedEmf);
    std::cout << size1 << std::endl;

}

通常,这个EmfToWmfBits api应该返回转换文件的长度。这个api的细节在这里。https://learn.microsoft.com/en-us/windows/win32/api/gdiplusheaders/nf-gdiplusheaders-metafile-emftowmfbits,如果有人能在这里帮助我,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 06:38:07

您需要初始化GDI+。

GdiplusStartup函数初始化GDI+。在进行任何其他GdiplusStartup调用之前调用GDI+,并在使用完GDI+后调用GdiplusShutdown。

添加:

代码语言:javascript
复制
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

这是修改后的代码,仅供参考。

代码语言:javascript
复制
#include <iostream>
#include <stdio.h>
#include <WINDOWS.H>
#include <shellapi.h>
#include <gdiplus.h>
#include <Shlwapi.h>

#pragma comment (lib,"Shlwapi.lib")
#pragma comment(lib,"gdiplus.lib")
#pragma comment(lib, "shell32.lib")

using namespace Gdiplus;

int main(int argc, char **argv)
{
    UINT size1 = 0;
    WCHAR path[MAX_PATH];

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    GetModuleFileNameW(NULL, path, MAX_PATH);
    PathRemoveFileSpecW(path);
    PathAppendW(path, L"temp.emf");
    Metafile myMetafile(path);

    HENHMETAFILE hEmf = myMetafile.GetHENHMETAFILE();
    size1 = Metafile::EmfToWmfBits(
        hEmf,
        0,
        NULL,
        MM_ANISOTROPIC,
        EmfToWmfBitsFlagsEmbedEmf);
    std::cout << size1 << std::endl;
    GdiplusShutdown(gdiplusToken);
    return 0;
}

我使用GetModuleFileNameW检索包含指定模块的文件的完全限定路径。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57847769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档