음....
그것은?
MouseUp이벤는 MouseDown이 된 컨트롤(Window)에서 항상 발생합니다.
(예외도 있음)
이경우 MouseDown에서 Mouse좌표와 Up에서 좌표를
ScrollBox기준으로 변환을 해서 처리하시면 될듯합니다.
pt:=GetCursorPos;
pt:=ScrollBox.ScreenToClient(pt);
그럼..
하두고 님이 쓰신 글 :
: civilian님 여러사람들에게 항상 많은 도움을 주셔서 감사드립니다.
: 올려주신 소스대로 해보니 아주 잘 됩니다.
:
: 그런데 제가 만든 리스트박스안의 체크박스들은 여백이 거의 없어서
: 체크박스들 사이의 공간에서 마우스를 누르고
: 마우스를 놓을때도 체크박스들 사이에서 해야 합니다.
:
: 그래서 제가 MouseDown이벤트와 MouseUp이벤트를 체크박스이벤트로 옮겼는데요.
: 그렇게 하니 MouseDown이벤트는 정상적으로 들어옵니다.
: 그런데 MouseUp이벤트의 Sender가 마우스를 놓을때 위치에 있는 체크박스가 아닌
: 마우스를 누를때 위치에 있던 체크박스가 들어옵니다.
:
: 그러다 보니 마우스를 누를때 위치에 있는 체크박스 하나만 선택이 되버립니다.
:
: 마우스를 누를때와 놓을때 콘트롤이 다른 경우에는 어떻게 처리해야 할지 모르겠습니다.
:
: 나름대로 방법을 찾아보고 싶었지만 아는게 없다보니 재질문 올리게 되네요.
: 다시 한 번 도움 부탁드리겠습니다.
:
:
: civilian 님이 쓰신 글 :
: :
: : unit Unit1;
: :
: : interface
: :
: : uses
: : Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
: : Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
: :
: : type
: : TForm1 = class(TForm)
: : ScrollBox1: TScrollBox;
: : CheckBox1: TCheckBox;
: : CheckBox2: TCheckBox;
: : CheckBox3: TCheckBox;
: : procedure ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton;
: : Shift: TShiftState; X, Y: Integer);
: : procedure ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton;
: : Shift: TShiftState; X, Y: Integer);
: : private
: : { Private declarations }
: : FDown: Boolean;
: : FStartPos: TPoint;
: : public
: : { Public declarations }
: : end;
: :
: : var
: : Form1: TForm1;
: :
: : implementation
: :
: : {$R *.dfm}
: :
: : procedure TForm1.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton;
: : Shift: TShiftState; X, Y: Integer);
: : begin
: : if (Button = mbLeft) and (Shift = [ssLeft]) then
: : begin
: : FDown := True;
: : FStartPos := Point(X, Y);
: : end;
: : end;
: :
: : procedure TForm1.ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton;
: : Shift: TShiftState; X, Y: Integer);
: : var
: : ControlPos: TPoint;
: : SelectRect: TRect;
: : i: Integer;
: : CheckBox: TCheckBox;
: : begin
: : if FDown then
: : begin
: : FDown := False;
: :
: : SelectRect := Rect(FStartPos.X, FStartPos.Y, X, Y);
: :
: : for i := 0 to ScrollBox1.ControlCount-1 do
: : begin
: : if ScrollBox1.Controls[i] is TCheckBox then
: : begin
: : CheckBox := ScrollBox1.Controls[i] as TCheckBox;
: : ControlPos := Point(CheckBox.Left, CheckBox.Top);
: :
: : if PtInRect(SelectRect, ControlPos) then
: : CheckBox.Checked := not CheckBox.Checked;
: : end;
: : end;
: : end;
: : end;
: :
: : end.
: :
: :
: :
: : 하두고 님이 쓰신 글 :
: : : 폼위에 스코롤박스가 있고
: : : 스코롤박스 안에 여러개의 체크박스가 있습니다.
: : :
: : : 체크박스를 하나씩 클릭해서 선택하려니 사용자가 귀찮을 것 같습니다.
: : : 그렇다고 리스트박스로 구현하기는 좀 곤란한 문제가 있구요.
: : :
: : : 스코롤박스안에 있는 여러개의 체크박스를 마우스로 드레그하여 한 번에 선택하게 하고 싶은데
: : : 어떻게 해야 할지 모르겠습니다.
: : :
: : : 도움 부탁드립니다.