Newsgroup: it.comp.programmare.win32
Titolo: "Customizzare" Win - Saga... ;)

Premessa : ho già postato un msg simile sul Thread "Colorare i bordi...etc."
..dunque eravamo rimasti alla mia mini app.. bleak!
...che installava un Hook di sistema - in una DLL appunto -
(WH_CALLWNDPROC), praticamente intercettavo i msg di disegno della nonclient
area... e ci disegnavo sopra (ma non sembra essere il sistema migliore,
anzi... !!!) l'Hook faceva  una piccola "cernita" e "modificava" solo le
finestre dotate di CaptionBar (e già qui c'era qualche casino...)!
Esaminando efX, ad es., ho scoperto che crea un sua classe di finestre
(POPUP) che contiene lo "SKIN" e che viene associata (anzi disegnata sopra)
ogni finestra presente sul desktop e una "Invisibile" chiamata TITLEBAR o
qualcosa del genere che, invece riceve i msg destinati alla CaptionBar...
in poche parole (ad es.) al Thread MYAPP e relativa finestra viene aggiunto
il Thread EFXSKIN e relativa finestra e questo per tutte le finestre
visibili sul desktop!
ma sul come venga impedito il disegno "di default" della finestra (caption,
bordi, pulsanti, etc.) non so proprio che dire (?)
Mi sono pure Decompilato ( e pure disassemblato )  l'exe e relativa DLL, ma
non ci ho ricavato nulla
di utile...
bho...
HELP ME! Non so + che pesci pigliare...
Mau

 finestre dotate di CaptionBar (e già qui c'era qualche casino...)!
Quello che intendevo dire non è quello che hai capito...
Nel "mio sistema" non è un hook che filtra i messaggi, l'hook serve solo a
far caricare la DLL nello spazio di tutti i processi in modo da poter
subclassare le finestre dei processi stessi...
In pratica potrai ridefinire una nuova WndProc per la finestra che vuoi
customizzare...
Mi avrai capito ? ;-))
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply


aehm... qui ci si equivoca a vicenda...
voglio dire, ho capito benissimo quello che volevi dire nel tuo precedente
post... la mia era solo una spiegazione a titolo "personale" di quello che
faceva la "mia " DLL...
Comunque Thanks per la risposta!
Mau ;)

 aehm... qui ci si equivoca a vicenda...
Ops... scusa(te)... :-))


 Ciao :-)
Don't worry...  ;)
Piuttosto, mi stavo chiedendo se subclassare la WndProc di TUTTE le finestre
(visibili e dotate di titlebar e "pulsantini" vari... eh eh) sia
effettivamente un metodo valido (e efficiente in termini di "consumo" di
risorse di sistema) per modificare il Look delle finestre... (yup, sempre
qui si va a parare!).
Ti confesso che è stata la prima "soluzione" che avevo pensato, ma mi è era
stata sconsigliata (qualche Post fa... "Customizzare" Windows etc. etc.) e
ora non so + dove andare a parare...
Ciao :)
Mau

Allora Mau , ho fatto qualche prova a modo mio (finestre sovrapposte , un
thread in più per finestra , finestra nascosta per i messaggi) ma l'overhead
è mostruoso una finestra occupa sette volte le risorse di sistema di prima!
Capisco che MS avrebbe lasciato perdere dicendo "tanto l'utente non se ne
accorge" , ma io da vecchio Jedi non riesco ad accettare tutto ciò , deve
esserci un metodo migliore , spremiamo ancora.
Non mollare però , mi ci hai trascinato tu in questo incubo del tempo
libero!
Per ora sono in preda alla più nera depressione a causa della bruciante
sconfitta , appena mi riprendo ti farò sapere qualcosa.
--
Ciao , Ricardo Antonio Piana
(Rico per gli amici)
ri...@kiss.to
ICQ #53211666
______________________________________________
Tutti i miei racconti , alcune poesie ed altro nel mio sito
http://kiss.to/rico
______________________________________________

 --
Mollare?...tsk tsk
...è solo che ultimamente ho "altre" cose per la testa   ;)   e ho un po'
rallentato gli "esperimenti"... eh eh
Ho anche intrapreso la via dell'Assembler (vecchio amore dai tempi del C64 e
dell'Amiga) sotto Win32... very interesting!
Riguardo al tuo tentativo con le finestre sovrapposte... bhe SIGH! sebrava
che fosse proprio il metodo usato da eFX!( WindowBlinds e Chroma usano altri
metodi + sofisticati ) ...forse l'hai già fatto.. ma fatti un SPYata... e
dai un okkio alle finestre ed ai Threads...
quindi, mi cade anche l'ultimo baluardo...
Sono SICURO che c'è una soluzione migliore!!! ma trovarla... vista la scarsa
documentazione di "mamma" Microzopp è  veramente dura!
Tetzuia dall'alto del tempio degli Jedi fatti sentire!!!!
"Che la Forza sia con Voi!"
Mau :)

 ora non so + dove andare a parare...
Beh, (purtroppo grazie ad Outlook il thread è sparito :-( ) cmq penso che
subclassando la finestra e gestendo il messaggio wm_paint svolgi meno lavoro
che disegnarci sopra direttamente (ci sono 2 paint in quel caso : quello
"standard" e il tuo che ci vai sopra...)
Sarebbe interessante capire se si riesce ad evitare di avere un thread per
ogni finestra ma non ho idea di come fare ad avere un numero n (ovviamente
variabile) di WndProc pronte per le n finestre che devo subclassare senza
usare n threads... :-(
Cmq ho fatto un esperimento (grazie a i preziosi suggerimenti di Lorenzo
Lutti) e ho subclassato il pulsante Avvio... il fatto è che riesco a gestire
il paint ma non sono molto pratico e mi perdo un pò...
Ad esempio:
- riesco a disegnare una linea sul pulsante scrivendo il codice dopo aver
chiamato la vecchia WndProc (e quindi ho il classico pulsante Avvio con
sopra una linea...)
- se cerco di gestire proprio tutto il paint (senza richiamare la vecchia
WndProc [solo per quel msg ovviamente, tutti gli altri li lascio a carico
della vecchia wndproc..]) non capisco perchè ma nonostante io assegni il
risultato del msg a zero (come da help) lui continui a rispedirmi il
wm_paint...
Avete consigli? (io non sono molto esperto in queste cose...)


 Avete consigli? (io non sono molto esperto in queste cose...)
Come per qualunque altro WM_PAINT, esso sparira` dalla coda se e
solo se hai chiamato BeginPaint, e poi (dopo i tuoi disegni) EndPaint
con la stessa PAINTSTRUCT; lo hai fatto...?
Alex


Interessante! Non hai mica voglia di Postarmi il Codice?
ThankZ BoyZ!
Mau :)

 con la stessa PAINTSTRUCT; lo hai fatto...?
Sě, o meglio... ci ho provato...
Evidentemente non l'ho fatto nella maniera corretta...
Il fatto č che non capisco se la struttura che ottengo con la BeginPaint va
modificata o no...
e poi cosa devo fare per disegnarci? Io ottendo il DC lo assegno ad un
TCanvas e poi uso i suoi metodi, č il modo giusto?
Grazie per l'intervento
ciao :-)
--
(Ż`·.¸¸.·´Ż`·.¸¸.-> Andrea <-.¸¸.·´Ż`·.¸¸.·´Ż)


 Interessante! Non hai mica voglia di Postarmi il Codice?
Io te lo posto anche ma guarda che io programmo in Borland Delphi... ti va
bene lo stesso?
[non ho mai visto qualcosa del genere scritto in C quindi non saprei dirti
se le cose cambino molto o cosa... di sicuro le funzioni sono le stesse
(visto che sono tutte API tranne un paio di chiamate per il subclassing
[MakeObjectInstance e FreeObjectInstance])
Fammi sapere se ti interessa comunque...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)


 Fammi sapere se ti interessa comunque...
uhm.. si può tentare... io programmo in C/C++, ma come hai detto tu, le
chiamate alle API dovrebbero essere le stesse!
ThankZ
Mau :)

 chiamate alle API dovrebbero essere le stesse!
Ok, te lo preparo (o ti posso inviare direttamente i files dpr?) in formato
testo e te li invio in privato, cmq oggi sono riuscito ad utilizzare la
BeginPaint e la EndPaint e riesco a fare il Paint del pulsante come
voglio... ho solo il problema che quando ci clicchi sopra comunque appare il
caro vecchio pulsante Avvio col disegno standard... qualcuno sa perchè?


 caro vecchio pulsante Avvio col disegno standard... qualcuno sa perchč?
Un bottone si ridisegna (con look "premuto" o "sollevato") in risposta
ai messaggi che gli dicono che il bottone sinistro del mouse e` stato
premuto/rilasciato su di esso (un "clic" e` una coppia di messaggi,
WM_LBUTTONDOWN, pressione, seguito da WM_LBUTTONUP, rilascio).
Presumo sia questo l'effetto che stai osservando; se cosi` e`, allora
nel tuo subclassing dovrai gestire anche questi messaggi.
Alex

 TCanvas e poi uso i suoi metodi, č il modo giusto?
Non so se TCanvas sia "trasparente" abbastanza per i tuoi scopi,
comunque la frase che mi lascia sospetto e` "ottengo il DC" (immagino
sia quel che intendi con "ottendo"?) -- il DC da usare per il disegno e`
appunto nella PAINTSTRUCT che ricevi in BeginPaint, non sara` che
chiami erroneamente qualche "GetDC" o che...?
Comunque, "come disegnare" non c'entra con il fatto di fare sparire
WM_PAINT dalla coda: questo si ottera` solo ed esclusivamente
chiamando la EndPaint con la PAINTSTRUCT ricevuta dalla BeginPaint.
Se tu faccia 0 o un milione di operazioni di disegno nel frattempo
non c'entra con la rimozione del WM_PAINT dalla coda.
Normalmente, cioe` a basso livello (livello API di Win32) il disegno
si fa con le n-mila funzioni che accettano un argomento HDC, come
TextOut per scrivere testi, PolyBezier per disegnare spline di Bezier,
ecc ecc ad nauseam.  Chiaramente, nulla impedisce di incapsulare
tutto questo in classi + comode, e immagino che TCanvas faccia
appunto questo tipo di cose.
Ma la EndPaint, la chiami...?  "Aye, _there's_ the rub"!
Alex

 appunto questo tipo di cose.
Io mi riferivo a Tcanvas perchè in delphi è il modo "canonico" per disegnare
su qualsiasi cosa... La definizione di Canvas che mi sono fatto è questa:
"oggetto che incapsula un DC e relative funzioni" ma mi chiedevo se, per
disegnare su una finestra, fosse + performante usare direttamente le API
piuttosto che ricorrere ad un oggetto...
Ciao, grazie per avermi risposto. :-)


 nel tuo subclassing dovrai gestire anche questi messaggi.
Ho provato a richiamare una ReDrawWindow (è il metodo giusto ?, io ho sempre
usato questo ma...) ma lui se ne sbatte altamente...
Ciao


 
Senza dubbio lavorare a livello molto basso e` "piu` performante",
bisogna
vedere se la differenza di prestazione, magari molto piccola, meriti lo
sforzo maggiore (magari molto maggiore, dipende).
Alex

 
"ReDrawWindow" non e` una API di Win32 e quindi non posso sapere
se sia "giusto" per intercettare in un subclassing le risposte di un
bottone
ai WM_LBUTTONDOWN e WM_LBUTTONUP, ma dal nome non mi
sembrerebbe proprio; se mai sembra un "metodo" che ha come scopo
di "ridisegnare" qualcosa.
A livello di API, quel che dovresti fare e` intercettare WM_LBUTTONDOWN
e WM_LBUTTONUP, usando in ciascun caso opportune API che lavorano
con il DC cliente della finestra (non dico come ottenerlo per non
offendere:-)
per disegnare il bottone nel "look" premuto e rilasciato rispettivamente
(puo`
essere utile ad esempio DrawEdge, ma si puo` anche usare FillRect).
Devi
anche simulare gli altri effetti di questi messaggi sul bottone,
naturalmente; o,
in alternativa, delega la gestione alla winproc che stai subclassando e
_poi_
rifai il disegno tuo sopra il suo (questo potrebbe avere un look
bruttino, ma
l'unica e` provare).
Alex