Question

Je suis en train d'obtenir un dialogue openfile pour afficher sur Windows CE 6.0 selon msdn, il est le même processus que dans win32, mais il ne fonctionne pas. Je soumets à l'examen de la partie interressant du code:

#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.
}
Était-ce utile?

La solution

LPOPENFILENAME opendialog;
mb_char_t szFile[260];

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

Vous déclarez une pointeur à une structure OPENFILENAME ici, et l'allocation de mémoire pour elle.

Vous devriez être en mesure d'allouer OPENFILENAME sur pile directement, comme suit:

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

Autres conseils

Voici un problème:

opendialog->lStructSize = sizeof (LPOPENFILENAME);

Cela définir la taille de struct à la taille d'un pointeur, ce qui est 4 dans votre cas. Vous devriez avoir:

opendialog->lStructSize = sizeof (OPENFILENAME);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top