안녕하세요.
현재 TTreeview를 사용중인데...
왼쪽 마우스 버튼 클릭없이 오른쪽 마우스버튼 클릭만으로 해당 아이템에
적합한 팝업메뉴를 띄워서 추가/삭제 처리를 하려고 합니다.
TTreeview의 RightClickSelect Property를 True한 상태에서
그냥 테스트 해보았더니 최종적으로 Focus Rect가 있는 쪽으로 Select가
옮겨지더군요.
그래서, MouseButtonUp Event시점에 현재 선택되어 있는것을
Treeview.Select함수를 써서 강제로 Select하게 했더니
MouseButtonUp Event 시점에는 제가 Select한것이 Selected에 들어와 있는데, 다른 Event에서 Treeview.Selected를 보면 Focus Rect가 있는 아이템이
들어오게 됩니다.
오른쪽 마우스 클릭만으로 Focus Rect와 Select Rect를 동시에 옮길 수 있는 방법이 있을까요?
테스트 소스를 올립니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
procedure TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
begin
TreeView1.Select(TreeView1.Selected, [ssLeft]);
TreeView1.Update;
OutPutDebugString(PChar(TreeView1.Selected.Text));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OutPutDebugString(PChar(TreeView1.Selected.Text));
end;
end.
맞습니다, 이상하게 마우스 왼쪽을 누른후 가져온 좌표는
폼도아닌 모니터 스크린 좌표값이 나라옵니다.
따라서 그것을 트리뷰의 좌표로 바꿔야합니다.
procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
SNode: TTreeNode;
CursorPos: TPoint;
begin
//오른쪽 버튼 누를때 포커스와 선택 모두 옮기기
if Button = mbRight then begin
CursorPos := TreeView1.ScreenToClient(Point(X,Y));
SNode := TreeView1.GetNodeAt(CursorPos.X, CursorPos.Y);
if SNode <> nil then
SNode.Selected := True;
end;
end;