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

时间:2009-07-21 12:34:13

标签: windows visual-c++ windows-ce getopenfilename

我正在尝试根据msdn获取一个openfile对话框以显示在Windows CE 6.0上它与win32中的进程相同,但它不起作用。我提交审查代码的有趣部分:

#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 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:1)

这是一个问题:

opendialog->lStructSize = sizeof (LPOPENFILENAME);

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

opendialog->lStructSize = sizeof (OPENFILENAME);