Newsgroup: it.comp.programmare.win32
Titolo: [REQ][HELP] C - Finestre di dialogo e frame inesistente

Salve a tutti.
Sto muovendo i primi, amatoriali passi nella programmazione Win32 in C/C++.
Sto usando il compilatore Mingw con gcc 2.95.2 sotto Win95 e la mia 
macchina è Intel.
Ho un problema.
Dopo aver immesso tutte le informazioni dovute nel resource script per la 
creazione di una finestra di dialogo
modal (giusto un "a proposito di...") e aver impostato il callback e 
chiamato la creazione con CreateDialog,
la finestra di dialogo "compare", nel senso che vengono visualizzati i 
controlli statici (3 Labels, 1 bitmap ed
un bottone IDOK) ma il frame della finestra di dialogo è assente (i 
controlli sono come incollati al nulla).
Inoltre, se bisogna rivisualizzare la finestra di dialogo (
p.es
 dopo averla 
mandata in background e poi di
nuovo on top), questo non avviene... nel rettangolo corrispondente al frame 
della finestra di dialogo
rimane l'immagine precedente, come se non fosse capace di ridisegnarela.
Mille grazie.
Aggiungo il codice:
//RESORCE SCRIPT
ID_ABOUTBOX DIALOGEX MOVEABLE DISCARDABLE 0, 0, 250, 150
STYLE WS_POPUP | WS_BORDER
CAPTION "RandiPad 2001"
FONT 8, "Comic Sans MS"
BEGIN
   DEFPUSHBUTTON "OK",IDOK,137,110,56,18
   CONTROL       "bitmap1",-1,"Static",SS_BITMAP,7,8,80,97
   LTEXT         "RandiPad 2001",-1,110,24,110,20
   LTEXT         "L'editor che vi sognate.",-1,110,49,156,14, NOT WS_GROUP
   LTEXT         "Copyleft 2001 RandiSoft",-1,110,60,106,18
   LTEXT         "
http://space.tin.it/fracastu
",-1,13,116,98,12, NOT WS_GROUP
END
//file
//hThisIn
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, 
LPARAM lParam)
{
     switch (message)                  /* handle the messages */
     {
        case WM_COMMAND:
            switch( wParam )
            {
               ....
              case IDM_HELPCONTENTS: //messaggio del menu
                   DialogBox (hThisInstance, MAKEINTRESOURCE(ID_ABOUTBOX), 
hwnd, DialogProcedure);
                   return 0;
             .....
         }
}
BOOL CALLBACK DialogProcedure(HWND hDlg, UINT message, WPARAM wParam, 
LPARAM lParam){
   switch(message){
     case WM_INITDIALOG:
       return TRUE;
       break; //end of WM_INITDIALOG
     case WM_SHOWWINDOW:
       UpdateWindow(hDlg);
       return TRUE;
     case WM_COMMAND:
       switch(wParam){
         case IDOK:
         EndDialog(hDlg, wParam);
         return TRUE;
         break;
       } //end of **switch(wParam)
       break; //end of WM_COMMAND
   }
   return TRUE;
}
-- 
Posted from 
ro...@dcsun1.epfl.ch
 [128.178.38.211] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Il mio consiglio è: aggiungi del codice per gestire il messaggio WM_PAINT.

controlli sono come incollati al nulla
[CUT]
file://file
file://hThisIn
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
     switch (message)                  /* handle the messages */
     {
        case WM_COMMAND:
            switch( wParam )
            {
               ....
              case IDM_HELPCONTENTS: file://messaggio del menu
                   DialogBox (hThisInstance, MAKEINTRESOURCE(ID_ABOUTBOX),
hwnd, DialogProcedure);
                   return 0;
             .....
         }
// IO QUI aggiungerei un return 0;
}
Se non ritorni 0, i messaggi che non gestisci (come il WM_PAINT) non vengono gestiti
in automatico...
Bow-wow
Killer
BOOL CALLBACK DialogProcedure(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam){
   switch(message){
     case WM_INITDIALOG:
       return TRUE;
       break; file://end of WM_INITDIALOG
     case WM_SHOWWINDOW:
       UpdateWindow(hDlg);
       return TRUE;
     case WM_COMMAND:
       switch(wParam){
         case IDOK:
         EndDialog(hDlg, wParam);
         return TRUE;
         break;
       } file://end of **switch(wParam)
       break; file://end of WM_COMMAND


Esatto è quello che intendevo. Ma ho notato un'altra cosa:
non ritorni la DefWindowProcedure.
In pratica:
    //devi aggiungere un default case
    default:
          return DefWindowProc(hwnd, message, wParam, lParam);

           return DefWindowProc(hwnd, message, wParam, lParam);
Ma dato che e' un dialogo, non basta ritornare 0?
Pensavo che per i dialoghi era sufficiente...
Bow-wow
Killer

 Esatto č quello che intendevo. Ma ho notato un'altra cosa:


Non deve tornarlo nella DialogProc, bensi nella WindowProc.