以下代码是我的应用程序的一部分。
我想使用编辑框从文件保存对话框中获取一个值。
所以我用AddEditBox函数和GetEditBoxText返回值。
我在编辑框中输入“ 2000.0”,但rturn值为空。
问题是什么?

wstring GetSaveFileForMakeDif(double & MinDistance) {

    const DWORD CONTROL_GROUP = 5001;
    const DWORD CONTROL_LABEL = 5002;
    const DWORD CONTROL_EDITBOX_MINDIST = 5003;

    wstring ret(L"");

    HRESULT hr = S_FALSE;
    IFileDialogCustomize *pfdc = NULL;
    // Create a new common open file dialog.
    IFileSaveDialog *pfd = NULL;
    hr = CoCreateInstance(CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
    if (SUCCEEDED(hr))
    {

        DWORD dwOptions;
        hr = pfd->GetOptions(&dwOptions);

        // Set the title of the dialog.
        if (SUCCEEDED(hr)) {
            hr = pfd->SetTitle(L"Select Files");
            hr = pfd->SetFileName(L"outputfile");
            hr = pfd->SetDefaultExtension(L"txt");
        }

        // Set up the customization.
        hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdc));
        if (SUCCEEDED(hr))
        {
            hr = pfdc->StartVisualGroup(CONTROL_GROUP, L"");
            if (SUCCEEDED(hr))
                hr = pfdc->AddText(CONTROL_LABEL, L"Min Distance:");
            if (SUCCEEDED(hr))
                hr = pfdc->AddEditBox(CONTROL_EDITBOX_MINDIST, L"2000.0");

            pfdc->EndVisualGroup();
        }




        // Show the open file dialog.
        if (SUCCEEDED(hr))
        {
            hr = pfd->Show(hMainWindow);
            if (SUCCEEDED(hr))
            {
                IShellItem *psi = NULL;
                hr = pfd->GetResult(&psi);

                wchar_t *pszPath = new wchar_t[MAX_PATH];
                psi->GetDisplayName(SIGDN_FILESYSPATH, &pszPath);

                if (SUCCEEDED(hr))
                {
                    ret = pszPath;
                    wchar_t   *  txt = NULL;
                    hr = pfdc->GetEditBoxText(CONTROL_EDITBOX_MINDIST, &txt);
                    //txt return L""
                    MinDistance = _wtof(txt);
                }
            }
        }

        pfd->Release();
    }

    pfdc->Release();

    return ret;
};

最佳答案

在对话框关闭之前,需要进行事件处理以捕获值。

这里有完整的MSDN示例:
Common File Dialog Sample

目前,下载链接似乎不可用。以下示例显示了如何在OnFileOk中捕获事件

请注意,您需要CoTaskMemFree释放由GetEditBoxText分配的内存

#include <windows.h>
#include <shobjidl.h>
#include <shlwapi.h>
#include <new>

#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

#pragma comment(lib, "Shlwapi.lib")

// Controls
#define CONTROL_GROUP 2000
#define CONTROL_LABEL 5002
#define CONTROL_EDITBOX_MINDIST 5003

class CDialogEventHandler : public IFileDialogEvents,   public IFileDialogControlEvents
{
public:
    // IUnknown methods
    IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) {
        static const QITAB qit[] = {
            QITABENT(CDialogEventHandler, IFileDialogEvents),
            QITABENT(CDialogEventHandler, IFileDialogControlEvents),
            { 0 },
        };
        return QISearch(this, qit, riid, ppv);
    }

    IFACEMETHODIMP_(ULONG) AddRef() {
        return InterlockedIncrement(&_cRef);
    }

    IFACEMETHODIMP_(ULONG) Release()    {
        long cRef = InterlockedDecrement(&_cRef);
        if (!cRef)
            delete this;
        return cRef;
    }

    // IFileDialogEvents methods
    IFACEMETHODIMP OnFileOk(IFileDialog *pfd);

    IFACEMETHODIMP OnFolderChange(IFileDialog *) { return S_OK; };
    IFACEMETHODIMP OnFolderChanging(IFileDialog *, IShellItem *) { return S_OK; };
    IFACEMETHODIMP OnHelp(IFileDialog *) { return S_OK; };
    IFACEMETHODIMP OnSelectionChange(IFileDialog *) { return S_OK; };
    IFACEMETHODIMP OnShareViolation(IFileDialog *, IShellItem *, FDE_SHAREVIOLATION_RESPONSE *) { return S_OK; };
    IFACEMETHODIMP OnTypeChange(IFileDialog *) { return S_OK; };
    IFACEMETHODIMP OnOverwrite(IFileDialog *, IShellItem *, FDE_OVERWRITE_RESPONSE *) { return S_OK; };

    // IFileDialogControlEvents methods
    IFACEMETHODIMP OnItemSelected(IFileDialogCustomize *, DWORD, DWORD) { return S_OK; };
    IFACEMETHODIMP OnButtonClicked(IFileDialogCustomize *, DWORD) { return S_OK; };
    IFACEMETHODIMP OnCheckButtonToggled(IFileDialogCustomize *, DWORD, BOOL) { return S_OK; };
    IFACEMETHODIMP OnControlActivating(IFileDialogCustomize *, DWORD) { return S_OK; };

    CDialogEventHandler() : _cRef(1) { };
private:
    ~CDialogEventHandler() { };
    long _cRef;
};

// Instance creation helper
HRESULT CDialogEventHandler_CreateInstance(REFIID riid, void **ppv)
{
    *ppv = NULL;
    CDialogEventHandler *pDialogEventHandler = new (std::nothrow) CDialogEventHandler();
    HRESULT hr = pDialogEventHandler ? S_OK : E_OUTOFMEMORY;
    if (SUCCEEDED(hr))
    {
        hr = pDialogEventHandler->QueryInterface(riid, ppv);
        pDialogEventHandler->Release();
    }
    return hr;
}

//EDIT BEGIN  ***************************
// IFileDialogEvents methods
IFACEMETHODIMP CDialogEventHandler::OnFileOk(IFileDialog *fileDialog)
{
    IFileDialogCustomize *fileCustomize = NULL;
    fileDialog->QueryInterface(IID_PPV_ARGS(&fileCustomize));

    wchar_t *buf;
    fileCustomize->GetEditBoxText(IDC_EDTI1, &buf);
    MessageBox(0, buf, 0, 0);
    CoTaskMemFree(buf);

    fileCustomize->Release();
    return S_OK;
}
//EDIT END  *****************************

// This code snippet demonstrates how to add custom controls in the Common File Dialog.
HRESULT AddCustomControls()
{
    // CoCreate the File Open Dialog object.
    IFileDialog *pfd = NULL;
    HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
    if (SUCCEEDED(hr))
    {
        // Create an event handling object, and hook it up to the dialog.
        IFileDialogEvents   *pfde = NULL;
        DWORD               dwCookie = 0;
        hr = CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&pfde));
        if (SUCCEEDED(hr))
        {
            // Hook up the event handler.
            hr = pfd->Advise(pfde, &dwCookie);
            if (SUCCEEDED(hr))
            {
                // Set up a Customization.
                IFileDialogCustomize *pfdc = NULL;
                if (SUCCEEDED(pfd->QueryInterface(IID_PPV_ARGS(&pfdc))))
                {
                    pfdc->StartVisualGroup(CONTROL_GROUP, L"");
                    pfdc->AddText(CONTROL_LABEL, L"Min Distance:");
                    pfdc->AddEditBox(CONTROL_EDITBOX_MINDIST, L"2000.0");
                    pfdc->EndVisualGroup();
                    pfdc->Release();
                }
                else
                {
                    // Unadvise here in case we encounter failures before we get a chance to show the dialog.
                    pfd->Unadvise(dwCookie);
                }
            }
            pfde->Release();
        }

        if (SUCCEEDED(hr))
        {
            // Now show the dialog.
            hr = pfd->Show(NULL);
            if (SUCCEEDED(hr))
            {
                // You can add your own code here to handle the results.
            }
            // Unhook the event handler.
            pfd->Unadvise(dwCookie);
        }
        pfd->Release();
    }
    return hr;
}

int APIENTRY wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    AddCustomControls();
    CoUninitialize();
    return 0;
}

10-08 00:32