绘图(100分)

  • 主题发起人 主题发起人 wzpok
  • 开始时间 开始时间
W

wzpok

Unregistered / Unconfirmed
GUEST, unregistred user!
我用form的cavas.draw方法在form上绘图bmp总不行。如何办?
 
怎么不行?
给你贴段代码!
var bit:tbitmap;
...
begin
bit:=Tbitmap.create(self);
bit.loadfromfile('c:/....');
form1.canvas.draw(0,0,bit);
bit.free;
end;
是这样吗?
 
sorry!
> bit:=Tbitmap.create(self);应改为
bit:=Tbitmap.create;
 
哎,来迟了一步!
你要注意的是你直接在Form的Canvas上Draw,当你的窗口被别的窗口盖住后,你再
激活它,Form不会重绘,解决的方法有两个:
1。书写Form的OnPaint事件
2。放一个TImage控件在Form上,然后将bitmap画到image的Canas上
 
哎,来得更迟了!!
不过,把五公子的代码贴上来,我常这样用。没错
procedure TfrmMain.FormPaint(Sender: TObject);
begin
canvas.draw(0,0,Img_Back.Picture.Graphic);
end;
新搞了一个自带贴图的Panel,比Form的贴图麻烦多了
顺便问一句:如何把Panel 后面的背景拷出来,我试过N多次,
答案很简单:当机!!!

 
CopyRect,StretchDraw都可以
 
取得panel后面的背景很简单哦
两种方法:
1. panel.visible := false; get the background; panel.visible := true;

2. 稍微麻烦点(使panel自身变成透明):
如果自己做个控件继承自TPanel的话比较容易:
1. override createparams方法:
procedure CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(params);
Params.exstyles := Params.exstyles or WS_EX_TRANSPARENT; // 设置为透明窗
end;

2. 截取WM_ERASEBKGND消息.
procedure WMEraseBkgnd(var Message: TMessage);
begin
Message.result := 1; // 什么都不做既返回. panel默认的erasebkgnd将
// fillrect, 所以需要去掉它
end;
3. 最重要的一步: 需要通过SetWindowLong修改parent control的style:
procedure SetParentStyle;
begin
SetWindowLong(Parent.Handle, GWL_STYLE,
GetWindowLong(Parent.Handle, GWL_STYLE) and
not WS_CLIPCHILDREN);
// 如果没有这步, parent在repaint时不会画上被当前panel遮住的部分. 不过在
// 第一次建立时也能取到背景, 不过不是parent的图案, 而是透明到Desktop上去了,
// 显示的是当前Desktop上的图案, 效果就象在你的form上挖了个洞.
RecreateWnd; // 重建当前panel的handle, 系统将自动重画, 这时panel的
// 背景已经是原先被遮住的部分了
end;
以上各步是建立透明TWinControl类可视控件的必备步骤.

如果想在外界实现也是可行的(不继承), 完全可以在程序运行过程中将一个标准panel变成透明.

主要思路和上面一样, 只是需用SetWindowLong(Panel.handle, GWL_EXSTYLE, ....)
替换上述override CreateParams步骤, 然后替换panel的windowproc(需要保存原来的
windowproc地址), 用如下代码:
SetWindowLong(Panel.handle, GWL_WNDPROC, integer(@NewWindowProc));
在NewWindowProc过程中判断接受的消息是否是WM_ERASEBKGND, 如果是, 则直接返回, 否
则用CallWindowProc调用原来panel的windowproc处理)

最后RecreateWnd, 重建整个form, 你就会发觉原来不透明的panel变透明了(对其他控件没有
影响)
 
讨论离题了吧?!
chat* praise Another_eYes
chat* lovelook Another_eYes
 
你的问题怎么样了,还不会用吗?不结束我可要分分了.
 
问题解决后,请尽快结束问题,以减少待答问题数量!
 
我试了一个程序如下可以改为delphi,wzpok你可以用一下,有问题贴出来!!

//
//This program you can copy from help of delphi/bcb.
//
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();
Graphics::TBitmap *Bitmap2 = new Graphics::TBitmap();
try
{
Bitmap1->LoadFromFile("C://TEMP//1.BMP");
Bitmap2->Assign(Bitmap1);
Bitmap2->Dormant();
Bitmap2->FreeImage();
Canvas->Draw(20,20,Bitmap2);
Canvas->Draw(80,80,Bitmap2);
Bitmap2->ReleaseHandle();
}
catch (...)
{
MessageBeep(0);
}
delete Bitmap1;
delete Bitmap2;
}
//--------------------------------------------------------------------
不知在此的http连接怎么实现?
 
后退
顶部