如何在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
函数,<pathcch.h>
中有更新和“更安全”的函数
@Mgetz 我知道“更安全”的那些。但请注意,它们仅适用于 Windows 8+。很多开发者(包括我自己)仍然支持旧版本,至少是 Windows 7
但是你能帮忙解决一个问题吗?
有一个灰色的矩形,最小化窗口的大小。我在 SW_SHOWMAXIMAZED 中显示窗口。文本框和按钮隐藏在 gif 后面。我该如何解决?
@TheGamerCoder 这些问题与此问题中提出的问题不同。您应该为他们发布新问题。【参考方案2】:
您需要让计时器产生WM_PAINT 消息(例如,通过调用InvalidateRect())并绘制当前帧以响应该消息。
另外,回复WM_ERASEBKGND 并且不要擦除背景(返回非零)。
【讨论】:
Emm...案例WM_PAINT:以上是关于如何在c ++中的可执行文件附近的文件夹中打开图像的主要内容,如果未能解决你的问题,请参考以下文章
如何逐条读出文件中的sql语句并且在sqlite3中批量执行 c、C++都可以