Q&A

  • listbox item drag시 drag item 보여주기...


고수님들께 부탁...



윈도우 탐색기에서 화일을 드래그 할 때 화일명이 흐릿하게 보여집니다.



이와같은 효과를 리스트 박스 아이템을 드래그 하면서 나타내고 싶은데...



아는게 짧아서...



고수님들의 한 수 부탁드립니다.

1  COMMENTS
  • Profile
    홍성락 2001.08.14 08:29
    player wrote:

    >

    > 고수님들께 부탁...

    >

    > 윈도우 탐색기에서 화일을 드래그 할 때 화일명이 흐릿하게 보여집니다.

    >

    > 이와같은 효과를 리스트 박스 아이템을 드래그 하면서 나타내고 싶은데...

    >

    > 아는게 짧아서...

    >

    > 고수님들의 한 수 부탁드립니다.

    ////////////////////////////////////////////////////////////////////////

    예전에 게시판을 찾으면 투명Panel를 만드는것이 있거든요 그것을 조금고쳐사용하시면됩니다. 아래와같이 코딩해보세요

    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ExtCtrls, Buttons;



    type

    //hsr///////////////////////////////////////////

    TTransparentPanel = Class(TPanel)

    Private

    Procedure SetParent(AParent:TWinControl); Override;

    Procedure WMEraseBkGnd(Var Message:TWMEraseBkGnd); Message WM_EraseBkGnd;

    Protected

    Procedure CreateParams(Var Params:TCreateParams); Override;

    Procedure Paint; Override;

    Public

    Constructor Create(AOwner:TComponent); Override;

    Procedure Invalidate; Override;

    End;

    //hsr///////////////////////////////////////////

    TForm1 = class(TForm)

    ListBox1: TListBox;

    procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    procedure ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,

    Y: Integer);

    procedure ListBox1MouseUp(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    private

    { Private declarations }

    public

    { Public declarations }

    BrushStyle : TbrushStyle;

    penStyle: TPenStyle;

    penWide:Integer;

    Drawing:Boolean;

    modified:Boolean;

    Origin, Origin1,MovePt,MovePt1 : TPoint;

    LastDot:TPoint;

    CurrentFile, str:string;



    end;



    var

    Form1: TForm1;

    tpnl: TTransparentPanel; //hsr//

    implementation



    //hsr/////////////////////////////////////////////////

    {$R *.DFM}

    Constructor TTransparentPanel.Create(AOwner:TComponent);

    Begin

    Inherited Create(AOwner);

    ControlStyle:= ControlStyle - [csOpaque];

    End;



    Procedure TTransparentPanel.CreateParams(Var Params:TCreateParams);

    Begin

    Inherited CreateParams(Params);

    Params.ExStyle:= Params.ExStyle or WS_EX_TRANSPARENT;

    End;



    Procedure TTransparentPanel.Paint;

    Begin

    Canvas.Brush.Style:= bsClear;

    //Canvas.Rectangle(0, 0, Width, Height);

    //Canvas.TextOut(Width div 2, Height div 2, 'Transparent');

    Canvas.Font.Color := clGray;

    Canvas.TextOut(0, 0, Caption);

    End;



    Procedure TTransparentPanel.WMEraseBkGnd(Var Message:TWMEraseBkGnd);

    Begin

    {Do Nothing}

    Message.Result:= 1;

    End;



    Procedure TTransparentPanel.SetParent(AParent:TWinControl);

    Begin

    Inherited SetParent(AParent);

    If Parent <> Nil then

    SetWindowLong(Parent.Handle, GWL_STYLE,

    GetWindowLong(Parent.Handle, GWL_STYLE) And Not WS_ClipChildren);

    End;



    Procedure TTransparentPanel.Invalidate;

    Var

    Rect :TRect;

    Begin

    Rect:= BoundsRect;

    If (Parent <> Nil) and Parent.HandleAllocated then

    InvalidateRect(Parent.Handle, @Rect, True)

    Else

    Inherited Invalidate;

    End;



    procedure SaveWindowImageToFile(wnd: Hwnd; const AFileName: string);

    var

    ACanvas: TCanvas;

    bmp: TBitmap;

    R: TRect;

    begin

    ACanvas := TCanvas.Create;

    try

    // 캔버스에 핸들설정

    ACanvas.handle := GetDC(wnd);

    // 윈도우 영역얻기

    GetWindowRect(wnd, R);

    // 위치에 관계없이 크기값만 상관

    R := Rect(0, 0, R.Right - R.Left, R.Bottom - R.Top);

    // 비트맵 생성

    bmp := TBitmap.Create;

    try

    // 크기설정

    bmp.width := R.Right - R.Left;

    bmp.height := R.Bottom - R.Top;

    // 이미지 복사

    bmp.canvas.copyrect(R, ACanvas, R);

    bmp.SaveToFile(AFilename);

    finally

    bmp.free;

    end;

    finally

    DeleteDC(ACanvas.Handle);

    ACanvas.Free;

    end;

    end;

    //hsr///////////////////////////////////////////



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    tpnl := TTransparentPanel.Create(self);

    with tpnl do begin

    Parent := self;

    Top := 1;

    Left := 1;

    Height := 1;

    Width := 1;

    Visible := False;

    BringToFront;

    Font.Color := clGray;

    end;

    end;



    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    tpnl.Free;

    end;

    procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    begin

    Origin := Point(X,Y);

    Drawing := True;

    str := ListBox1.Items.Strings[ListBox1.ItemIndex];

    tpnl.Caption := ListBox1.Items.Strings[ListBox1.ItemIndex];

    tpnl.Width := Canvas.TextWidth(str);

    tpnl.Height := Canvas.TextHeight(str);

    end;



    procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,

    Y: Integer);

    var

    SRect, DRect: TRect;

    begin

    if Drawing then begin

    tpnl.Left := ListBox1.Left + x;

    tpnl.Top := ListBox1.Top + y;

    tpnl.Visible := True;

    end;

    end;



    procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    begin

    drawing := False;

    tpnl.Visible := False;

    end;





    end.