Newsgroup: it.comp.programmare.win32
Titolo: [API VC++6] Catturare gli HWND di una finestra (NON) di dialogo

Ciao a tutti!
Mi sono creato una bella finestra basata su un dialog template,
associandogli una classe
con il campo cbWndExtra = DLGWINDOWEXTRA; quindi utilizza una window
procedure,
non una dialog procedure e  fin qui nessun problema..
Nel template ho diversi pulsanti, combo ed editboxes. E qui arriva il
problema: come faccio
ad ottenere i vari HWND  di questi controlli? Dal momento che non e' un
dialogo a tutti gli effetti,
la funzione GetDlgItem non funziona!
In un primo tempo avevo pensato di catturarli con l'arrivo dei WM_COMMAND,
ma questo
implica che all'apertura della finestra non li ho ancora e non posso
inizializzare i controlli...
Se WM_COMMAND non va bene, c'è un messaggio che ogni controllo restituisce
alla
parent window per la sua creazione? (una specie di WM_CREATE al contrario
insomma!)
Inoltre, qual'è il vantaggio di utilizzare questo tipo di finestra ibrido?
Ph.


c'è WM_PARENTNOTIFY però i controlli di una finestra di dialogo non lo
mandano perché hanno impostato lo stile WM_EX_NOPARENTNOTIFY, per cui nel
tuo caso potrebbe non funzionare
oppure ci sarebbe la funzione EnumChildWindows
----
Pela

 oppure ci sarebbe la funzione EnumChildWindows
Ho guardato sulla documentazione del platform sdk; la funzione e'
interessante,
ma poi rimane il problema di sapere gli HWND ottenuti a quale controllo si
riferiscono (!).
Come soluzione a questa cosa, ho pensato di fare un ciclo in cui
ad ogni HWND, uno alla volta do fuoco (WM_SETFOCUS); loro
dovrebbero ri-notificarmi con WM_COMMAND, tramite il quale,
posso associare HWND ad un identificatore appropriato.
Mi sembra solo un po' incasinato!
Altre soluzioni??
Ph.


ma almeno con GetDlgItem hai provato? Sei sicuro che non vada lo stesso
anche se la finestra non è una dialog?
comunque puoi avere l'ID del controllo partendo dall'HWND con GetDlgCtrlId
----
Pela

 anche se la finestra non è una dialog?
È quello che ho provato prima di aprire il thread!
Invece GetDlgCtrID() funziona.
Grazie!
Ph.

Eccoci qui,
quella che segue e' la funzione puntata da EnumChildWindows;
Ho aprofittato di questa funzione per inizializzare due controlli.
Il primo (IDE_PASS) e' un editbox e lo inizializza correttamente,
settando il numero di caratteri max a 256.
Il secondo (IDC_ALG) e' un combox, ma la sua inizializzazione non
funziona: la chiamata
SendMessage(hAlg,CB_ADDSTRING,0,(LPARAM)TEXT("StRiNgA 0"));
restituisce 0 (essendo la prima stringa che entra nel combo). Tuttavia
quando vado ad aprire il combo, non vi e' nessuna stringa.
La mia domanda ora e' PERCHE'?
Ph.
PS
Le chiamate a CatturaHandle() sono eseguite subito dopo la creazione e la
visualizzaione (ShowWindow()) della finestra principale.
<CODE>
BOOL CALLBACK CatturaHandle( HWND hwnd, LPARAM lParam)
{
 switch(GetDlgCtrlID(hwnd))
 {
 case IDE_PASS:
  hPass = hwnd;
  SendMessage(hPass,EM_SETLIMITTEXT,256,0);
  break;
 case IDE_FNAME:
  hFName = hwnd;
  break;
 case IDC_ALG:
  hAlg = hwnd;
  SendMessage(hAlg,CB_ADDSTRING,0,(LPARAM)TEXT("StRiNgA 0"));
  break;
 }
 return TRUE;
}
</CODE>


hai impostato la dimensione del rettangolo il cui vengono mostrate le
stringhe?
se no vai nell'editor di risorse, fai clic sul combo (sulla freccia) e poi
trascini il bordo inferiore del rettangolo fino alla misura massima che deve
occupare il combo aperto
---
Pela

 stringhe?
Sigh! Avevi ragione! Che errore cretino! :P
Ciao e grazie ancora!
Ph.