Newsgroup: it.comp.programmare.win32
Titolo: [GDI] - ottenere il DC della ClientArea

Ciao, ho il seguente problema:
Devo disegnare sul DC di una Window, tutto bene, in Delphi 5 uso le API...
WinDC := GetDC(MiaWin.Handle);
poi aggancio un nuovo Canvas al DC ottenuto
MioCanvas := TCanvas.Create();
MioCanvas.Handle := WinDC:
ok, ora sul canvas posso disegnare  quello che voglio, cerchi, rettangoli
ecc. e questi appariranno SOPRA tutti i vari controlli della Form, e' come
se stessi scrivendo sullo schermo!
A questo punto, visto che voglio limitare l'area di disegno alla sola client
area della mia Window, ho qualche problema, in particolare poiche' il DC e'
relativo all'intera finestra, se non faccio dei controlli sulle coordinate
in modo da non sbordare, durante il disegno possono essere "sporcati"
caption bar e bordi della finestra...
Come faccio ad ottenere un DC relativo alla sola ClentArea della Window in
modo da evitare ulteriori controlli sulle coordinate?
perche' non esistono, o non ho trovato, API del tipo:
GetClientAreaHandle
GetClientAreaDC
??
Spero di essermi spiegato almeno in maniera decente...
Alex, perche' non ne hai parlato nel tuo Tutorial? ;-))
Scherzo, non pretendo che riscriva l'intero MSDN in italiano e lo metta
gratis sul tuo sito... non lo pretendo, ma sarebbe un ottimo regalo per noi
poveri mortali!
Ciao Davide
/ - / - | - \ - \
Davide Piras
pir...@engineer.com
\ - \ - | - / - /
/ - / - | - \ - \
Davide Piras
pir...@engineer.com
\ - \ - | - / - /

 noi poveri mortali!
Il mio tutorial sulle API di Win32, in corso di pubblicazione su
http://aleax.supereva.it/
, non sara` mai una _reference_ (com'e`
quel sottoinsieme dell'MSDN detto "Platform SDK", che copre,
appunto, le API) perche` vuol essere appunto un tutorial, cioe`
una introduzione all'argomento (anche se cerco sempre di
andare abbastanza a fondo sugli argomenti che copro via via).
Sinora, relativamente al disegno, ho coperto solo quella che
mi sembra la parte piu` semplice, cioe` l'uso di controlli con
il bit di stile "owner draw", con gestione del relativo messaggio
WM_DRAWITEM -- che ti scodella il DC e varie altre cosette,
gia` tutte pronte, in una bella DRAWITEMSTRUCT.  Non che
l'uso di WM_PAINT, quando ci arrivero`, sia molto piu` arduo.
La necessita` di andarsi specificamente a prelevare un qualche
DC (per farci disegni non-persistenti, o altre stranezze:-) e`
un po' avanzata e peculiare, quindi, muovendomi grosso modo
dalle cose piu` fondamentali e basilari (dialoghi, static, bottoni,
edit, subclassing, owner-draw, accesso al COM) verso quelle
piu` avanzate, potra` volerci un poco prima che ci arrivi...:-)
Alex

 e` comunque una buona idea.
effettivamente hai ragione, come al solito...
Ho pero' notato che usando il DC della ClientArea quello che disegno appare
sotto gli altri controlli, mentre io voglio disegnare on-top...
Mi sa che devo accontentarmi ed usare il DC dell'intera finestra, facendo le
opportune verifiche per non sbordare.
Mi servono le dimensioni della captionBar e dei bordi, per questo uso
GetSystemMetrics(Flag), a questo punto, per disegnare un punto devo
aggiungere alle sue coordinate i valori trovati...
Punto.X := Punto.X + LarghezzaBordo;
Punto.Y := Punto.Y + AltezzaBordo + AltezzaCaptionBar;
mah! e' bruttino ma funziona...
Ciao Davide

modo da evitare ulteriori controlli sulle coordinate?
Sull'help relativo alle API di Win32 trovo quanto segue:
1) "The GetDC function retrieves a handle of a display device context
(DC) for the client area of the specified window. The display device
context can be used in subsequent GDI functions to draw in the client
area of the window".
2) "The GetWindowDC function retrieves the device context (DC) for the
entire window, including title bar, menus, and scroll bars. A window
device context permits painting anywhere in a window, because the
origin of the device context is the upper-left corner of the window
instead of the client area."
Purtroppo non conosco Delphi e la libreria VCL. Puoi pero' chiedere
sul NG dedicato al Delphi (it.comp.lang.delphi).
Bye.

 appare sotto gli altri controlli, mentre io voglio disegnare on-top...
Se quel che prendi e` il DC del tuo dialogo, client area o
meno, sara` sempre al di _sotto_ delle finestre-figlie, come
ad esempio i controlli che contiene.  Se non c'e` lo stile
di clipping corretto, WS_CLIPCHILDREN, puo trovarti in
modo _temporaneo_ a "disegnare sopra i figli", ma se un
figlio a sua volta si ridisegna, torna "sopra" i disegni tuoi;
quindi i tuoi disegni sono piuttosto fragili/transitorii...
Penso che, per il tuo effetto di "disegno sopra a tutto", possa
convenirti invece _coprire_ l'intero dialogo con un'ulteriore finestra,
trasparente, che lo segua in casi di spostamento o resize.  Pensala
come un foglio da lucido...:-).
Alex