MarunGuy 님이 쓰신 글 :
: 윈도우즈에서 지원되는 Tree Control 자체가 원래 Checked Box 기능을 갖고 있지만
: VCL, LCL 같은 컴포넌트에서 그걸 지원하도록 만들어 있지 않을 뿐임.
:
: LONG style = ::GetWindowLong(WindowHandle, GWL_STYLE);
: ::SetWindowLong(WindowHandle, GWL_STYLE, style | TVS_CHECKBOXES );
:
: 위와 같은식으로 TreeView 콘트롤에 TVS_CHECKBOXES 스타일만 추가하면 됨.
:
: 라자루스(CodeTyphon 4.3) 에서 TShellTreeView, TTreeView 콘트롤 두개에서 테스트했는데 CheckBox 가 안 생깁니다.
: 디버거로 GetWindowLongPtrW, SetWindowLongPtrW 함수의 리턴값을 조사해봐도 정상인데 말이죠.
:
: TShellTreeView, TTreeView 콘트롤의 Class Name 이 모두 Window 로 되어있는데 정상인지 모르겠습니다.
: LCL 의 TShellTreeView, TTreeView 콘트롤이 Win32 TreeView 콘트롤을 사용하지 않고 자체적으로 구현된게 아닌가 싶습니다.
:
:
: procedure TForm1.FormCreate(Sender: TObject);
: var style: Windows.LONG_PTR;
: styleret: Windows.LONG_PTR;
: begin
: style := 0;
: styleret := 0;
: style := Windows.GetWindowLongPtrW(Self.ShellTreeView1.Handle, Windows.GWL_STYLE);
: Windows.SetLastError(Windows.ERROR_SUCCESS);
: // TVS_CHECKBOXES = 256.
: styleret := Windows.SetWindowLongPtrW(Self.ShellTreeView1.Handle, Windows.GWL_STYLE, style or 256 );
:
: style := 0;
: styleret := 0;
: style := Windows.GetWindowLongPtrW(Self.TreeView1.Handle, Windows.GWL_STYLE);
: Windows.SetLastError(Windows.ERROR_SUCCESS);
: // TVS_CHECKBOXES = 256.
: styleret := Windows.SetWindowLongPtrW(Self.TreeView1.Handle, Windows.GWL_STYLE, style or 256 );
: end;
:
다른 방법으로 node를 건드리는게 있습니다.
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
Var
Level: Integer;
begin
Level := VST.GetNodeLevel(Node);
if Level = 0 then
Node.CheckType:=ctCheckBox;
if Level = 2 then
Node.CheckType:=ctRadioButton;
if Level = 1 then
begin
Node.CheckType:=ctTriStateCheckBox;
Node.CheckState := csCheckedNormal;
end;
if Level = 3 then
Node.CheckType:=ctButton;
end;
http://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus
참고하셔요~
|