문제

MSDN에 따르면 Windows CE 6.0에 OpenFile 대화 상자를 얻으려고 노력하고 있습니다. 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.
}
도움이 되었습니까?

해결책

LPOPENFILENAME opendialog;
mb_char_t szFile[260];

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

당신은 a 바늘 여기에서 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);

다른 팁

다음은 문제가 있습니다.

opendialog->lStructSize = sizeof (LPOPENFILENAME);

구조물 크기를 포인터 크기로 설정합니다. 당신은 있어야합니다 :

opendialog->lStructSize = sizeof (OPENFILENAME);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top