Newsgroup: it.comp.programmare.win32
Titolo: il dialog non appare ...

premetto che di programmazione "visual" sono abbastanza ignorante, sto
facendo un'applicazione grafica con le openGL e fin'ora son sempre andato a
schermo intero.
poi mi e' venuta voglia di fare un piccolo launcher per scegliere la
risoluzione, i colori e cosi'. allora ho disegnato la finestra, ma poi il
programma sembra saltarla a piedi pari e partire subito a tutto schermo.
credo sia un problema di impostazioni della WNDCLASS ... be', questo e'
quanto contiene il mio codice:
int WINAPI WinMain( HINSTANCE hInstance,   // Instance
     HINSTANCE hPrevInstance,  // Previous Instance
     LPSTR  lpCmdLine,   // Command Line Parameters
     int   nCmdShow)   // Window Show State
{
 WNDCLASS wc;      // Windows Class Structure
 hInstance   = GetModuleHandle(NULL);    // Grab An Instance For Our Window
 wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own
DC For Window.
 wc.lpfnWndProc  = (WNDPROC) WndProc;     // WndProc Handles Messages
 wc.cbClsExtra  = 0;         // No Extra Window Data
 wc.cbWndExtra  = 0;         // No Extra Window Data
 wc.hInstance  = hInstance;       // Set The Instance
 wc.hIcon   = LoadIcon(NULL, IDI_WINLOGO);   // Load The Default Icon
 wc.hCursor   = LoadCursor(NULL, IDC_ARROW);   // Load The Arrow Pointer
 wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
 wc.lpszMenuName  = MAKEINTRESOURCE(IDD_LAUNCHER);
 wc.lpszClassName = "OpenGL";        // Set The Class Name
 MSG msg;         // Windows Message Structure
 BOOL loop=true;        // Bool Variable To Exit Loop
 fullscreen=true;
 long t=timeGetTime(), f=0;
 srand((unsigned int)t); // seed the random number generator
 width = 1024; height = 768;
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_LAUNCHER),
                     HWND_DESKTOP, (DLGPROC)LauncherProc);
 if (!RegisterClass(&wc)) {
  MessageBox(NULL,"Failed To Register The Window
Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return false;
 }

 quanto contiene il mio codice:
Se vuoi visualizzare un dialog box, non devi creare una wndclass, non ti
serve a nulla.
Se ti si apre e chiude subito con ogni probabilità la colpa è della
DialogProc, avrai sbagliato qualcosa li.

mi sa che c'hai ragione .... scusate se stresso ancora, ma su msdn mi sono
perso!!
la struttura della dialogproc e' piu' o meno cosi':
(ho cercato di salvare l'indentazione, speriamo..)
BOOL CALLBACK LauncherProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
    switch (message)
    {
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
               case IDOK:
                <parecchie linee che ho tagliato>
                EndDialog(hwndDlg, wParam);
                return TRUE;
           }
           switch (HIWORD(wParam)) {
               case BN_CLICKED:
               <un paio di righe..>
          }
          break;
          case WM_INITDIALOG: {
            <ecc.ecc.>
          }
    }
    return FALSE;
}

           break;
Qui c'è un bell'errore logico. Devi testare la HIWORD di wParam dentro il
check della LOWORD, in questo modo:
switch (LOWORD(wParam)) {
    case IDOK:
        switch (HIWORD(wParam)) {
            case BN_CLICKED:
                break;
        }
        break;
}
Se cmq postassi la procedura per intero potrei esserti di maggior aiuto.
Ciao :-)

aye!
BOOL CALLBACK LauncherProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
    switch (message)
    {
  case WM_COMMAND: {
            switch (LOWORD(wParam)) {
   case IDC_LAUNCH: {
    if(IsDlgButtonChecked(hwndDlg, IDC_16BPP))
     bpp = 16;
     else
     bpp = 32;
    if(IsDlgButtonChecked(hwndDlg, IDC_640_480)) {
     width = 640;
     height = 480;
    }
    if (IsDlgButtonChecked(hwndDlg, IDC_800_600)) {
     width = 800;
     height = 600;
    }
    if (IsDlgButtonChecked(hwndDlg, IDC_1024_768)) {
     width = 1024;
     height = 768;
    }
    EndDialog(hwndDlg, wParam);
    return TRUE;
   }
   switch (HIWORD(wParam)) {
    case BN_CLICKED:
     CheckDlgButton(hwndDlg, lParam, BST_CHECKED);
//     break;
   }
   }
//  break;
  }
  case WM_INITDIALOG: {
//    CheckDlgButton(hwndDlg,IDC_FULLSCREEN, BST_CHECKED);
    CheckRadioButton(hwndDlg,IDC_640_480, IDC_1024_768, IDC_640_480);
//    CheckRadioButton(hwndDlg,IDC_16BPP, IDC_32BPP, IDC_16BPP);
  }
    }
    return false;
}

 }
Fine della spiegazione :-) Fammi sapere se funziona, dato che cmq
considerato tutto trovo strano che ti esca dal dialog istantaneamente.
Dovrebbe semplicemente funzionarti male, considerato come hai scritto il
codice.

be', intanto comincio a ringraziarti per la pazienza :)
il motivo per cui mancano diverse cose (controllo del fullscreen,
inizializzazione di altri controlli) e' che ho riciclato questo codice da un
altro programma, e poi tra i soliti "taglia qui, adatta li', questo e'
meglio scritto cosi'" e' successo questo casino :P
comunque adesso ho fatto un restyling sintattico e ho seguito i tuoi
consigli,  ..... purtroppo senza ottenere nulla :-\ e questo e' quanto ho
ottenuto...
BOOL CALLBACK LauncherProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
    switch (message) {
  case WM_COMMAND:
            switch (LOWORD(wParam)) {
    case IDC_LAUNCH:
     if(IsDlgButtonChecked(hwndDlg, IDC_16BPP))
      bpp = 16;
      else
      bpp = 32;
     if(IsDlgButtonChecked(hwndDlg, IDC_640_480)) {
      width = 640;
      height = 480;
     } else if (IsDlgButtonChecked(hwndDlg, IDC_800_600)) {
      width = 800;
      height = 600;
     } else if (IsDlgButtonChecked(hwndDlg, IDC_1024_768)) {
      width = 1024;
      height = 768;
     } else {
      width = 1024;
      height = 768;
     }
     EndDialog(hwndDlg, wParam);
     return true;
     break;
    default:
     CheckDlgButton(hwndDlg, lParam, BST_CHECKED);
     break;
   }
  break;
  case WM_INITDIALOG:
    CheckRadioButton(hwndDlg,IDC_640_480, IDC_1024_768, IDC_640_480);
    return true;
    }
    return false;
}

 }
Tutto giusto, il prob dipende da altro come ti ho spiegato.


Prova a postare il codice del file RC (per lo meno la parte dove definisci
il dialogo) o comuqnue verifica che il dialogo abbia poprio IDD_LAUNCHER
come ID.
Luca

allora, ho provato a controllare gli errori in piu' punti del codice.
se faccio il controllo subito all'avvio del programma, del tipo:
int WinMain (bla bla) { error = GetLastError(); ......}
ho un error_invalid_handle (!? per cominciare in bellezza)
invece subito dopo il tentativo di fare la dialogbox ho un
ERROR_INVALID_WINDOW_HANDLE ....
e dopo RegisterClass ho un ERROR_FILE_NOT_FOUND !! (ma quale file? a quel
punto non carico nessun file!)
il dialog ha IDD_LAUNCHER come ID (grazie anche a Luca per l'interessamento)
...
ho notato che nella LauncherProc non entra nemmeno :-/
il codice che richiama il dialog non e' cambiato significativamente
dall'ultima volta che l'ho postato .... comunque eccolo qui.
int WINAPI WinMain( HINSTANCE hInstance,   // Instance
     HINSTANCE hPrevInstance,  // Previous Instance
     LPSTR  lpCmdLine,   // Command Line Parameters
     int   nCmdShow)   // Window Show State
{
 MSG msg;         // Windows Message Structure
 BOOL loop=true;        // Bool Variable To Exit Loop
 fullscreen=true;
 long t=timeGetTime(), f=0;
 srand((unsigned int)t); // seed the random number generator
 width = 1024; height = 768; bpp = 32;
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_LAUNCHER),
                     HWND_DESKTOP, (DLGPROC)LauncherProc);
 WNDCLASS wc;      // Windows Class Structure
 hInstance   = GetModuleHandle(NULL);    // Grab An Instance For Our Window
 wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own
DC For Window.
 wc.lpfnWndProc  = (WNDPROC) WndProc;     // WndProc Handles Messages
 wc.cbClsExtra  = 0;         // No Extra Window Data
 wc.cbWndExtra  = 0;         // No Extra Window Data
 wc.hInstance  = hInstance;       // Set The Instance
 wc.hIcon   = LoadIcon(NULL, IDI_WINLOGO);   // Load The Default Icon
 wc.hCursor   = LoadCursor(hInstance, IDC_ARROW);   // Load The Arrow
Pointer
 wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
 wc.lpszMenuName  = MAKEINTRESOURCE(IDD_LAUNCHER);
 wc.lpszClassName = "OpenGL";        // Set The Class Name


 dall'ultima volta che l'ho postato .... comunque eccolo qui.
Quindi come detto il problema non è nella DialogProc.
Resta da vedere il motivo per cui non te la visualizza... onestamente così
su due piedi non saprei che dirti. Fossi in te proverei a rifare tutto io a
mano.
ciao :-)

alla fine ho risolto... praticamente avevo la finestra impostata come child
e chiamavo il dialogbox con parent = null (hwnd_desktop)
ho cambiato da child a overlapped e ora funziona.
non capisco cosa sia cambiato, pero'....