关于transparent属性

zzwu 2011-07-22 04:52:33
我在form上画了图形,又在form上加了一个image,并把image的transparent属性设为false,
照理form上所画图形应被挡住看不见了吧?但结果并非如此,照样显示出来,不知为什么?
...全文
408 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwu 2011-07-31
  • 打赏
  • 举报
回复
在这一点上,delphi的逻辑有点乱。
yqfsan 2011-07-30
  • 打赏
  • 举报
回复
当image上任意地方不画图时,form上的矩形能显示出来,
当image上任意地方画一点什么,不管位置和form上的矩形是否相重合,矩形就不见了。

但这不就是意味imqge不画图的时候是透明的,画了图才不透明吗?


实际上就是这样子,image.Picture没内容时,image就是透明的。
如果image画了点东西,因为重画的原因,form上的矩形也会不见。
skylkj 2011-07-27
  • 打赏
  • 举报
回复
image里面load一个bmp图像(必须是bmp),如果image的transparent是true,那么你load的这个bmp图的最右下角的那个像素的颜色就是透明色

你可以使用一个不常见的颜色填充整个bmp,然后load到image里面
蓝色光芒 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zzwu 的回复:]
但这不就是意味imqge不画图的时候是透明的,画了图才不透明吗?
[/Quote]

在9楼已经说了
既然在同一个Window上,互相覆盖也是很正常的了.这和透明没任何什么关系?
后画的覆盖前面画的(重叠区域)
jdbca 2011-07-23
  • 打赏
  • 举报
回复
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Image1.Transparent = true then
Image1.Transparent := false
else
Image1.Transparent := true;
Self.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.Brush.Color := Self.Color;
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Rectangle(100, 100, 200, 200);
end;

或者image里装一个小单色图,填满。实现方法很多,干嘛钻死胡同
zzwu 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dntohi 的回复:]
你有设置Image1.Picture属性吗?如果没有,看代码,也没有在代码里面装载或者画图形,此时Image是不会Draw出来的。

你可以设置一下Image.Picture属性,或者在代码中装载图片/画一个图形,就可以看到Image会遮盖住Form上的图形了。
[/Quote]

请教一下:不画图,如何设置Image.Picture属性?
zzwu 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 m617105 的回复:]
如果image上没有东西,肯定会显示窗体你画的东西。
[/Quote]

实际就是你说的那样:

当image上任意地方不画图时,form上的矩形能显示出来,
当image上任意地方画一点什么,不管位置和form上的矩形是否相重合,矩形就不见了。

但这不就是意味imqge不画图的时候是透明的,画了图才不透明吗?
蓝色光芒 2011-07-22
  • 打赏
  • 举报
回复
这就是原因

Type
//这样定义只是为了引用protected里的东东
TMyGC = Class(TGraphicControl);

procedure TForm1.Button1Click(Sender: TObject);
begin
if WindowFromDC(Canvas.Handle) = WindowFromDC(TMyGC(Image1).Canvas.Handle) then
Application.MessageBox('原来他们是在同一个Window上绘的.' , '提示' , 64);
//既然在同一个Window上,覆盖也是很正常的了
//WindowFromDC(Canvas.Handle) = Form1.Handle
end;
浩南_哥 2011-07-22
  • 打赏
  • 举报
回复
如果image上没有东西,肯定会显示窗体你画的东西。
DnToHi 2011-07-22
  • 打赏
  • 举报
回复
你有设置Image1.Picture属性吗?如果没有,看代码,也没有在代码里面装载或者画图形,此时Image是不会Draw出来的。

你可以设置一下Image.Picture属性,或者在代码中装载图片/画一个图形,就可以看到Image会遮盖住Form上的图形了。
jdbca 2011-07-22
  • 打赏
  • 举报
回复
image1上本来就没东西,你false肯定也没效果,你要先在image1上brush一点东西,就有效果了。
zzwu 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 babydog01 的回复:]
是不是这条命令把image1给画了?
canvas.Rectangle(100,100,200,200);
[/Quote]

这条语句怎么可能画到image1上去呢?

要在image1上画,应该使用
image1.canvas.Rectangle(100,100,200,200);

zzwu 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 babydog01 的回复:]
为什么呢?贴个图看看。。。。
[/Quote]

贴个有点麻烦。
看到的就是一个Rectangle而已。
babydog01 2011-07-22
  • 打赏
  • 举报
回复
是不是这条命令把image1给画了?
canvas.Rectangle(100,100,200,200);
babydog01 2011-07-22
  • 打赏
  • 举报
回复
为什么呢?贴个图看看。。。。
zzwu 2011-07-22
  • 打赏
  • 举报
回复
代码为:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin
canvas.Rectangle(100,100,200,200);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.Transparent:=false;
end;

end.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧