Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] come catturo un colore di un pixel ESTERNO al form ?

allora ho trovato GetPixel() nelle api che mi permettono di catturare un
pixel , i parametri sono :
getpixel( hdc long, x long , y long ) e finche metto
GetPixel(form1.hdc,posX,posY) tutto ok , adesso io vorrei catturare un
colore chesso' da un altra finestra o dallo sfondo ... che valore devo
mettere in hdc ?
in praitca devo clonare la funzione "Dropper" di alcuni editor grafici , ma
non so come catturare pixel al di fuori del form :(  Avete consigli ?
Grazie un Gigio e i pixel...

 mettere in hdc ?
Usa la GetDC passando 0 come parametro, ti dà l'hDC dello Screen.
La dichiari come:
    Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
**********************
Se ti posso dare un consiglio, la prossima volta vai su Google
http://groups.google.com/advanced_group_search
, inserisci il
nome di questo NewsGroup e, per esempio, GetPixel.
Ti stupirai di quante info vengono fuori, e poi non ti tocca aspettare
che qualcuno legga e risponda... soprattutto oggi che sono tutti
al meeting ;-) !
Bye, G.
--
Le risposte alle tue domande sono sul Sito Comune
di questo NewsGroup: 
http://it-lang-vb.net/
... e nell'help in linea !

 non so come catturare pixel al di fuori del form :(  Avete consigli ?
Con la GetCursorPos() ottieni le coordinate del mouse sullo schermo
Con la WindowFromPoint() ottieni l'hWnd della finestra date le coordinate.
Con la GetDC()/GetWindowDC() (a seconda delle necessità... per te direi la
seconda) ottineni l'hDC dato l'hWnd.
Con la GetPixel() ottieni il colore
Con la ReleaseDC() rilasci le risorse allocate da GetDC()/GetWindowDC().
Tutto questo se il consiglio di Paperino non funzionasse :)
Ciao

 Con la GetCursorPos()
[cut]
Attenzione!!! Notare questo:
<msdn>
Return Values
The return value is the RGB value of the pixel. If the pixel is
outside of the current clipping region, the return value is
CLR_INVALID.
Remarks
The pixel must be within the boundaries of the current clipping
region.
</msdn>
Ciao
-- 
BSD is for UNIX-lovers -- linux is for Windows-haters.

 region.
Ecco , questo l'ho letto anche io ma non sono molto ferrato in inglese e i
traduttori che uso fanno pena ...
allora in pratica ho capito che se il pixel cade fuori da ???? , la risposta
e' Colore Invalido e quindi si deve stare attenti che il pixel sia  ?????
queste ???? non le ho capite proprio ! :p

 Con la ReleaseDC() rilasci le risorse allocate da GetDC()/GetWindowDC().
grazie per i consigli , peccato non funzioni :(
"GetPixel(GetDC(WindowFromPoint(Int(T_PosX.Text), Int(T_PosY.Text))),
Int(T_PosX.Text), Int(T_PosY.Text))"
con t_posX e con t_posY contenente le coordinate e mi restituisce sempre
"-1" ;(
mettendo tutti i valori restituiti in dei text per controlli mi viene tipo :
hwnd = 11213123
hdc = 21321
colore = -1
bha !

 Int(T_PosX.Text), Int(T_PosY.Text))"
Secondo me lo incasini cercando di passare quegli int(T_PosX.Text)
eccetera...
<MODE Battisti ON>
    ...i miei consigli mai
    Mi arrendo, fa come vuoi,
    ci ritroviamo
    come al solito poi...
<MODE Battisti OFF>
Se tu fossi andato su Google come ti avevo consigliato, avresti
trovato svariati esempi belli e pronti...
Aspè, prova questo:
Crea un progetto nuovo, con solo un form e un modulo, dentro
il modulo queste dichiarazioni:
*********
    Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x _
    As Long, ByVal y As Long) As Long
*********
Metti nel form una PictureBox e un command.
Nella command1_click, incolla questo codice:
*********
     Dim N As Long
     Dim M As Long
     Dim ColoreLetto As Long
     Picture1.ScaleMode = vbPixels
     For N = 0 To 100
          For M = 0 To 100
               ColoreLetto = GetPixel(GetDC(0), N * 10, M * 7)
               Picture1.PSet (N, M), ColoreLetto
          Next M
     Next N
*********
Clicca sul pulsante... se funziona te ne accorgi subito :-))
E' una cosa molto grezza, ma a me funzia. Appropo', i valori
10 e 7 sono per una approssimazione al 1024 e 768.
Ovviamente, nel tuo prog, al posto di quegli "N*7" e "M*10"
metti le coordinate che ti interessano.
------------------------------
A questo punto, faccio un'ipotesi. La tua prossima domanda sarà:
"Come faccio a rilevare un click del mouse al di fuori del mio
form ?"
------------------------------


 region.
Che solitamente corrisponde all'intero schermo :)
Ciao


Mi sono scordato di dirti quello che per me è ormai un'ovvietà :)
Le funzioni API GDI funzionano tutte in pixel e non in twips come VB (usando
i twips sì che vai fuori dalla clipping region [lo schermo]).
Ciao

 che il pixel sia ????? queste ???? non le ho capite proprio ! :p
Il pixel deve essere dentro ai confini della regione di clipping.
Ciao.


 Che solitamente corrisponde all'intero schermo :)
Mmhhh. :-\
Ho avuto diversi problemi con la GetPixel in passato (non in VB,
quindi indipendenti dai twips) dovuti a questo.
Ciao.


 quindi indipendenti dai twips) dovuti a questo.
ok ok , dopo tutte le versioni trovate in giro sia qui sia sui siti ( imho
la versione del sito comune 99-00 era + UserFriendly ... questa e' un po +
caotica nella ricerca delle cose , rivoglio il vecchio indice coi titoletti
vicini , era forse + lenta ma molto + rapida nel ricercare le info IMHO si
intende )
Ecco il codice che risolve il tutto e che cattura il colore sotto il mouse
fuori dal form :
  DCDesktop = GetDC(0&) 'dovrebbe essere il DC del desktop di Windows
comprese le finestre aperte
  lcolor = GetPixel(DCDesktop, Px, Py) 'lcolor contiene il colore long , dc
vedi sopra , px, py sono le coordinate in pixel
  ltemp = ReleaseDC(0&, DCDesktop) 'rilascio risorse
se volete i colori in RGB ho trovato questo semplice codice :
Dim Rosso, Blu, Verde As Integer
ColorValue = lcolor  ' lcolor lo piglio da sopra
Rosso = ColorValue And &HFF&
verde = (ColorValue And &HFF00&) \ 256
blu = (ColorValue And &HFF0000) \ 65536
TNK a tutti per gli aiuti iniziali , siete sempre i migliori !
--
=> Gigio2K <=
http://go.to/ithn
 ( Sito ufficiale del Gruppo di discussione Nokia )
http://www.gamesnet.it
 ( il miglior Portale italiano per i Giochi On Line )
baronef...@yahoo.com
 - THE WORK IS HARD   - THE PAY IS SMALL     - TAKE IT EASY AND FUCK THEM
ALL