我使用示例中的代码来创建一个对话框:
PWSTR MultiselectInvoke(HWND hwnd)
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED |
COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
IFileOpenDialog* pFileOpen;
// Create the FileOpenDialog object.
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL,
IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));
if (SUCCEEDED(hr))
{
// Show the Open dialog box.
hr = pFileOpen->Show(NULL);
// Get the file name from the dialog box.
if (SUCCEEDED(hr))
{
IShellItem* pItem;
hr = pFileOpen->GetResult(&pItem);
if (SUCCEEDED(hr))
{
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
// Display the file name to the user.
if (SUCCEEDED(hr))
{
//MessageBox(NULL, pszFilePath, L"File Path", MB_OK);
//CoTaskMemFree(pszFilePath);
}
pItem->Release();
}
}
pFileOpen->Release();
}
CoUninitialize();
}
return pszFilePath;
}
该函数返回文件的路径。然后我尝试将其替换为 LoadImage () 函数:
hDC = GetDC(hWND);
CompatibleDC = CreateCompatibleDC(hDC);
SelectObject(CompatibleDC, hPen);
HANDLE HndBitmap;
HndBitmap = LoadImage(NULL,path, IMAGE_BITMAP, 905, 677, LR_LOADFROMFILE);
GetObject(HndBitmap, sizeof(BITMAP), &Bitmap);
SelectObject(CompatibleDC, HndBitmap);
StretchBlt(hDC, 0, 0, 1000, 800, CompatibleDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);
但是什么也没有发生,图像不会出现,只有手动输入“D:\img.bmp”之类的路径。还有其他注意事项——文件上传窗口以 D:\ 的形式返回路径,而它似乎是用两个斜杠 \ 写的,也许这是问题所在?还是需要执行一些操作退出应用程序文件夹(如//..//),然后才输入完整路径?像 D:\img.bmp?
显然,该功能最初
MultiselectInvoke允许用户选择一组文件并可能打印它们的名称。然后有人尽可能地对其进行了重新设计-它仍然选择了一组文件,但只给出了一个名称。但最重要的是,它给出的不是完整路径,而是一个友好的文件名,它并不总是与真实名称匹配,当然也不包含文件的路径。程序找不到该名称的任何文件也就不足为奇了。
总的来说,扔掉这个杰作,不如尝试一些更简单的东西。例如,
TRUE如果成功并且FALSE用户单击了取消,则返回。像这样调用: