送分!!!送分!!!送分!!!送分!!!送分!!!(300分)

  • 主题发起人 主题发起人 xFairy
  • 开始时间 开始时间
X

xFairy

Unregistered / Unconfirmed
GUEST, unregistred user!
在制作不规则窗体时,因为图像上每一个像素点Color都需要与Transparent Color做
比较才能确定出窗体的不规则区域,但是使用Pixels,GetPixel等时,实在很慢(也许是
我的机子太老了吧),往往要停顿一会儿,窗体才会出现,虽然可以使用掩模文件的方法
先做出区域信息文件,再用窗体调用,但是每换副图像,又要再做一次掩模文件,太麻烦
了,我想是不是可以先把图像的颜色信息通过某种更快的方法一次性,按[X,Y]坐标顺序读
入到数组中,然后再通过调用数组[X,Y]与Transparent Color做比较。这样就不再需要每
次都读图像的点,速度上应该会快些吧,不过这只是我的想法,成不成立我并不知道,后
来曾看到有人用GetBitmapBits做过,在速度上确实很快,没有明显的停顿了,可惜是用VB
做的,我刚学编程不久,不会改它的原码,所以只有来请教各位高手。

在这里感谢各位!!!
 
使用Scanline吧,速度还是可以的
 
希望给出完整的源程序,因为我很笨!!!
 
这里有一个以前别人贴的图片灰度化的例子,看看你就明白
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
procedure ToGray(abmp:TBitmap; rx,gx,bx,xx:integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ToGray(image1.picture.bitmap,30,59,11,100);//自编转成灰度图的过程
image1.Picture.SaveToFile('1.bmp');
end;

procedure TForm1.ToGray(abmp:TBitmap; rx,gx,bx,xx:integer);
var
i,j:integer;
p:pchar;
c:byte;
begin
abmp.HandleType := bmDIB;
abmp.PixelFormat := pf24bit;
for i:=0 to abmp.Height-1 do
begin
p := abmp.ScanLine;
for j:=1 to abmp.Width do
begin
c := (integer(p^)*rx+integer((p+1)^)*gx+integer((p+2)^)*bx) div xx;
if not(c<255) then c := 255;
p^ := chr(c); //
(p+1)^ := chr(c); //
(p+2)^ := chr(c); //R=G=B
inc(p,3);
end;
end;
end;

end.
 
程序员大本营(www.csdn.net)上有制作不规则窗体的控件,有源代码。
或者去买2张程序员大本营2000的光盘(荟萃版)。


 
需要控件的话,我可以给你email过来!
 
制作不规则窗体的控件有大把



 
同意HTW,去买张吧,你肯定获益匪浅
 
我在程序员大本营看到过椭圆窗体的制作方法:
var r1 : HRgn;
r1 := CreateEllipticRgn(1, -1, Width - 1, Height);
SetWindowRgn(handle, r1, True);
如果窗体不是太不规则的话用这个办法倒是很不错!
 
一个办法,可以生成不规则窗口,而且速度很快
在你生成Rgn区域后,实际是一段数据描述块
你可一把他存储来
然后再调进去
请参考sinkform原码所有的解决问题
 
同意wb_wen
 
I have it .
forevertyn@sina.com
 
分分[:D][:D][:D][:D][:D][:D]
 
www.51delphi.com上有1st的控件可以实现
 
用SetWindowRgn比自己画方便多了
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure WMNCHitTest(var M: TWMNCHitTest);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
rgn:HRGN;
begin
BeginPath(Canvas.Handle);
SetBkMode(Canvas.Handle, TRANSPARENT );
Canvas.Font.Name:= '宋体';
Canvas.Font.Size:=100;
Canvas.TextOut( 20, 20, '大富翁');//窗体就显示这三个字,你可以改成其它字或图形
EndPath(Canvas.Handle);
rgn:= PathToRegion(Canvas.Handle);
SetWindowRgn( Handle, rgn, true );
end;

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
if M.Result=htClient then
M.Result:=htCaption;//你拉窗体也可以移动窗口
end;

end.
 
to:卷起千堆雪tyn
能给我发一份吗?shine@repair.21cn.com 谢了!
 
我以前做的
form 和bmp一致

procedure Tfrm_chart.setmywin;
var
temprgn:hrgn;
bmp:TBitmap ;
x,y,x1,x2:integer;
mycolor:tcolor;
begin
bmp:=TBitmap.Create;
bmp.Width:=Chart1.Width;///你只需改这里
bmp.Height:=Chart1.Height;///你只需改这里
Chart1.PaintTo(bmp.Canvas,1,1);///你只需改这里例如 bmp.loadfromfile('f:/gg.bmp');
myrgn:=CreateRectRgn(0,0,0,0);
mycolor:=bmp.Canvas.Pixels[1,1];
for y:=1 to bmp.Height do
begin
x1:=-1;
x2:=-1;
for x:=1 to bmp.Width do
begin
if bmp.Canvas.Pixels[x,y]<>mycolor then
begin
x2:=x;
if x1<0 then
x1:=x;
end
else
begin
if (x1>0) and (x1<=x2) then
begin
temprgn:=CreateRectRgn(x1-1,y-1,x2,y);
CombineRgn(
myRgn , // handle to destination region
myRgn , // handle to source region
temprgn , // handle to source region
RGN_OR // region combining mode
);
DeleteObject(temprgn);
x1:=-1;
x2:=-1;
end;
end;
end;

end;
SetWindowRgn(
handle ,
myRgn,
true
);
bmp.Free;
end;
 
还有
你要定义
myrgn:hrgn;
myposx,myposY:integer;
 
后退
顶部