【问题标题】:GetOpenFileName function is not opening the dialog boxGetOpenFileName 函数没有打开对话框
【发布时间】:2018-05-30 12:56:40
【问题描述】:

所以我有这个简单的代码,因为我是 win32 的新手,所以不要指望我会编写非常困难的代码,但是,这是我的 winProc

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY: PostQuitMessage (0); break;
        case WM_CREATE : make_controls(hwnd); break;
        case WM_COMMAND: handle_commands(hwnd, wParam, lParam); break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
} 

这是handle_commands函数

void handle_commands(HWND hwnd, WPARAM wp, LPARAM lp){
    if( HIWORD(wp) == BN_CLICKED && LOWORD(wp) == openBtn ){
// openBtn is the only button in the whole application 
        OPENFILENAME ofn;       // common dialog box structure
        char szFile[260];       // buffer for file name
        HWND hwnd;              // owner window
        HANDLE hf;              // file handle

// Initialize OPENFILENAME
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hwnd;
        ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
        ofn.lpstrFile[0] = '\0';
        ofn.nMaxFile = sizeof(szFile);
        ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
        ofn.nFilterIndex = 1;
        ofn.lpstrFileTitle = NULL;
        ofn.nMaxFileTitle = 0;
        ofn.lpstrInitialDir = NULL;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

// Display the Open dialog box.

        if (GetOpenFileName(&ofn)==TRUE)
            hf = CreateFile(ofn.lpstrFile,
                            GENERIC_READ,
                            0,
                            (LPSECURITY_ATTRIBUTES) NULL,
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            (HANDLE) NULL);
    }
}// this is the end of the handle_commands functions

但问题是它没有打开任何对话框

据我所知,互联网上的人都可以使用相同的代码成功打开。

是的!我已经包含了 commdlg.h 和相应的库

提前致谢!

【问题讨论】:

  • 并指定函数的版本(宽或ansi)
  • ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0" 你显然在使用ANSI!
  • @BarmakShemirani:该结论仅对 C++ 代码有效。这个问题被标记为c,并且由于您可以在 C 中分配不兼容的指针类型(没有编译器错误),因此该结论不成立。

标签: c++ winapi win32gui


【解决方案1】:

所以问题是在handle_commands中,hwnd已经改变了。这意味着OPENFILENAME 结构因此不知道它的正确所有者,尽管单击按钮触发了正确的代码,但它仍然没有打开对话框。

所以只需注释掉handle_commands 函数中的HWND hwnd

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2013-10-30
    相关资源
    最近更新 更多