Newsgroup: it.comp.programmare.win32
Titolo: Problema con GetOpenFileName e PeekMessage

Ciao a tutti.
Per prima cosa volevo presentarmi in quanto nuovo del newsgroup, e nuovo
anche alla programmazione c++.
Quasi nuovo diciamo, visto che qualcosina ho già fatto negli ultimi anni, ma
niente di troppo grosso...
 Mi sono avvicinato alla gestione delle finestre sotto windows da poco, ed
ho già un piccolo problema di cui non riesco a venire a capo.
Devo creare una finestra in cui far girare un motore grafico basato su
opengl, per cui per la gestione dei messaggi ho letto che l'ideale è il
metodo PeekMessage, non GetMessage che rimanendo in attesa rallenterebbe
l'applicazione.
Il problema sorge però quando da menu richiamo il metodo GetOpenFileName().
Infatti, quando eseguo questo usando come gestore dei messaggi GetMessage,
funziona tutto bene.
quando invece uso peekmessage succede che premendo il tasto annulla la
finestra di !apertura file! scompare e riappare subito (a volte succede
anche se 'apro' un file). Questo avviene però solo se la finestra
madre(applicazione) è più piccola di quella figlia (getopenfilename), o
meglio quando la madre non contiene (visivamente intendo, a livello di
sovrapposizione) la figlia.. Quando succede questo fatto l'unico modo che
trovo per chiudere la finestra con annulla è spostare la finestra in modo
che si trovi sopra la finestra madre.
Sembra che non capisca che deve rimuovere il messaggio dalla coda, o
qualcosa di simile.
Come posso risolvere?
Questo è il codice:
-----------------------------------------
#include <windows.h>
#define ID_FILE_EXIT 101
#define ID_OPEN 102
void fileopen(HWND hWnd);
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
 case WM_CREATE:
  {
   //variabili per gestire i menu
  HMENU hMenu, hSubMenu;
  //crea il menu
  hMenu = CreateMenu();
  //Menu File
  hSubMenu = CreatePopupMenu();
  AppendMenu(hSubMenu, MF_STRING, ID_OPEN, "&Open");
  AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit");
  AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File");
     SetMenu(hWnd, hMenu);
  }
  break;
 case WM_SIZE:
  {
  }
  break;
 case WM_COMMAND:
  switch(LOWORD(wParam))
  {
  case ID_FILE_EXIT:
   PostQuitMessage(0);
   break;
  case ID_OPEN:
   fileopen(hWnd);
  }
  break;
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
 HWND hWnd;
    MSG msg;
    ZeroMemory(&wc, sizeof(wc));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "BasicClass";
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wc);
    hWnd = CreateWindow("BasicClass","Basic Application",
                          WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
                          60,40,NULL,NULL,hInstance,NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 //Parte da cambiare
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
/* bool done=false;
 while(!done)
 {
  PeekMessage(&msg,hWnd,NULL,NULL,PM_REMOVE);
  if(msg.message==WM_QUIT) done=true;
  else
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }
 return msg.wParam;
}*/
void fileopen(HWND hWnd)
{
 OPENFILENAME ofn;
 char file[MAX_PATH] = "";
 char filename[500];
    ZeroMemory(&ofn, sizeof(ofn));
 ofn.lStructSize       = sizeof(ofn);
 ofn.hwndOwner         = hWnd;
 ofn.lpstrFilter       = "Text Files\0*.txt\0All Files (*.*)\0*.*\0" "";
 ofn.lpstrCustomFilter = NULL;
 ofn.lpstrFile         = file;
 ofn.nMaxFile          = sizeof(file);
 ofn.lpstrFileTitle    = filename;
 ofn.nMaxFileTitle     = sizeof(filename);
 ofn.lpstrTitle        = "Open a rom";
 ofn.Flags             =
OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
 ofn.lpstrDefExt       = "all";
    if(GetOpenFileName(&ofn)){}
}
---------------------
cambiando la partre finale del winmain si puo' vedere la differenza.
ho messo apposta un finestra piccolissima in cui appaia solo il menu, in
modo da chiarire la situazione.
Ciao a tutti!


wrote:

Mi sembra che la OpenFileName e' una semplice finestra di Dialog e
come tale i suoi messaggi non passano attraverso la cosa contenuta in
WinMain.
Quindi dovrebbe essere indifferente se usi PeekMessage o GetMessage.
Secondo me dal tipo di errore che rilevi si tratta di qualche bug
presente nel tuo codice per cui ti consiglio di rivederlo
attentamente.