Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ **** UBPFD *********** by delphibase.endimus.com **** >> Определение кода цвета пикселя под курсором Это готовая к употреблению программа. Состоит из двух модулей: основного и потокового. Принцип таков: часть экранной области, находящейся в районе курсора, 'фотографируется' и помещается в TImage с двойным увеличением. В центре находится координата нужного нам пикселя. Извлекаем информацию об этом пикселе и отображаем данные в виде основных представлениях данных. Программа также показывает, как использовать класс TThread вместо компонента TTimer, что гораздо выгоднее для любого приложения. P.S. Исходники этой проги пользуются большим спросом на других сайтах по Delphi. Зависимости: Стандартный набор Автор: diaz, diaz@en.net.ua, ICQ:98181410, Ukraine-Nikopol Copyright: Copyright(C)Diaz's Studio, 1999-2004 Дата: 8 января 2004 г. ***************************************************** } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Модуль класса TThread - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unitTPixTimer_Unit; interface
uses
Windows, Classes, SysUtils, Forms, Pix_Unit; //подключить модуль формы type
TPixTimer = class
(TThread) private
{ Private declarations } procedure
RefreshInfo; protected
procedure
Execute; override
; end
; var
PixTimer: TPixTimer; implementation
{ TPixTimer } {поток для расчетов} procedure
TPixTimer.Execute; begin
repeat
GetCursorPos(CurPos); if
(CurPos.x <> curX) or
(CurPos.y <> curY) then
Synchronize(RefreshInfo); //синхронизация потока sleep(10); //быстрее - нет особого смысла. //если вообще убрать sleep(), то скорость будет максимальной, //но конкретно для данного приложения это не будет полезно. until
false; end
; {обновление данных для визуальных компонентов} procedure
TPixTimer.RefreshInfo; var
col: dword; r, g, b, ri, gi, bi: byte; glr, glg, glb: word; begin
curX := CurPos.x; curY := CurPos.y; CurColor := DeskTopCanvas.Pixels[curX, curY]; r := getRvalue(CurColor); g := getGvalue(CurColor); b := getBvalue(CurColor); if
r = 255 then
glr := 1 else
glr := round((r / 255) * 1000); if
g = 255 then
glg := 1 else
glg := round((g / 255) * 1000); if
b = 255 then
glb := 1 else
glb := round((b / 255) * 1000); if
(r >= 96) and
(r <= 160) then
ri := 255 else
ri := 255 - r; if
(g >= 96) and
(g <= 160) then
gi := 255 else
gi := 255 - g; if
(b >= 96) and
(b <= 160) then
bi := 255 else
bi := 255 - b; col := PALETTERGB(ri, gi, bi); ScrRect := Bounds(curX - whi div
2, curY - whi div
2, whi, whi); with
ScallBm.Canvas do
begin
CopyRect(ScallRect, DeskTopCanvas, ScrRect); Pen.Color := col; {rect} MoveTo(0, 0); LineTo(who - 1, 0); LineTo(who - 1, who - 1); LineTo(0, who - 1); LineTo(0, 0); {cross} MoveTo(whi, 0); LineTo(whi, whi - 2); LineTo(whi + 1, whi - 2); LineTo(whi + 1, 0); MoveTo(whi, who - 1); LineTo(whi, whi + 3); LineTo(whi + 1, whi + 3); LineTo(whi + 1, who - 1); MoveTo(0, whi); LineTo(whi - 2, whi); LineTo(whi - 2, whi + 1); LineTo(0, whi + 1); MoveTo(who - 1, whi); LineTo(whi + 3, whi); LineTo(whi + 3, whi + 1); LineTo(who - 1, whi + 1); end
; with
form1 do
begin
Image1.Picture.Bitmap := ScallBm; Left := curX + FPosX; top := curY + FPosY; label1.Font.Color := col; label1.Caption := inttohex(r, 2) + ' ' + inttohex(g, 2) + ' ' + inttohex(b, 2); //(H) label2.Font.Color := col; label2.Caption := inttostr(r) + ' ' + inttostr(g) + ' ' + inttostr(b); //(D) label3.Font.Color := col; label3.Caption := inttostr(CurColor); //(D) label4.Font.Color := col; label4.Caption := floattostr(glr) + ' ' + floattostr(glg) + ' ' + floattostr(glb); //OpenGL color Color := CurColor; {двигаем форму на краях экрана} if
curX + ClientWidth div
2 > screen.width then
FPosX := -ClientWidth else
FPosX := -ClientWidth div
2; if
curX - ClientWidth div
2 < 0 then
FPosX := 0; if
curY + ClientHeight + ClientHeight div
2 > screen.Height then
FPosY := -ClientHeight - ClientHeight div
2 else
FPosY := ClientHeight div
2; end
; end
; end
.
Пример использования:
unitPix_Unit; interface
uses
Windows, Classes, Forms, StdCtrls, Controls, ExtCtrls, Graphics, Menus; type
TForm1 = class
(TForm) Image1: TImage; MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; Label1: TLabel; Label3: TLabel; Label2: TLabel; Label4: TLabel; procedure
FormCreate(Sender: TObject); procedure
Exit1Click(Sender: TObject); procedure
FormClose(Sender: TObject; var
Action: TCloseAction); private
{ Private declarations } public
{ Public declarations } end
; const
whi = 32; who = whi * 2; var
Form1: TForm1; DeskTopCanvas: TCanvas; ScallBm: TBitmap; ScrRect, ScallRect: TRect; curX, curY: integer; CurPos: TPoint; CurColor: dword; FPosX, FPosY: integer; implementation
uses
TPixTimer_Unit; //подключить потоковый модуль {$R *.DFM} procedure
TForm1.FormClose(Sender: TObject; var
Action: TCloseAction); begin
PixTimer.Suspended := true; //остановить поток ScallBm.Free; DeskTopCanvas.Free; Action := caFree; //освободить все связанное с приложением end
; procedure
TForm1.Exit1Click(Sender: TObject); begin
close; end
; procedure
TForm1.FormCreate(Sender: TObject); begin
Form1.ClientWidth := who * 2; Form1.ClientHeight := who; image1.Width := who; image1.Height := who; {} GetCursorPos(CurPos); FPosX := curX - form1.ClientWidth div
2; FPosY := form1.ClientHeight div
2; DeskTopCanvas := TCanvas.Create; DeskTopCanvas.Handle := GetDC(HWnd_DeskTop); ScrRect := Bounds(curX - whi div
2, curY - whi div
2, whi, whi); ScallRect := Bounds(0, 0, who, who); ScallBm := TBitmap.Create; with
ScallBm do
begin
pixelformat := pf32bit; Width := who; Height := who; end
; SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or
SWP_NOMOVE or
SWP_NOSIZE); //поверх всех окон PixTimer := TPixTimer.Create(false); //создать поток и запустить его(false) PixTimer.Priority := tpNormal; //приоритет для потока end
; end
.