簡體   English   中英

EmfToWmfBits API始終返回0

[英]EmfToWmfBits api always returns 0

我想使用EmfToWmfBits api。 首先,我將嘗試創建一個圖元文件類,然后調用此api。 我認為問題出在創建類的方式上。

 Metafile myMetafile(szArglist[1]);

這種方式給了我對象myMetafile,但它不包含任何內容。 我的意思是該對象中的nativeimage是NULL,應該指向磁盤上的圖元文件。 因此,稍后調用EmfToWmfBits api時,它的值為零。

我猜可能是Metafile類應該使用wchar字符串。 而且磁盤上的文件名不是wchar? 我嘗試過這樣。

 Metafile myMetafile(L"bird.emf");

還有這個。

 Metafile myMetafile(L"鳥.emf");

我確定emf文件與exe位於同一目錄中。 但是他們都失敗了。

這是我使用的代碼。

#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://docs.microsoft.com/zh-cn/windows/win32/api/gdiplusheaders/nf-gdiplusheaders-metafile-emftowmfbits如果有人可以在這里幫助我,我將不勝感激。

您需要初始化GDI +。

GdiplusStartup函數初始化Windows GDI +。 在進行任何其他GDI +調用之前,請先調用GdiplusStartup,並在使用完GDI +后再調用GdiplusShutdown。

加:

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

這是修改后的代碼,僅供參考。

#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檢索包含指定模塊的文件的標准路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM