求异形-控件原代码,要求从TGraphicControl继承,并能拖动 (200分)

  • 主题发起人 主题发起人 天空还下着沙
  • 开始时间 开始时间

天空还下着沙

Unregistered / Unconfirmed
GUEST, unregistred user!
主  题: 求异形-控件原代码,要求从TGraphicControl能拖动
作  者: blueshrimp (天空还下着沙)
等  级:
信 誉 值: 100
所属论坛: Delphi
问题点数: 100
回复次数: 3
发表时间: 2002-9-18 11:00:57



我找了TShape,从他的父类继承,可我对面向对象不精通,所以失败了
麻烦写成Pas,并且带上实例
分数可以再加。
若不愿公开代码,可以将代码发到我信箱blueshrimp@yeah.net

要求一定提供原代码。第三方控件也算
多谢。



怎么Graphics.pas里有个TBitmap与Windows.pas里的TBitmap重复了


 
什么是异形,电影里面的嘛?哈哈哈哈
 
就是不规则的外形啊
 
怎么没有人理睬我?
 
不是有画不规则图形的API的嘛,你看以前的例子嘛!拖动可以设控件的DragMode嘛![?]
 
继承Shape ,然后对它的mousedown 与 Mousemove 进行覆盖,在mousedown 里设一个
开关变量,在mousemove 里更改Top 与 Left 的值就可以实现你所想要的功能了!
 
在控件里重写这三个过程就OK了!
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
override;
procedure MouseMove(Shift: TShiftState;
X, Y: Integer);
override;
procedure MouseUp(Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
override;
 
unit YJBoard;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Graphics, ExtCtrls;
const
sc_DragMove: LongInt = $F012;
type
TDirection = (dUp, dDown, dLeft, dRight);
TYJBoard = class(TCustomControl)
private
FBoardTag : integer;
FDirection : TDirection;
MouseX : integer;
MouseY : integer;
FPicture: TPicture;
FCanvas: TControlCanvas;
FDrawing: Boolean;
procedure getBoardTag(Value: integer);
function setBoardTag : integer;
function GetCanvas: TCanvas;
procedure SetPicture(Value: TPicture);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedure Paint;
override;
property Canvas: TCanvas read GetCanvas;
procedure CreateParams(var Params: TCreateParams);
override;
procedure WmLButtonDown(var Msg: TWmLButtonDown);
message wm_LButtonDown;
procedure WmMove(var Msg: TWmMove);
message wm_Move;
published
{ Published declarations }
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
property BoardTag : integer read FBoardTag;
property Picture: TPicture read FPicture write SetPicture;
end;

implementation
var
TempPicture : TPicture;
//构造
constructor TYJBoard.Create(AOwner: TComponent);
var
FullRgn, NewRgn : Integer;
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
TempPicture := TPicture.Create;
TempPicture.LoadFromFile('E:/Sample.bmp');
//FCanvas.StretchDraw(Rect(0, 0, 100, 100), TempPicture.Bitmap.Canvas);
// TempCanvas.Control := Self;
Left := 20;
Top := 20;
Width := 100;
Height := 100;
//完整区域
//FullRgn := CreateRectRgn(10, 10, 90, 90);
//异型区域
//NewRgn := CreateRoundRectRgn(0, 0, 20, 20, 20, 20);
//合并区域,从参2中按参四方式与参3进行运算,返回值传给参1,参4值RGN_DIFF为减去,RGN_OR为合并
//CombineRgn(FullRgn, FullRgn, NewRgn, RGN_OR);
//设置可见区域
//SetWindowRgn(Self.Handle, FullRgn, TRUE);
end;
//析构
destructor TYJBoard.Destroy;
begin
FCanvas.Free;
inherited Destroy;
end;
//过程
procedure TYJBoard.SetPicture(Value: TPicture);
begin
FPicture.Assign(Value);
end;

procedure TYJBoard.WmMove(var Msg: TWmMove);
begin
Invalidate;
end;

procedure TYJBoard.WmLButtonDown(var Msg: TWmLButtonDown);
begin
// Perform(wm_SysCommand, sc_DragMove, 0);
Perform(WM_SYSCOMMAND, $F012, 0);
end;

procedure TYJBoard.Paint;
begin
// Canvas.CopyRect(Rect(0, 0, 100, 100), TempPicture.Bitmap.Canvas, Rect(0, 0, 100, 100));
BitBlt(Self.Canvas.Handle, 0, 0, 100, 100, TempPicture.Bitmap.Canvas.Handle, 0, 0, SRCCopy);
end;

procedure TYJBoard.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle + ws_ex_Transparent;
end;

procedure TYJBoard.getBoardTag(Value: integer);
begin
FBoardTag := Value;
end;
//函数
function TYJBoard.GetCanvas: TCanvas;
begin
Result := FCanvas;
end;

function TYJBoard.setBoardTag : integer;
begin
Result := FBoardTag;
end;

end.

以上代码能运行,但有闪烁。
 
多人接受答案了。
 
后退
顶部