如何在c ++中的可执行文件附近的文件夹中打开图像

Posted

技术标签:

【中文标题】如何在c ++中的可执行文件附近的文件夹中打开图像【英文标题】:How to open image in folder near executable in c++ 【发布时间】:2019-07-18 11:31:34 【问题描述】:

我在 c++ Win32 中设置了一个简单的窗口,它将 GIF 动画显示为背景。该文件位于executable+gifs\test.gif 目录下。 以及如何拆分可执行文件名称然后附加其他路径???? 我该怎么做?

我已经尝试过给出完整的 gif 路径并且它可以工作,但它不会在另一台计算机上工作。

#define DRAW_ANIM   1
static HWND hWnd;
static HDC hMWDC;
static Graphics* pGphcs = NULL;
static Image* pImg = NULL;
static unsigned int nFrm = 0, nFrmCnt = 0;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 


    switch (msg) 
    case WM_CREATE: 

        hMWDC = GetDC(hwnd);
            pGphcs = new Graphics(hMWDC);

            pImg = new Image(L"gifs\\test.gif");
            if (pImg) 
                nFrmCnt = pImg->GetFrameCount(&FrameDimensionTime);
                SetTimer(hwnd, DRAW_ANIM, 100, NULL);

            

        break;

    case WM_TIMER:
        if (wParam == DRAW_ANIM)
        
            pImg->SelectActiveFrame(&FrameDimensionTime, nFrm);
            Rect DRC(0, 0, pImg->GetWidth(), pImg->GetHeight());
            pGphcs->Clear(Color(128, 128, 128));
            pGphcs->DrawImage(pImg, DRC);
            if (nFrm < (nFrmCnt - 1)) nFrm++; else nFrm = 0;
        
        break;

    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:

    delete pGphcs;
        delete pImg;
        ReleaseDC(hwnd, hMWDC);
        KillTimer(hwnd, DRAW_ANIM);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    
    return 0;

我希望显示 gif,但什么也没有。 ;(

【问题讨论】:

How to get the application executable name in WindowsC++/CLI?的可能重复 没有。我的问题很接近,但我被问到另一个结果并获取 gif Executable Path.Split(EXECUTABLE NAME).append(other path))。 那你的问题应该是“如何分割路径”,在SO上已经回答过很多次了。 哦,是的。我没看到。我不想重复 【参考方案1】:

不要使用相对路径加载文件。请改用绝对路径。使用 GetModuleFileName() 获取 EXE 的完整路径,然后去掉文件名部分并附加 GIF 的相对路径。

#include <shlwapi.h>

WCHAR path[MAX_PATH];
GetModuleFileNameW(NULL, path, MAX_PATH);
PathRemoveFileSpecW(path);
PathAppendW(path, L"gifs\\test.gif");
pImg = new Image(path);

【讨论】:

次要的挑剔...小心PathAppend 函数,&lt;pathcch.h&gt; 中有更新和“更安全”的函数 @Mgetz 我知道“更安全”的那些。但请注意,它们仅适用于 Windows 8+。很多开发者(包括我自己)仍然支持旧版本,至少是 Windows 7 但是你能帮忙解决一个问题吗? 有一个灰色的矩形,最小化窗口的大小。我在 SW_SHOWMAXIMAZED 中显示窗口。文本框和按钮隐藏在 gif 后面。我该如何解决? @TheGamerCoder 这些问题与此问题中提出的问题不同。您应该为他们发布新问题。【参考方案2】:

您需要让计时器产生WM_PAINT 消息(例如,通过调用InvalidateRect())并绘制当前帧以响应该消息。

另外,回复WM_ERASEBKGND 并且不要擦除背景(返回非零)。

【讨论】:

Emm...案例WM_PAINT:

以上是关于如何在c ++中的可执行文件附近的文件夹中打开图像的主要内容,如果未能解决你的问题,请参考以下文章

vc 如何查看dll文件

如何逐条读出文件中的sql语句并且在sqlite3中批量执行 c、C++都可以

如何在二进制文件C中查找字节

emacs中,怎么样将文件列表中的文件在另一个窗口打开?

如何使用 Xcode 编译 C 程序,以便在沙箱中使用二进制文件?

如图,电脑文件【打开方式有乱码】,如何清除乱码?