Oppure

Loading
19/12/09 22:58
NickoMaiden
ho girovagato su google e il risultato è stato GetPixel() e CreateDIBSection().
voglio ottenere il colore di un pixel sullo schermo in tre variabili (R,G,B).
Qualcuno mi darebbe una dritta su come utilizzare queste funzioni dato che non ci ho capito nulla dai risultati di google?
(e soprattutto, perchè quando provo ad usarla mi da questo errore:
[Linker error] undefined reference to `GetPixel@12'
?
)

uso il compilatore bloodshed dev-c++

EDIT by HeDo: Siamo nella sezione C++, è inutile scriverlo nel titolo
Ultima modifica effettuata da HeDo 15/01/10 9:22
aaa
20/12/09 0:01
HeDo

prima cosa cambia compilatore, il dev lo sconsiglio, su queste cose cade clamorosamente. Usa Visual C++ Express 2008.

cmq devi includere la libreria gdi32.lib :)

sull'uso della GetPixel è tutto nell'msdn: msdn.microsoft.com/en-us/library/…

cmq si presuppone che prima di "prendere una funzione a caso e capire come si usa" si studi un attimino ciò che c'è dietro al posto di postare su un forum dicendo "non ho capito nulla".

Detto questo, per comprendere _come_ usarla devi sapere cos'è un Device Context e un Window Handle di una form. La GetPixel si aspetta un hDC in input e per ottenerlo da un hWnd ci sono funzioni come GetWindowDC. Per ottenere l'hWnd di una specifica finestra bisogna usare opportunamente funzioni come FindWindow o EnumWindows.

Come vedi la situazione è ben più complicata di una funzione con 3 semplici parametri :)
aaa
20/12/09 14:50
NickoMaiden
bene grazie, oggi che ho un po di tempo libero mi metto un po a studiarmi queste cose.
aaa
20/12/09 22:04
giuseppe93
interessa anche a me!! infatti l'avevo già fatta anche io questa domanda ma non ero riuscito a risolvere il problema! :rofl: quando trovi una soluzione puoi postare il codice?
aaa
20/12/09 23:19
HeDo
Postato originariamente da giuseppe93:

interessa anche a me!! infatti l'avevo già fatta anche io questa domanda ma non ero riuscito a risolvere il problema! :rofl: quando trovi una soluzione puoi postare il codice?


non è una "soluzione", è solo lo studio di un'architettura e del funzionamento del sottositema grafico di windows, il che include la conoscenza di alcune api.

aaa
21/12/09 6:03
NickoMaiden
Postato originariamente da giuseppe93:

interessa anche a me!! infatti l'avevo già fatta anche io questa domanda ma non ero riuscito a risolvere il problema! :rofl: quando trovi una soluzione puoi postare il codice?



certo!
aaa
21/12/09 9:18
NickoMaiden
ci sono riuscito, ecco il codice sorgente:
per chi ha il compilatore dev c++ deve impostare il progetto come gui altrimenti da linker error



#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
    
POINT pos;
GetCursorPos (&pos);
HDC hScreenDC = GetDC (NULL);
COLORREF rgb = GetPixel (hScreenDC, pos.x, pos.y);
int red = GetRValue (rgb);
int green = GetGValue (rgb);
int blue = GetBValue (rgb);

//siccome il progetto è impostato come gui non funzionano gli input/output su consolle 
//quindi provvisoriamente ho risolto cosi
char buffer[255];
 itoa (red,buffer,10);
MessageBox(NULL, buffer, "ROSSO", MB_OK); 
itoa (green,buffer,10);
MessageBox(NULL, buffer, "VERDE", MB_OK);
itoa (blue,buffer,10);
MessageBox(NULL, buffer, "BLU", MB_OK);
    
    
   
    system("PAUSE");
    
    return EXIT_SUCCESS;
}




anche se a me è servito a poco perchè mi serviva per fare un pixel bot e il sistema di protezione se ne accorge e mi da sempre nero, cmq non mi arrendo: ho trovato delle sorgenti gia pronte che tramite le stesse funzioni fanno uno screenshot e si vede per bene, magari ce la faccio ad adattarlo a quello che mi serve
Ultima modifica effettuata da NickoMaiden 21/12/09 9:26
aaa
21/12/09 22:02
giuseppe93
HDC hScreenDC = GetDC (NULL);
COLORREF rgb = GetPixel (hScreenDC, pos.x, pos.y);

ma se non prendi l'handle di una finestra come fai ad ottenere il colore? cioè stai cercando di chiedere il colore di un immagine uguale a nulla...
dico bene?
tipo per controllare i colori del desktop basta fare
HDC hScreenDC = GetDC (GetDesktopWindow());
e poi puoi continuare...
aaa