2009-07-21 9 views
0

Ich versuche, einen Openfile-Dialog auf Windows CE 6.0 nach msdn zu erhalten, es ist der gleiche Prozess wie in Win32, aber es funktioniert nicht. Ich lege für die Überprüfung der interresting Teil des Codes:Wie zeigt man einen Openfile-Dialog in Windows an?

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

Antwort

2
LPOPENFILENAME opendialog; 
mb_char_t szFile[260]; 

opendialog = (LPOPENFILENAME) mb_malloc(sizeof (LPOPENFILENAME)); 
opendialog->lStructSize = sizeof (LPOPENFILENAME); 

Sie sind hier einen Zeiger auf eine OPENFILE Struktur deklarieren, und für sie das Zuweisen von Speicher.

Sie sollten in der Lage sein, auf OPENFILE Stapel direkt zuzuordnen, etwa so:

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

Hier ist ein Problem:

opendialog->lStructSize = sizeof (LPOPENFILENAME); 

, dass die Struktur Größe auf die Größe eines Zeigers eingestellt wird, die 4 in Ihrem Fall ist. Sie sollten:

opendialog->lStructSize = sizeof (OPENFILENAME);