这个函数不行,是在canvas里任意画的图形,没法创建他的handle,所以次函数不能判断
解决方案 »
- 为什么我的delphi7 PosEX函数不能用啊。。。
- delphi怎么从.cel,.prt文件读出和写入数据
- 求助treeview和pagecontrol的问题
- 测试SQL数据库有没有问题的命令是?
- 求救(关于Adoquery)
- 修改客户端数据,服务器上怎么改不了呢?
- 打算学delphi了,有.net语言和asp基础,推荐几本书把~,谢谢!
- 菜鸟求救,请各位帮帮忙。急!急!急!
- 快救救我吧,我快要晕了,,100分!!!!
- 请问如何实现当鼠标移动到按钮上,按钮上的文字自动变颜色
- 我不小心把c:\下的几个系统文件删除了,现在垃圾筒中。现在电脑不能启致动了d 它提示:multi(0)disk(0)rdisk(0)partition(1)\bootsect.dos I/O ERRORE,
- 谁有方法做此?
这里还有点资料!http://www.csdn.net/oldexpert/TopicView.asp?id=30544&table=2000
var
Region: HRGN;
begin
BeginPath(Canvas.Handle);
Canvas.Polygon([Point(1, 1), Point(100, 1), Point(100, 100), Point(1, 100)]);
EndPath(Canvas.Handle);
Region := PathToRegion(Canvas.Handle);
if PtInRegion(Region, 10, 10) then ShowMessage('10, 10');
if PtInRegion(Region, 101, 10) then ShowMessage('101, 10');
end;
function PointInPolygon(mPoint: TPoint; mPoints: array of TPoint): Boolean;
var
Region: HRGN;
begin
with TForm.Create(nil) do try
BeginPath(Canvas.Handle);
Canvas.Polygon(mPoints);
EndPath(Canvas.Handle);
Region := PathToRegion(Canvas.Handle);
Result := PtInRegion(Region, mPoint.X, mPoint.Y);
DeleteObject(Region);
finally
Free;
end;
end; { PointInPolygon }procedure TForm1.Button2Click(Sender: TObject);
begin
if PointInPolygon(Point(10, 10),
[Point(1, 1), Point(100, 1), Point(100, 100), Point(1, 100)]) then
ShowMessage('10, 10');
if PointInPolygon(Point(101, 10),
[Point(1, 1), Point(100, 1), Point(100, 100), Point(1, 100)]) then
ShowMessage('101, 10');
end;
procedure Polygon(const Points: array ofTPoint; Winding: Boolean = False; StartIndex: Integer = 0; NumPts: Integer = -1);
另外zswang(伴水)(被黑中)的方法绝对可行,也不是太慢(直大致思路,代码没细看):
procedure Tform1.fillPolygon(mPoints:array of TPoint);
var
Region:HRGN;
begin
with TForm.Create(nil) do try
BeginPath(Canvas.Handle);
Canvas.Polygon(mPoints);
EndPath(Canvas.Handle);
Region:=PathToRegion(canvas.Handle );
//paintrgn(canvas.Handle,Region);
Fillrgn(canvas.Handle,Region,canvas.Brush.Handle);
finally
free;
end;
end;
请指点
procedure TForm1.Button1Click(Sender: TObject);
var
rgn : HRGN;
rgnPoints : array of TPoint;
hbr : HBRUSH;
point : TPoint;
begin
setlength(rgnPoints,4);
rgnPoints[0].X := 0;
rgnPoints[0].Y := 0;
rgnPoints[1].X := 100;
rgnPoints[1].Y := 0;
rgnPoints[2].X := 100;
rgnPoints[2].Y := 100;
rgnPoints[3].X := 0;
rgnPoints[3].Y := 100;
point.X := 50;
point.Y := 50;
rgn := CreatePolygonRgn(rgnPoints[0],4,WINDING);
if rgn<>0 then
begin
hbr := CreateSolidBrush(clRed);
if (Ptinregion(rgn,point.X,point.Y)=True) then
FillRgn(Form1.Canvas.Handle,rgn,hbr);
deleteObject(rgn);
DeleteObject(hbr);
end;
end;
如果背景是单一的,你可以用FloodFill试试!
你是不是想改变整个图的色度呀,这就简单多了!
我还以为,墙变了,而花纹的颜色呀都不改变!
你可以用Tbitmap的Scanline性质来做,当然只能是24bit图,而且原理就是逐点扫描,但是快得多,不过里面还要用到颜色模型的转换!
bmp中,以前我就是这样做的;不过不知道你到底要做什么,所以恐怕也不是很适合!
1。至于取点的颜色,可以用pixels[i,j],你已试过,太慢,
2。也可以另外创建的bmp,用pixels[i,j],会比直接用canvas的快一些!处理完后,在整个将bmp画到画布上去!
3。用指针,直接从bmp的scanline属性中取该点颜色,当然了此法最麻烦,但速度也相对较快!
该法的其余部分同2。
bmp := Tbitmap.create(),然后copyrect()
然后 bmp.canvas.pixels[i,j];这样做就不是每画一个点就更新一遍用户界面,所以会比第一法快一些!
bmp.canvas.pixels[i,j]
32bit,从高到低依次为:
Alpha通道,Blue通道,Green通道,Red通道,
每个通道一个字节,正好!
对于一般的处理而言,可以不管Alpha通道!
用scanline得到24bit图,没有Alpha通道!