Jak w tym kodzie zwolnić uchwyt pulpitu?

0

witam, mam taki kod i chce w nim zwolnić uchwyt pulpitu, żeby nie wyskakiwał mi błąd "Error create windows", czy jakoś tak.

canvas.Handle:=windows.GetWindowDC(getdesktopwindow);

x:=Mouse.CursorPos.X-27;
y:=Mouse.CursorPos.Y-27;
r:=windows.GetRvalue(canvas.pixels[x,y]);
g:=windows.GetGvalue(canvas.pixels[x,y]);
b:=windows.GetBvalue(canvas.pixels[x,y]);
int[0]:=1;
int[1]:=r;
int[2]:=g;
int[3]:=b;
int[4]:=0;
int[5]:=0;
int[6]:=0;
int[7]:=0;
ComPort1.write(int,7);
0

ReleaseDC(0, canvas.Handle);

p.s. troche bez sensu:

r:=windows.GetRvalue(canvas.pixels[x,y]);
g:=windows.GetGvalue(canvas.pixels[x,y]);
b:=windows.GetBvalue(canvas.pixels[x,y]);

zwroc uwage, ze 3 razy wywolujesz "canvas.pixels[x,y]", a to trwa. lepiej daj jakas zmietta tcolor, do niej wrzuc raz "canvas.pixels[x,y]" a potem tylko getRValue(c) itd...

0
var 
Color :TColor;
R,G,B:Byte;

//gdzieś w kodzie
Color := Canvas.Pixels[x,y];
R := (Color and $0000FF);  
G:= (Color and $00FF00) shr 8;
B:= (Color and $FF0000) shr 16;

Tak jeszcze szybciej:)

0
Piotrekdp napisał(a)
var 
Color :TColor;
R,G,B:Byte;

//gdzieś w kodzie
Color := Canvas.Pixels[x,y];
R := (Color and $0000FF);  
G:= (Color and $00FF00) shr 8;
B:= (Color and $FF0000) shr 16;

Tak jeszcze szybciej:)

Do tego muszę robić uchwyt canvas.Handle:=windows.GetWindowDC(getdesktopwindow); ??
Czy po prostu Color := Canvas.Pixels[x,y];...

0
siekierzyński napisał(a)

Do tego muszę robić uchwyt canvas.Handle:=windows.GetWindowDC(getdesktopwindow); ??
Czy po prostu Color := Canvas.Pixels[x,y];...

tak napisales, ze nie wiadomo o co Ci chodzi.

Piotrekdp napisał(a)
var 
Color :TColor;
R,G,B:Byte;

//gdzieś w kodzie
Color := Canvas.Pixels[x,y];
R := (Color and $0000FF);  
G:= (Color and $00FF00) shr 8;
B:= (Color and $FF0000) shr 16;

Tak jeszcze szybciej:)

dlaczego szybciej?
przeciez GetRValue itp robia praktycznie to samo..
windows.pas:

function GetRValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb);
end;

function GetGValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb shr 8);
end;

function GetBValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb shr 16);
end;
0

Dlatego że masz 6 operacji logicznych zamiast skoków i powrotów z funkcji :P
Domyślam się z Kodu, że pobierasz kolor spod kursora a więc musisz zrobić tak jak robiłes :P

program Test;

{$APPTYPE CONSOLE}

uses
  SysUtils,windows,Graphics;

var Color :TColor;
R,G,B:Byte;
TC,i,Total:Cardinal;

begin
readln;
TC:=Gettickcount();
for  i:= 0 to 99999999 do
begin
R := (Color and $0000FF);
G:= (Color and $00FF00) shr 8;
B:= (Color and $FF0000) shr 16;
end;
Total:= Gettickcount()-TC;
Writeln(Total);
Readln;

TC:=Gettickcount;
for  i:= 0 to 99999999 do
begin
R := GetRValue(Color);
G:= GetGValue(Color);
B:= GetBValue(Color);
end;
Total:= Gettickcount()-TC;
Writeln(Total);
Readln;
end;

Mały test Różnica duża :) u mnie 90 do 1863 taktów a to zysk ponad 20 krotny:)
jak dodamy rzutowanie np. R := byte(Color and $0000FF) do mojego sposobu kod staje się nieco ponad 3x szybszy :) ale nadal jest szybszy :)
@niżej [green] w sumie racja - ale jest oszczędniej ;p

0

przy 100 milionach wywolan? ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1