PDA

View Full Version : [C-WIN32] Disegnare finestra con editor grafico


fedo
19-12-2005, 14:38
Ciao,

ho un'applicazione che sto creando in .NET che usa la chiamata CreateWindowEx() con vari parametri per creare una finestra non modale sullo schermo.

Volevo sapere se possibile modificare l'aspetto della finestra tamite l'editor grafico di VS piuttosto che con le chiamate a funzione dal codice.

Di solito uso i dialog non modali che sono tranquillamente editabili, ma non riesco a sostituire la finestra con un dialog modale, anche se la CreateDialogParam dovrebbe sfruttare proprio la CreateWindowEx, quindi essere equivalente..

Mi consigliate di passare ai dialog modali (se si, come?) o qualche sistema per editare le finestre dall'editor grafico?

grazie

andbin
19-12-2005, 16:03
Ciao,

ho un'applicazione che sto creando in .NET che usa la chiamata CreateWindowEx() con vari parametri per creare una finestra non modale sullo schermo.
:eh: Scusa ... fammi capire. Stai lavorando proprio in .NET?? Cioè con un linguaggio tipo C#, VB.NET, ecc... e vuoi chiamare la CreateWindowEx???

fedo
19-12-2005, 18:38
Lavoro con Visual Studio .NET ..linguaggio C++ misto C...
non con il framework .NET ..
Forse mi sono espresso male..

ciao

andbin
19-12-2005, 21:04
Lavoro con Visual Studio .NET ..linguaggio C++ misto C...
non con il framework .NET ..
Forse mi sono espresso male..
Ah, ok ... non c'è problema.
Comunque ti posso dire questo: intanto ti consiglio di usare le dialog modali, sono più semplici da gestire. Le dialog modali si creano con le funzioni DialogBoxXXX (ci sono 4 versioni) e si editano con il dialog editor del VC++. La dialog procedure deve essere gestita in modo un pochino diverso da quella per una dialog non modale. Ma non hai più bisogno di gestire il loop dei messaggi.

fedo
19-12-2005, 23:27
Grazie.

purtroppo i dialog modali bloccano l'esecuzione del programma, mentre io non devo bloccarla in attesa di eventi sulla finestra..

Non posso neppure usare un thread perchè ci ho già provato e non và...

cioè, quella finestra non deve bloccare nessun flusso esecutivo, principale o thread che sia..

ciao

andbin
20-12-2005, 09:52
purtroppo i dialog modali bloccano l'esecuzione del programma, mentre io non devo bloccarla in attesa di eventi sulla finestra..

Non posso neppure usare un thread perchè ci ho già provato e non và...

cioè, quella finestra non deve bloccare nessun flusso esecutivo, principale o thread che sia..
Allora forse non ho capito bene io cosa devi fare (spiegati meglio che cosi capisco ;) ).
Se usi una dialog modale (DialogBoxXXX) il loop dei messaggi è già gestito internamente a queste funzioni mentre se usi una dialog "modeless" cioè non modale (CreateDialogXXX) devi gestire tu il loop dei messaggi. In ogni caso il thread principale di una applicazione è tipicamente sempre "occupato" nel loop dei messaggi per riceverli e dispacciarli alle finestre.
Se devi fare una qualche elaborazione lunga che non deve essere interrotta devi usare per forza un thread separato perché comunque non devi interrompere il loop dei messaggi e non devi nemmeno bloccare l'esecuzione per troppo tempo in risposta ad un messaggio nella window/dialog procedure!
Ma non sapendo bene cosa devi fare di preciso mi è difficile suggerirti qualcosa. Ciao.

cionci
20-12-2005, 09:56
Il thread deve funzionare a tutti i costi... Da sempre si fa così con i dialoghi modali...

Se la tua applicazione deve fare dei calcoli che non devono essere bloccati dai dialog modali allora crea un thread dove devi svolgere questi calcoli (fin dall'inizio) e la gestione dell'interfaccia la demandi al thread principale... Questo deve funzionare perchè l'ho fatto tante volte :)

fedo
21-12-2005, 00:38
Se non fosse che io devo fare una libreria di sistema, ovvero una Gina di autenticazione per Windows...

è un componente critico, non un applicativo..

Quindi anche la gestione dei thread è delicata... Se metto un dialog modeless che blocca il flusso principale, mi si pianta tutto e l'autenticazione non funziona..

Se uso un thread, non riesco a "pilotarlo" come vorrei e introduco rischi di sicurezza..

L'unica soluzione che al momento mi funziona è una finestra non modale lanciata dal processo principale... se lancio un dialog, questo non mi funziona...

Se decidessi di usare un thread per gestire un dialog modale, come dovrei fare? usare una createThread dal processo e poi all'interno della procedura del thread chiamare la DialogBox.... all'interno di un ciclo while infinito? (perchè altrimenti ad ogni risposta del dialog mi si chiuderebbe il thread :confused: )... scusate se dico fesserie, ma non sono molto pratico di threads..

Inoltre, è fondamentale che io possa gestire il messaggio WM_DEVICECHANGE in questa finestra perchè è l'unico avviso che il sistema manda quando c'è l'inserimento di un dispositivo esterno...quindi se per "gestione automatica" dei messaggi intendete che non posso controllare il WM_DEVICECHANGE, allora il dialog modale non và..

Non so se ora vi ho fatto capire meglio, ma visto il tipo di software non è tanto facile :mbe:

grazie cmq..

fedo
21-12-2005, 00:41
.

fedo
24-12-2005, 16:50
non vi ho più sentito :p

Che mi dite?

Intanto auguri!

andbin
24-12-2005, 17:20
non vi ho più sentito :p

Che mi dite?Ciao, sia quello che ti ho scritto io che quello che ha scritto cionci per quanto riguarda i thread, è valido in generale nelle applicazioni Windows.
Ma il tuo caso è molto specifico perché stai lavorando a livello di sistema con le API Gina di autenticazione! E quindi essendo un argomento molto "delicato" e sicuramente complesso bisogna fare molta attenzione.
Io personalmente non ho mai lavorato con queste API (e non sono esperto di sicurezza) e quindi non saprei darti alcuna "dritta". :(

Intanto auguri!Grazie, anche a te! :)

fedo
09-01-2006, 00:53
OK,

ma non esiste un GUI Designer per il C Win32?

Ovvero, io sto creando le finestre con la CreateWindowEx e ci sto disegnando sopra con funzioni del tipo 'LineTo' , 'Rectangle', etc...
Una scomodità mostruosa!

Non esite un tool che mi fa disegnare cerchi, rettangoli , bottoni.. e poi mi tira fuori il codice C Win32 usando le funzioni che ho succitato?

Grazie

SoftWord
12-01-2006, 15:48
Non vedo l'utilità di costruire l'intera gui con lineto quando già l's.o. lo fa, se poi devi fare cose ke l's.o. nn fa, disegnale a mano con un editor di immagini e gliele piazzi su, nel caso ridimensioni, disegni la gui con immagini a blocchi.

fedo
12-01-2006, 17:49
Non vedo l'utilità di costruire l'intera gui con lineto quando già l's.o. lo fa, se poi devi fare cose ke l's.o. nn fa, disegnale a mano con un editor di immagini e gliele piazzi su, nel caso ridimensioni, disegni la gui con immagini a blocchi.


purtroppo è proprio la seconda cosa che hai detto :(

vabbè, mi darò alla grafica "rozza" ;)

ciao

andbin
12-01-2006, 17:56
purtroppo è proprio la seconda cosa che hai detto :(

vabbè, mi darò alla grafica "rozza" ;)
Devi creare un controllo "custom", cioè un controllo che ha un comportamento e/o interfaccia particolare??

SoftWord
12-01-2006, 21:48
purtroppo è proprio la seconda cosa che hai detto :(

vabbè, mi darò alla grafica "rozza" ;)

ciao


nnn ti preoccupare, se vedi interfaccie fuori dallo standard di windows, tipo winamp, windows media player stesso, vuol dire ke usano immagini :P

fedo
13-01-2006, 01:22
Addirittura? Pure MediaPlayer? Non l'avrei mai detto :eek:

fedo
13-01-2006, 01:23
Devi creare un controllo "custom", cioè un controllo che ha un comportamento e/o interfaccia particolare??

Diciamo di si... è una finestra di sistema di Windows... ecco perchè è "particolare" e non si può ricorrere ai comuni dialog in maniera semplice..

ora sto cercando di mettere su un dialog, ma è un pò complesso..

ciao

SoftWord
13-01-2006, 08:49
Addirittura? Pure MediaPlayer? Non l'avrei mai detto :eek:

beh nn è ke si rimettono a fare una gdi.dll apposta per un player :)

Ti dirò di +..........presente molti settaggi nel pannello di controllo ke hanno un interfaccia diversa ? anche il semplice "cerca" di windows ?

Ecco quelli sono fatti in html :), ebbene si, puoi incapsulare l'oggetto di IE dentro le tue finestre, ed ogni evento puoi inteccettarlo col tuo linguaggio, tramite le COM+ mi pare.

fedo
13-01-2006, 12:57
mai usata una tecnica simile..

Comunque interessante!

Grazie