2009-07-21 5 views
0

나는 win32에서와 같은 프로세스이지만 msdn에 따라 Windows CE 6.0에 나타나는 openfile 대화 상자를 얻으려고하고 있지만 작동하지 않습니다. 나는 코드의 검토를 위해 인터 휴식 일부를 제출Windows에서 openfile 대화 상자를 표시하는 방법은 무엇입니까?

opendialog->lStructSize = sizeof (LPOPENFILENAME); 

귀하의 경우 4 포인터의 크기로 구조체의 크기를 설정합니다 :

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

여기에 문제가 있습니다. 당신은해야한다 : 당신은 여기 OPENFILENAME 구조에 포인터를 선언하고 메모리를 할당하는

opendialog->lStructSize = sizeof (OPENFILENAME); 
관련 문제