代码之家  ›  专栏  ›  技术社区  ›  amirouche

如何在windows上显示openfile对话框?

  •  0
  • amirouche  · 技术社区  · 17 年前

    #include <windows.h>
    #include <commctrl.h>
    #include <winuser.h>
    #include <stdio.h>
    #include <Commdlg.h>
    
    /* Prototypes */
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    HWND create_window(int width, int height) ;
    void resize_window(int width, int height) ;
    
    HWND    g_hWindow ;
    
    /* Function to modify the host window size to match the size of the movie. */
    void resize_window(int width, int height)
    {
       RECT r;
       r.left = r.top = 0;
       r.right = width ;
       r.bottom  = height ;
       AdjustWindowRectEx(&r,WS_BORDER,false,WS_EX_CLIENTEDGE);
       SetWindowPos(g_hWindow, NULL, 0,0,r.right, r.bottom,SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER);
    }
    
    
    HWND create_window(int width, int height)
    {
       WNDCLASS wce; // A Window class in Windows CE
    
       wce.style         = CS_VREDRAW | CS_HREDRAW; 
       wce.lpfnWndProc   = (WNDPROC) WndProc; 
       wce.cbClsExtra    = 0; 
       wce.cbWndExtra    = 0; 
       wce.hInstance     = GetModuleHandle(NULL); 
       wce.hIcon         = LoadIcon((HINSTANCE) NULL, (LPCWSTR)MB_ICONQUESTION);
       wce.hCursor       = LoadCursor((HINSTANCE) NULL, IDC_ARROW); 
       wce.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
       wce.lpszMenuName  = 0;
       wce.lpszClassName = _TEXT("TEST");
    
       if (!RegisterClass(&wce)) return 0; 
    
       RECT r;
       r.left = r.top = 0;
       r.right = width ;
       r.bottom  = height ;
       AdjustWindowRectEx(&r,WS_BORDER,false,WS_EX_CLIENTEDGE);
    
      // Create the window
       g_hWindow = CreateWindowEx(
          0,          // Ex Styles
          WS_BORDER,      // creates a window that has a thin-line border with no title bar
          CW_USEDEFAULT,  // x
          CW_USEDEFAULT,  // y
          r.right-r.left,  // Height
          r.bottom-r.top,  // Width
          NULL,           // Parent Window
          NULL,           // Menu, or windows id if child
          GetModuleHandle(NULL),      // 
          NULL            // Pointer to window specific data
          );
    
       ShowWindow( g_hWindow, SW_SHOW  ); // make the window visible on the display
    
       return g_hWindow ;
    }
    
    /* 
     * Messaging function call back from Windows CE that is passed as 
     * an argument when the window is created
     */
    LRESULT CALLBACK WndProc(HWND   hWnd,
                             UINT   msg,
                             WPARAM wParam,
                             LPARAM lParam ) 
    {
    
       switch( msg ) 
       {
        case WM_ACTIVATEAPP:
    
    
                // Invalidate to get new text painted.
            this->Invalidate();
            break;
    
        case WM_DESTROY:
            PostQuitMessage(0);
            break;   
    
        case WM_CREATE:
            LPOPENFILENAME opendialog;
            wchar_t szFile[260];
    
    
            opendialog = (LPOPENFILENAME) malloc(sizeof (LPOPENFILENAME));
            opendialog->lStructSize = sizeof (LPOPENFILENAME);
            opendialog->hwndOwner = g_hWindow;
            opendialog->hInstance = GetModuleHandle(NULL);
            *szFile = (char_t)_TEXT("\0");
            opendialog->lpstrFile = szFile;
            opendialog->nFilterIndex = 0;
            opendialog->nMaxFile = 256;
            opendialog->lpstrInitialDir = NULL;
            opendialog->Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
            GetOpenFileName(opendialog);
    
    
        default:
            return DefWindowProc( hWnd, msg, wParam, lParam);
       } 
       return 0;
    }
    
    /* Function to hide (or make visible) the taskbar so that the player has the full display */
    void set_display(bool set_full)
    {
       HWND hwndTaskbar = ::FindWindow(L"HHTaskBar", NULL);
       if (set_full)
       {
           ::ShowWindow(hwndTaskbar, SW_HIDE); 
       }
       else
       {
           ::ShowWindow(hwndTaskbar, SW_SHOW); 
       }
       g_full_scrn = set_full;
    }
    
    
    int _cdecl WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR argv, int argc )
    {
    
       memset(&g_gfx_context,0,sizeof(g_gfx_context));
       create_window(1, 1); // This is a windows CE specific call.
    }
    
    2 回复  |  直到 17 年前
        1
  •  2
  •   Kim Gräsman    17 年前
    LPOPENFILENAME opendialog;
    mb_char_t szFile[260];
    
    opendialog = (LPOPENFILENAME) mb_malloc(sizeof (LPOPENFILENAME));
    opendialog->lStructSize = sizeof (LPOPENFILENAME);
    

    您正在声明 指针 将其转换为OPENFILENAME结构,并为其分配内存。

    您应该能够直接在堆栈上分配OPENFILENAME,如下所示:

    OPENFILENAME opendialog = {0};
    mb_char_t szFile[260] = {0};
    
    opendialog.lStructSize = sizeof (opendialog);
    opendialog.hwndOwner = g_hWindow;
    opendialog.hInstance = GetModuleHandle(NULL);
    opendialog.lpstrFile = szFile;
    opendialog.nFilterIndex = 0;
    opendialog.nMaxFile = 256;
    opendialog.lpstrInitialDir = NULL;
    opendialog.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    GetOpenFileName(&opendialog);
    
        2
  •  1
  •   RichieHindle    17 年前

    这里有一个问题:

    opendialog->lStructSize = sizeof (LPOPENFILENAME);
    

    这将把结构体大小设置为指针的大小,在您的情况下为4。您应该:

    opendialog->lStructSize = sizeof (OPENFILENAME);