|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
[API windows] Pulire dialog
Esiste una WinAPI per eliminare tutti i controlli appartenenti ad una dialog?
Se voglio mantenere la stessa dialog ma trasformarla con controlli diversi (tipo passare da una schermata ad un'altra) è possibile, senza dover creare elemento per elemento? ![]() Grazie ![]()
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Se ho capito bene (passare da una schermata a un'altra), intendi per esempio il passaggio da un tab all'altro? Se è così, io di solito creo diversi dialog nel file risorse con uno solo con lo stile WS_VISIBLE, e li creo tutti insieme con CreateDialog. A questo punto, a ogni cambio di tab, nascondo l'ultimo dialog e mostro quello attuale.
Se non è questo quello che vuoi fare, puoi usare EnumChildWindows e chiamare DestroyWindow per ogni finestra passata. Ocio ( ![]() |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Quote:
![]() Un'esempino semplice semplice? ![]()
__________________
![]() ![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Prima chiarisci te, dove deve essere questo dialog? All'interno di un'altra finestra (come child), o come popup? Nel secondo caso basterebbe distruggere il primo dialog e crearne un'altro (due dialog differenti, due risorse differenti)... altrimenti, ti faccio l'esempio
![]() |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Quote:
![]() Ma come faccio a far creare la seconda dialog nelle stesse coordinate dove è stata distrutta la prima?
__________________
![]() ![]() |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Uhm, in effetti è un po' complicato
![]() 1) Crei tutti i dialog che vuoi con le stesse dimensioni, possibilmente. Tutti devono avere lo stile WS_CHILD, e quello che vuoi mostrare per primo usa WS_VISIBLE (oppure, se vuoi scegliere il primo dialog a runtime, non usare questo stile). Non hai bisogno di altri stili. 2) Crei un dialog che possa contenere i dialog creati nel punto 1), con gli stili che ti pare 3) nell'initDialog di quest'ultimo dialog, fai un CreateDialog con tutti i dialog creati nel punto 1), la cui la finestra parent deve essere il dialog creato nel punto 2) 4) a questo punto, ogni volta che vuoi cambiare dialog nascondi l'ultimo dialog e mostri quello attuale (ShowWindow(...) ) EDIT: ah, gli handle dei dialog li puoi "memorizzare" come proprietà del dialog del punto 2) usando SetProp(...) Esempio: Codice:
HINSTANCE currentInstance = GetModuleHandle(NULL); HWND dialog1 = CreateDialog(currentInstance , MAKEINTRESOUCE(IDD_DIALOG1), hwnd, DialogOneProc); HWND dialog2 = CreateDialog(currentInstance , MAKEINTRESOUCE(IDD_DIALOG2), hwnd, DialogTwoProc); SetProp(hwnd, _T("DIALOG_ONE"), (HANDLE)dialog1); SetProp(hwnd, _T("DIALOG_TWO"), (HANDLE)dialog2); Codice:
HWND dialog1 = (HWND)GetProp(hwnd, _T("DIALOG_ONE")); HWND dialog2 = (HWND)GetProp(hwnd, _T("DIALOG_TWO")); Codice:
RemoveProp(hwnd, _T("DIALOG_ONE")); RemoveProp(hwnd, _T("DIALOG_TWO")); Ultima modifica di kk3z : 19-02-2006 alle 17:27. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Praticamente io dovrei fare una dialog padre che poi conterrà una alla volta una dialog figlia?
![]() Ho fatto una prova ma sembra non funzionare ![]() SetProp e GetProp a cosa servono? ![]() Grazie ![]()
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Quote:
Quote:
Sono una sorta di variabili membro di una classe, però la classe è una finestra. Mostrami il tuo codice, vediamo cosa c'è che non va. |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
allora, praticamente ho fatto due dialog (stesse dimensioni).
Ho scritto quel codice nel WM_INITDIALOG, vado a compilare il progetto e mi aprono milioni di stesse dialog ![]() _T non me la riconosce ![]()
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Sei sicuro che uno solo dei dialog abbia lo stile WS_VISIBLE e che tutti abbiano WM_CHILD? Devono avere o solo WS_CHILD o WS_CHILD|WS_VISIBLE. Mostrami le risorse dei tuoi dialog.
Lascia perdere _T, serve per compilare le stringhe di caratteri sia con che senza UNICODE definito. E' diventata un'abitudine ![]() |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Quote:
Codice PHP:
Codice PHP:
![]()
__________________
![]() ![]() |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Quote:
WS_CHILD e WS_POPUPWINDOW non possono essere usati insieme. In una finestra child non c'è una title bar, quindi non c'è: 1) nè il caption (togli la riga con CAPTION), altrimenti è come se usassi WS_CAPTION implicitamente. 2) nè il pulsante di chiusura, nè il pulsante per minimizzare nè per massimizare, quindi anche WS_MINIMIZEBOX è inutile come WS_MAXIMIZEBOX, WS_SYSMENU, WS_CAPTION. SOLO WS_CHILD e/o WS_VISIBLE. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Codice PHP:
Ultima modifica di kk3z : 22-02-2006 alle 12:04. |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Ora funziona, almeno in parte
![]() Allora, ho definito queste tre dialog (la prima è quella che fa da contenitore): Codice PHP:
Codice PHP:
Fin qui tutto bene, ovvero viene mostrata la DIALOGSTART. Poi nella procedura della DIALOGSTART (DlgStartProc) in risposta alla pressione di un determinato bottone ho inserito queste righe: Codice PHP:
![]() Come mai poi le dialog figlie non vengono visulizzate dall'angolo superiore sinistro della dialog padre, ma un po' rientrate? ![]() Grazie ![]()
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Non ti è ancora chiaro cosa stai facendo effettivamente. E' come se creassi due pulsanti con la stessa dimensione, uno sopra l'altro, ma uno solo di loro è visibile. Quando devi scambiarli, non hai bisogno di crearli di nuovo, devi sono nascondere quello visibile e mostrare quello nascosto. Qui:
Codice:
HINSTANCE currentInstance = GetModuleHandle(NULL); hwndDlgClient = CreateDialog(currentInstance , MAKEINTRESOURCE(DIALOGCLIENT), hwndDlg, DlgClientProc); SetProp(hwndDlg, "DIALOGCLIENT", (HANDLE)hwndDlgClient); ShowWindow(hwndDlgStart, SW_HIDE); ShowWindow(hwndDlgClient, SW_SHOW); Quando vuoi scambiarli, devi solo fare: Codice:
HWND dialogCheContieneGliAltri = .... //Se sei in uno dei dialog child, usa GetParent(), altrimenti l'hwnd della procedura in cui sei. HWND dialogChild1 = (HWND)GetProp(dialogCheContieneGliAltri, "DIALOGUNO"); HWND dialogChild2 = (HWND)GetProp(dialogCheContieneGliAltri, "DIALOGDUE"); ShowWindow(dialogChild1, SW_HIDE); ShowWindow(dialogChild2 , SW_SHOW); |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Quote:
Immaginati un pulsante al posto del dialog... il pulsante non viene mica creato sulla barra del titolo (sulla non-client area), ma sotto il titolo. Stessa cosa per il dialog. Così probabilmente è ok: Codice:
DIALOGSTART DIALOG 0,0, 400, 250 ... |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Quote:
![]() Ora ho corretto in questo modo: WM_INITDIALOG della Dialog contenitore Codice PHP:
Codice PHP:
Ma rimane lo stesso problema ![]()
__________________
![]() ![]() |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
E quale sarebbe il problema? Questo:
Quote:
|
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 308
|
Quote:
![]()
__________________
![]() ![]() |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
A me sembra tutto corretto... fai un po' di controlli, controlla che sia CreateDialog che GetProp non ritornino NULL... oppure metti qualcosa dentro il DIALOGCLIENT... non mi aiuta molto il tuo "non c'è la dialog client", purtroppo non ho tutto il tuo codice sotto il naso..
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:21.