2009-07-21 92 views
0

我試圖得到一個開放文件對話框,顯示在Windows CE 6.0根據msdn它是在win32相同的過程,但它不起作用。我提交審查interresting部分代碼:如何在Windows上顯示打開文件對話框?

#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
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

這裏有一個問題:

opendialog->lStructSize = sizeof (LPOPENFILENAME); 

將在結構大小設置爲指針,這是你的情況4的大小。你應該有:

opendialog->lStructSize = sizeof (OPENFILENAME); 
相關問題