gpt4 book ai didi

windows - 可以指定 IFileDialog 的起始位置吗?

转载 作者:可可西里 更新时间:2023-11-01 12:39:45 24 4
gpt4 key购买 nike

我在 Microsoft 文档中找不到任何内容,所以我想知道是否有人知道,是否可以指定 IFileDialog 的起始位置?具体来说,我希望第一次打开对话框时,它会在父窗口的中央打开。

除了以某种方式挂接到底层 WM_* 消息之外,我没有看到一种直接的方法来执行此操作。

是否可以使用类似 SetWindowPos 的东西?

最佳答案

shell 的 IFileDialog 实现支持 IOleWindow接口(interface)(注意它似乎没有被记录......)。但是必须先打开对话框才能获取其窗口句柄。

所以诀窍是使用 IFileDialogEvents 订阅对话框的事件界面,获取窗口句柄,然后移动它,如下例所示。我选择 OnSelectionChange 因为它似乎是个好地方。当然这是要适应的(您不想在每次选择更改时移动窗口...)。

class Events : public IFileDialogEvents
{
// poor man's IUnknown implementation :-)
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) { *ppvObject = NULL; return E_NOINTERFACE; }
STDMETHODIMP_(ULONG) AddRef() { return 1; };
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP OnFileOk(IFileDialog *pfd) { return S_OK; }
STDMETHODIMP OnFolderChanging(IFileDialog *pfd, IShellItem *psiFolder) { return S_OK; }
STDMETHODIMP OnShareViolation(IFileDialog *pfd, IShellItem *psi, FDE_SHAREVIOLATION_RESPONSE *pResponse) { return S_OK; }
STDMETHODIMP OnTypeChange(IFileDialog *pfd) { return S_OK; }
STDMETHODIMP OnOverwrite(IFileDialog *pfd, IShellItem *psi, FDE_OVERWRITE_RESPONSE *pResponse) { return S_OK; }
STDMETHODIMP OnFolderChange(IFileDialog *pfd) { return S_OK; }

STDMETHODIMP OnSelectionChange(IFileDialog *pfd) {
IOleWindow *window;
if (SUCCEEDED(pfd->QueryInterface(&window)))
{
HWND hwnd;
if (SUCCEEDED(window->GetWindow(&hwnd)))
{
MoveWindow(hwnd, 0, 0, 600, 600, FALSE);
}
window->Release();
}
return S_OK;
}
};

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
CoInitialize(NULL);
IFileOpenDialog *dlg;
if (SUCCEEDED(CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_PPV_ARGS(&dlg))))
{
DWORD cookie;
Events *evts = new Events();
dlg->Advise(evts, &cookie);
dlg->Show(NULL);
dlg->Unadvise(cookie);
dlg->Release();
delete evts;
}
CoUninitialize();
}

关于windows - 可以指定 IFileDialog 的起始位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com