举报

通过网络上的方法调用文件资源管理器实现获取文件路径操作后,loadimage函数无法正常运行

0

操作系统win11,vs2012

#include <windows.h>
#include <Commdlg.h>
#include <stdio.h>
#include<graphics.h>

int FileDialog(char *path);

int main(char argc, char *argv[])
{
	int i=0,num=0;

	char szFile[MAX_PATH] = {0};
	FileDialog(szFile);     //1
	printf("%s",szFile);    //2如果删除这两行代码(即不调用这个函数),画布上能正常出现图片
	initgraph(640,480,EX_SHOWCONSOLE | EX_NOCLOSE);
	loadimage(NULL, _T("res/screenbk.png"));
	getchar();
    return 0;
}


// 通过 path 返回获取的路径
int FileDialog(char *path)
{
	OPENFILENAME ofn;
	ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn); // 结构大小
    ofn.lpstrFile = path; // 路径
    ofn.nMaxFile = MAX_PATH; // 路径大小
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; // 文件类型
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
	return GetOpenFileName(&ofn);
}
C++
ava
吾愿

2022-12-25

据说是win11的锅... -  吾愿  2022-12-25
举报
1 win10 vs2022 测试没问题 .. -  xiongfj ◑◑  2022-12-25
举报
举报
0

将 loadimage(NULL, _T("res/screenbk.png")); 修改为绝对路径试试。

有可能 FileDialog 会修改“当前路径”,导致相对路径读取出现问题。如果使用绝对路径没有问题,那就是这个原因造成的。

可以这样修改:

获取 .exe 文件的路径,得到 .exe 所在路径,然后再手动拼接上相对路径,得到绝对路径,由此避开 FileDialog 对相对路径的影响。

代码如下:

TCHAR lpFileName[_MAX_PATH];
::GetModuleFileName(NULL, lpFileName, _MAX_PATH);	// 获得含有 .exe 文件名的完整路径
(_tcsrchr(lpFileName, '\\'))[1] = 0; 				// 获得 .exe 所在路径(包含结尾 \)
_tcscat_s(lpFileName, _T("res\\screenbk.png"));		// 拼接相对路径
loadimage(NULL, lpFileName);						// 读取图片
ava
慢羊羊

2022-12-26

技术讨论社区