Q&A

  • 리스트박스에서 마우스가 위에 잇을
질문입니다.

리스트박스에서 마우스가 위에 있을
1  COMMENTS
  • Profile
    전철호 1999.08.25 01:57
    다음 콤포넌트 소스를 참조하시면 위의 문제를 해결할 수 있습니다.

    // 만든이 : 전철호

    //이 콤포넌트를 사용시 주의 사항은 다음과 같습니다.

    //수정시에는 항상 버전업한 내용을 저에게 메일로 통지해주시기

    //바랍니다.

    //그리고 프로그램 작성시 꼭 제 이름을 명시하기 바라고

    //상업용으로 사용하시고자 하실때는 저에게 메일이나

    //전화를 주셔서 꼭 사용허가를 받으시기 바랍니다.



    // 저작권은 오성과 한음 개발에 있습니다.



    unit HintListBox;



    interface



    uses

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

    StdCtrls,extctrls;



    type

    TJeonHintListBox = class(TListBox)

    private

    FHintWindow : THintWindow;

    procedure MouseMove(Shift : TShiftState; X, Y : Integer); override;

    procedure Timerproc(Sender : TObject);

    protected

    FTimer : TTimer;

    public

    constructor Create(AOwner: TComponent); override;

    destructor Destroy; override;

    published

    property OnMouseMove;

    end;



    procedure Register;



    implementation



    procedure Register;

    begin

    RegisterComponents('전철호', [TJeonHintListBox]);

    end;



    constructor TJeonHintListBox.Create(AOwner: TComponent);

    begin

    inherited Create(AOwner);

    // 힌트 윈도우 생성

    FHintWindow := THintWindow.Create(self);

    // 타이머 생성

    FTimer := TTimer.Create(self);

    FTimer.interval := 1000;

    FTimer.enabled := False;

    FTimer.OnTimer := TimerProc;

    end;



    destructor TJeonHintListBox.Destroy;

    begin

    FTimer.Free;

    inherited Destroy;

    end;



    procedure TJeonHintListBox.MouseMove(Shift : TShiftState; X, Y : Integer);

    var

    apoint,p : TPoint;

    R : TRect;

    the_length : integer;

    begin

    inherited MouseMove(Shift,X,Y);

    apoint.x := x;

    apoint.y := y;

    p := ClientToScreen(apoint);



    FHintWindow.Canvas.Font.Size := 9;

    FHintWindow.Canvas.Font.Name := '굴림체';

    // 마우스 위치에 있는 ListBox Item위치를 가져온다.

    if ItemAtPos(APoint, True) < 0 then

    System.Exit;



    the_length := FHintWindow.Canvas.Font.Size * Length(Items[ItemAtPos(APoint, True)]);

    if the_length < 80 then

    the_length := 80;



    R := Rect(p.x+12,p.y-itemheight-2,p.x+the_length+2,p.y);

    // 힌트 윈도우를 보여준다.

    FHintWindow.ActivateHint(R,items[ItemAtPos(APoint, True)]);

    // 타이머를 작동시킨다.

    FTimer.Enabled := True;

    end;



    procedure TJeonHintListBox.Timerproc(Sender : TObject);

    begin

    FTimer.Enabled := False;

    // 보여진 힌트윈도우를 제거한다.

    FHintWindow.ReleaseHandle;

    end;



    end.