我有一个底图是一个bmp.然后我用鼠标在上面点击,点击一下,以这个点为起始点加一个小的位图,可能加的位图有多种.过一段时间刷新,把一些删除,恢复原来的底色,应该

  • 主题发起人 主题发起人 ugvanxk
  • 开始时间 开始时间
U

ugvanxk

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个底图是一个bmp.然后我用鼠标在上面点击,点击一下,以这个点为起始点加一个小的位图,可能加的位图有多种.过一段时间刷新,把一些删除,恢复原来的底色,应该怎么做.(300分)<br />我有一个底图是一个bmp.然后我用鼠标在上面点击,点击一下,以这个点为起始点加一个小的位图,可能加的位图有多种.过一段时间刷新,把一些删除,恢复原来的底色,应该怎么做.
 
不难的.主要是用Canvas.CopyRect函数来实现.

现在没时间给代码和测试.晚上再关注
 
我按你的要求做了一个(不知道理解的对不对)
因为涉及界面设计,有必要的话我发给你.先把代码贴上你看看

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
ImageList1: TImageList;
Timer1: TTimer;
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
ToolButton1: TToolButton; //用于选择小位图
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject); //定时恢复
procedure ToolButtonClick(Sender: TObject);
private
ImageNum :integer;
FBitmap :TBitmap;
tmpBitmap :array of TBitmap; //用于保存背景图片
tmpRect :array of TRect; //用于保存背景图片的区域
procedure DrawTBitmap(AHdc:HDC;Image:TBitmap;x,y:Integer;Col:TColor);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
//这是画透明的小图,否则简单的多
procedure TForm1.DrawTBitmap(AHdc:HDC;Image:TBitmap; x,y:Integer;Col:TColor);
var
TransColor :TColor;
OldBkColor :TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave,
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld :HBITMAP;
hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave :HDC;
ptSize :TPoint;
begin
TransColor :=Col or $02000000;

hdcTemp :=CreateCompatibleDc(AHdc);
SelectObject(hdcTemp,Image.Handle);
ptSize.x :=Image.Width ;
ptSize.y :=Image.Height ;
DPtoLP(hdcTemp,ptSize,1);
hdcBack :=CreateCompatibleDc(AHdc);
hdcObject :=CreateCompatibleDc(AHdc);
hdcMem :=CreateCompatibleDc(AHdc);
hdcSave :=CreateCompatibleDc(AHdc);

bmAndBack :=CreateBitmap(ptSize.x,ptSize.y,1,1,nil);
bmAndObject :=CreateBitmap(ptSize.x,ptSize.y,1,1,nil);
bmAndMem :=CreateCompatibleBitmap(AHdc,ptSize.x,ptSize.y);
bmSave :=CreateCompatibleBitmap(AHdc,ptSize.x,ptSize.y);

bmBackOld :=SelectObject(hdcBack,bmAndBack);
bmObjectOld :=SelectObject(hdcObject,bmAndObject);
bmMemOld :=SelectObject(hdcMem,bmAndMem);
bmSaveOld :=SelectObject(hdcSave,bmSave);

SetMapMode(hdcTemp,GetMapMode(AHdc));
BitBlt(hdcSave,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);
OldBkColor :=SetBkColor(hdcTemp,TransColor);
BitBlt(hdcObject,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);

SetBkColor(hdcTemp,OldBkColor);
BitBlt(hdcBack,0,0,ptSize.x,ptSize.y,hdcObject,0,0,NOTSRCCOPY);

BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,AHdc,x,y,SRCCOPY);
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCAND);
BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCAND);
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCPAINT);
BitBlt(AHdc,x,y,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);

DeleteObject(SelectObject(hdcBack,bmBackOld));
DeleteObject(SelectObject(hdcObject,bmObjectOld));
DeleteObject(SelectObject(hdcMem,bmMemOld));
DeleteObject(SelectObject(hdcSave,bmSaveOld));
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcSave);
DeleteDC(hdcTemp);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
k :integer;
begin
k:=Length(tmpBitmap);
SetLength(tmpRect, k+1);
tmpRect[k]:=Rect(X, Y, X+FBitmap.Width, Y+FBitmap.Height);
SetLength(tmpBitmap, k+1);
tmpBitmap[k]:=TBitmap.Create;
tmpBitmap[k].Canvas.CopyRect(Rect(0, 0, FBitmap.Width, FBitmap.Height), Image1.Canvas, tmpRect[k]);
FBitmap.FreeImage;
ImageList1.GetBitmap(ImageNum, FBitmap);
DrawTBitmap(Canvas.Handle, FBitmap, Image1.Left+X, Image1.Top+Y, FBitmap.TransparentColor);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ImageNum:=0;
FBitmap :=TBitmap.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
i, k :integer;
begin
FBitmap.Free;
k:=Length(tmpBitmap);
for i:=0 to k-1 do
tmpBitmap.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
k :integer;
begin
k:=Length(tmpBitmap);
if k<1 then Exit;
Image1.Canvas.CopyRect(tmpRect[k-1], tmpBitmap[k-1].Canvas, Rect(0, 0, FBitmap.Width, FBitmap.Height));
SetLength(tmpRect, k-1);
tmpBitmap[k-1].Free;
SetLength(tmpBitmap, k-1);
end;

procedure TForm1.ToolButtonClick(Sender: TObject);
begin
ImageNum:=(Sender as TToolButton).Tag;
end;

end.
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部