Newsgroup: it.comp.programmare.win32
Titolo: problemi con CWnd::CreateEx

Scusate la domanda sicuramente stupida ma, nonostante abbia davanti a me
esempi, tutorial, e quant'altro non riesco a cerare una finestra
sovrapponibile.
Premetto che sto usando un'architettura Documento/Vista di tipo SDI,
tuttavia
mi servirebbe una finestra dove via via dovrei visualizzare delle cose.
Ho derivato dalla classe CWnd la mia classe CWndMontaggio e nel costruttore
ho scritto
CWndMontaggio::CWndMontaggio()
{
 CString myStrClass;
 CRect rcProva(0,0,300,300);
 myStrClass = AfxRegisterWndClass( CS_OWNDC|CS_HREDRAW|CS_VREDRAW,
  0, // prendo come cursore lo standard IDC_ARROW
  (HBRUSH)COLOR_WINDOW+1,
  0 // prendo come icona della finestra il logo della Microsoft
  );
    CreateEx( WS_OVERLAPPEDWINDOW, (LPCTSTR)myStrClass,
  _T("Finestra di Montaggio"), WS_VISIBLE, rcProva,
  AfxGetApp()->m_pMainWnd, 12);
}
Ma non funziona, in particolare la CreateEx fallisce nella creazione della
finestra. Ossia, se da un'altro oggetto chiamo
CWndMontaggio FinestraMontaggio;
FinestraMontaggio.ShowWindow( SW_SHOW );
ottengo un errore. Infatti l'm_hWnd di FinestraMontaggio è NULLO!!
DOVE sbaglio?? E poi  l'ultimo parametro (nID) devo sceglierlo come voglio
oppure con un qualche criterio che mi sfugge?
Ciao e grazie in anticipo a tutti coloro che vorranno rispondermi.

 oppure con un qualche criterio che mi sfugge?
Se non lo utilizzi non ha molta importanza, puoi passare quello che
vuoi.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/


Ecco, invece l'errore era proprio qui. Se metto nID = 0 allora funziona,
altrimenti non mi crea la finestra,
forse perchč č sottointeso che questo nID debba indicare un menů? Boh?
Cmq, grazie per la risposta!


Ho lo stesso problema di chad. Infatti, usando le stesse ipotesi di cui
sopra ho provato a creare la finestra derivando una classe non da CWnd ma da
CScrollView, ma quando l'applicazione richiama il costruttore causa un
errore di asserzione nella funzione:
BOOL CView::PreCreateWindow(CREATESTRUCT & cs)
{
 ASSERT(cs.style & WS_CHILD); ....
}
Se provo ad aggiungere lo stile WS_CHILD:
     CreateEx( WS_OVERLAPPEDWINDOW, (LPCTSTR)myStrClass,
      _T("Finestra di Montaggio"), WS_CHILD | WS_VISIBLE, rcProva,
       AfxGetApp()->m_pMainWnd, 12);
l'applicazione parte ma funzione CreateEx fallisce e restituisce FALSE
Nella finestra di DEBUG, durante l'esecuzione della funzione CreateEx,
compare il seguente messaggio:
Warning: Window creation failed: GetLastError returns 0x00000000
Avete qualche consiglio ?
Grazie

 un menů? Boh?
Si`, non avevo pensato al fatto della overlapped: di solito si creano
finestre popup o child, e` raro creare overlapped in un secondo tempo,
ecco perche` mi era sfuggito.
Per le child e le popup quello e` effettivamente un ID, e puoi
impostarlo come vuoi (perche` sei tu stesso eventualmente a usarlo in un
secondo tempo); per le overlapped invece e` l'handle del menu principale
della finestra: a meno che tu non passi 0 (NULL, piu` precisamente),
Windows cerchera` di mostrare un menu che in realta` non esiste, e non
riuscendoci fallira` la creazione della finestra.
Scusa se non ho notato subito il fatto della overlapped (e dire che ti
ho anche spostato il flag :-))...



Macchč scusa! Anzi grazie per il chiarimento! Adesso capisco perchč
sull'MSDN c'č scritto "HMENU or nID", dipende dal tipo della finestra
che si vuole creare (logico, ma se l'MSDN fosse scritta un pň meglio).
Ciao.


Il problema č che hai copiato il mio esempio! Al posto di
WS_OVERLAPPEDWINDOW devi mettere
WS_EX_OVERLAPPEDWINDOW, e, come ha chiarito Lorenzo Lutti a seguito di
questo l'ultimo parametro
diventa l'identificativo di un menů, quindi, se non desideri un menů devi
metterci 0 o NULL, se invece vuoi
avere un tuo menů devi creartelo e porvi l'opportuno identificativo.
Ciao.