如何获取屏幕上某一点的颜色信息?(100分)

  • 主题发起人 主题发起人 jpfree
  • 开始时间 开始时间
J

jpfree

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获取屏幕上某一点的颜色信息?
 
先获得屏幕的Canvas
再利用Canvas.Pixels(X,Y)得到颜色信息
 
如何获得屏幕的canvas?
 
var dcanvas:TCanvas;
begin
dcanvas:=tcanvas.create;
dcanvas.handle:=getdc(0);
颜色:=dskcanvas.Pixels(X,Y);//或者GetPixel(dcanvas.Handle,x,y);
end;
 
嘻嘻,是不是想实现DreamWeaver那样的功能,鼠标点取哪儿就得到哪儿的
颜色?下面这段能实现这个功能 ,关键是截获TWMEraseBkgnd消息

type
Tgetcol = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
procedure FormClick(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Panel1Click(Sender: TObject);
procedure FormDblClick(Sender: TObject);
procedure FormResize(Sender: TObject);
private
tx,ty : integer;
procedure WMEraseBkng(var MSg:TWMEraseBkgnd);message WM_ERASEBKGND;
public
{ Public declarations }
end;

var
getcol: Tgetcol;
implementation

{$R *.DFM}
const
Digits : array[0..$F] of Char = '0123456789ABCDEF';

function HexB(B : Byte) : string;
{-Return hex string for byte}
begin
HexB[0] := #2;
HexB[1] := Digits[B shr 4];
HexB[2] := Digits[B and $F];
end;

procedure Tgetcol.WMEraseBkng(var MSg:TWMEraseBkgnd);
begin
Msg.Result:=1;
end;

procedure Tgetcol.FormClick(Sender: TObject);
var t : tcolor;
r,g,b : byte;
begin
t := canvas.pixels[tx,ty];
r := getRvalue(t);
g := getGvalue(t);
B := getBvalue(t);
LABEL2.COLOR := T;
LABEL1.CAPTION := '$00' + HEXB(R) + HEXB(G) + HEXB(B);
end;

procedure Tgetcol.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
tx := x;
ty := y;
end;

procedure Tgetcol.Panel1Click(Sender: TObject);
begin
CLOSE;
end;

procedure Tgetcol.FormDblClick(Sender: TObject);
begin
close;
end;

procedure Tgetcol.FormResize(Sender: TObject);
begin
panel1.top := height - panel1.height -1;
panel1.left := width - panel1.width -1;
panel1.visible := true;
end;

end.
 
多人接受答案了。
 
cheka朋友提供的代码不错,但是有一个缺点。就是它只能得到form窗体内某一点的颜色值,
这段代码我在电闹报大师系列里的《delphi6 编程实例精选》的140页看到。
开始我按照它的方法去编,但是有一个致命的缺点,就是仅仅只能得到form窗体的颜色值,
我要得到屏幕上任一点的颜色值,该如何办呢?,我开始用的方法是:
在form1的oncreate事件里写:
   self.brush.style:=bsClear;//使窗体透明;
然后,就可以得到在form1窗体范围内,屏幕上某点的颜色值。很不方便。
------------------------- 

下面是我整理的代码,基本可以实现了取屏幕上任一点颜色值的问题:
 procedure Tform1.Timer1Timer(Sender: TObject);
var t:tcanvas;
ptMousePos:Tpoint;

begin
GetCursorPos(ptMousePos);//得到鼠标在屏幕上的位置
edit1.text:=inttostr(ptMousePos.x)+inttostr(ptMousePos.y);

t:=tcanvas.Create; 
t.Handle:=getdc(0); //得到屏幕的句柄
edit1.Color:=t.Pixels[ptMousePos.x,ptMousePos.y];
end;


不知道大家对我的见解有什么想法。
 
后退
顶部