Tylko teraz problem jak to zrobić, ponieważ "color area" by miało działać na zasadzie że pobieram jakiś kolor z pulpitu a program po wciśnięciu jakiegoś klawisza lokalizuje (wyświetla położenie XY piksela z tym kolorem) ten kolor na pulpicie, nawet jeśli on jest w innym miejscu...
Potrzebujesz na bieżąco sprawdzać kolor piksela znajdującego się pod kursorem. Do tego celu wystarczy kilka linijek kodu – stworzyć nowy obiekt płótna i ustawić mu uchwyt na ten pulpitu:
uses
Windows, {...};
{..}
private
FDesktopCanvas: TCanvas;
{...}
FDesktopCanvas := TCanvas.Create();
FDesktopCanvas.Handle := GetWindowDC(GetDesktopWindow());
To wszystko – płótno możesz teraz wykorzystywać jak każde inne, tak samo jak płótno formularza czy komponentu. Ono zawiera wszystko co znajduje się na pulpicie.
Jeśli potrzebujesz tylko pobrać dane koloru piksela pod kursorem, to np. w zdarzeniu wciśnięcia konkretnego klawisza (lub wciśnięcia przycisku – z poziomu klawiatury rzecz jasna, bo kursor może być gdziekolwiek) wykonujesz poniższe:
var
LCursorPos: TPoint = (X: 0; Y: 0);
LColor: TColor;
begin
GetCursorPos(LCursorPos);
LColor := GetPixel(FDesktopCanvas.Handle, LCursorPos.X, LCursorPos.Y);
Zmienna LColor
zawierać będzie kolor piksela spod kursora.
Natomiast jeśli chcesz mieć podgląd koloru na żywo po włączeniu funkcji pobierania koloru (czyli na bieżąco, podczas przesuwania kursorem) to możesz w prosty sposób wykorzystać zwykły timer, w którym co określony interwał (np. 100ms) timer będzie pobierał kolor pod kursorem i używał go do malowania kontrolki podglądu (np. małego TPaintBox
). Włączenie funkcji pobierania koloru odpali timer, jej wyłączenie (np. specjalnym skrótem klawiszowym) go zatrzyma.
Współrzędne tego piksela są znane, bo funkcja GetCursorPos
je zwraca. Koordynaty te są bezwzględne, czyli dotyczą całego pulpitu, a nie ekranu czy formularza aplikacji. Liczba monitorów i ich układ nie ma znaczenia. Jeśli będą one potrzebne w późniejszym czasie to też sobie je przechowaj.
image area, powinno działać na podobnych zasadach tylko w stylu takim że jak bym robił zdjęcie dla pulpitu […]
Nie musisz robić zdjęcia całości – szkoda na to czasu i zasobów. Masz dostep do płótna całego pulpitu, więc spokojnie wystarczy CopyRect
zadanego fragmentu do pomocniczej, 24-bitowej bitmapy. Kod poboru współrzędnych kursora masz wyżej, klasę płótna też. Jak będziesz chciał użyć funkcji z Windows API do pobrania zadanego obszaru pulpitu, to uchwyt typu HDC
zwraca właściwość FDesktopCanvas.Handle
.
Podane kody działają pod Lazarusem i pochodzą z mojego ”color pickera”.