根据Label创建Cursor<GetBitmapBits>(50分)

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

wrl_001

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
function CreateLabelCursor(ALabel: TLabel): HCursor;
var
A, B: array of Byte;
bm:TBitmap;
r:TRect;
begin
bm:=TBitmap.Create;
r:=Rect(0,0,ALabel.Width,ALabel.Height);
SetLength(A, ALabel.Width*ALabel.Height);
SetLength(B, ALabel.Width*ALabel.Height);
bm.Width :=ALabel.Width;
bm.Height :=ALabel.Height;
bm.Canvas.CopyRect(r,ALabel.Canvas,r);
Form1.Canvas.Draw(0,0,bm);
// GetObject(bm.Handle ,Sizeof(a),a);
GetBitmapBits(bm.Handle,sizeof(a),a);
// GetBitmapBits(bm.Handle,sizeof(b),b);
Result:=CreateCursor(Application.Handle,Round(ALabel.Width/2),Round(ALabel.Height/2),
ALabel.Width, ALabel.Height, @A[0], @B[0]);
bm.Free;
end;

procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=Source is TLabel;
end;

procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Memo1.Lines.add(TLabel(Source).Caption);
end;

procedure TForm1.Label1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
if Screen.Cursors[1]<>Screen.Cursors[crDefault] then
DestroyCursor(Screen.Cursors[1]);
Screen.Cursors[1]:=CreateLabelCursor(TLabel(Sender));
TLabel(Sender).DragCursor :=1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Screen.Cursors[1]<>Screen.Cursors[crDefault] then
DestroyCursor(Screen.Cursors[1]);
end;
不知道错在哪里?哪位帮忙看看
 
MSDN上抄了一个例子,现在问题是搞不清楚AND mask和XOR mask[:(!]
function CreateCustomCursor: HCursor;
const
ANDmaskCursor: array[0..31] of DWORD=
($FFFC3FFF,
$FFC01FFF,
$FF003FFF, // line 3
$FE00FFFF, // line 4
$F701FFFF, // line 5
$F003FFFF, // line 6
$F003FFFF, // line 7
$E007FFFF, // line 8
$C007FFFF, // line 9
$C00FFFFF, // line 10
$800FFFFF, // line 11
$800FFFFF, // line 12
$8007FFFF, // line 13
$0007FFFF, // line 14
$0003FFFF, // line 15
$0000FFFF, // line 16
$00007FFF, // line 17
$00001FFF, // line 18
$00000FFF, // line 19
$80000FFF, // line 20
$800007FF, // line 21
$800007FF, // line 22
$C00007FF, // line 23
$C0000FFF, // line 24
$E0000FFF, // line 25
$F0001FFF, // line 26
$F0001FFF, // line 27
$F8003FFF, // line 28
$FE007FFF, // line 29
$FF00FFFF, // line 30
$FFC3FFFF, // line 31
$FFFFFFFF);
XormaskCursor: array[0..31] of DWORD=(
$00000000, // line 1
$0003C000, // line 2
$003F0000, // line 3
$00FE0000, // line 4
$0EFC0000, // line 5
$07F80000, // line 6
$07F80000, // line 7
$0FF00000, // line 8
$1FF00000, // line 9
$1FE00000, // line 10
$3FE00000, // line 11
$3FE00000, // line 12
$3FF00000, // line 13
$7FF00000, // line 14
$7FF80000, // line 15
$7FFC0000, // line 16
$7FFF0000, // line 17
$7FFF8000, // line 18
$7FFFE000, // line 19
$3FFFE000, // line 20
$3FC7F000, // line 21
$3F83F000, // line 22
$1F83F000, // line 23
$1F83E000, // line 24
$0FC7E000, // line 25
$07FFC000, // line 26
$07FFC000, // line 27
$01FF8000, // line 28
$00FF0000, // line 29
$003C0000, // line 30
$00000000, // line 31
$00000000); // line 32
begin
Result := CreateCursor( Application.Handle,19,2,32,32,@ANDmaskCursor,@XORmaskCursor ); // XOR mask
end;
 
自己搞定:
function CreateCursorByBmp(bmp:TBitmap):HCursor;
var
IconSizeX : integer;
IconSizeY : integer;
AndMask : TBitmap;
XOrMask : TBitmap;
IconInfo : TIconInfo;
begin
IconSizeX :=bmp.Width;
IconSizeY :=bmp.Height;
AndMask := TBitmap.Create;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;
AndMask.Canvas.Brush.Color := clBlack;
AndMask.Canvas.Rectangle(0, 0, IconSizeX, IconSizeY);

XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;
StretchBlt(XorMask.Canvas.Handle, 0, 0, IconSizeX, IconSizeY,
Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, SRCCOPY);

IconInfo.fIcon := False;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := XOrMask.Handle;
Result:= CreateIconIndirect(IconInfo);
AndMask.Free;
XOrMask.Free;
end;
作个广告,如有兴趣可以看看:
http://wrl_001.delphibbs.com的CreateCursor By BMP部分
 
进来闲逛。。。路过。。。。
 
总算来了一个/yun
 

Similar threads

I
回复
0
查看
746
import
I
I
回复
0
查看
561
import
I
I
回复
0
查看
690
import
I
后退
顶部