我正在尝试创建复合组件TTreePage(后代形式TCustomControl).它应该包含3个子组件:Treeview(TTreeview)align:= alLeft,Splitter(TSplitter)align:= alLeft和Container(TPanel)align:= alClient.
这是contstructor:
constructor TTreePage.Create(AOwner: TComponent);
begin
inherited;
FTreeview := TTreeView.Create(self);
FTreeview.SetSubComponent(True);
InsertControl(FTreeview);
FSplitter := TSplitter.Create(self);
FSplitter.SetSubComponent(True);
FSplitter.Width := 3;
FSplitter.Color := clBlack;
InsertControl(FSplitter);
FContainer:= TPanel.Create(Self);
FContainer.SetSubComponent(True);
FContainer.BevelInner := bvNone;
FContainer.BevelOuter := bvNone;
FContainer.Color := clYellow;
InsertControl(FContainer);
RefreshLayout; // this performs alignment of subcomponents
end;
Run Code Online (Sandbox Code Playgroud)
这里是创建参数程序:
procedure TTreePage.CreateParams(var Params:TCreateParams);
begin
inherited;
Params.Style := Params.Style + WS_EX_CONTROLPARENT;
ControlStyle := ControlStyle + [csAcceptsControls, csCaptureMouse, csOpaque];
end;
Run Code Online (Sandbox Code Playgroud)
整个组件表现为单个块.我无法通过鼠标选择任何子组件(TTreeview,TSplitter或TPanel).是的,我可以在Object Inspector中编辑它们的属性,但是我无法编辑例如TTreeview的宽度或拖动TSplitter.对我来说最重要的是在设计时在TTreeview中添加节点,但我不能为它唤起树节点编辑器.
我该怎么办?
感谢名单
让TTreePage组件处理CM_DESIGNHITTEST消息,该消息为单击提供鼠标坐标.如果这些坐标位于要单击的子组件上,请将消息的结果设置为1,否则设置为0(或调用inherited).返回1时,鼠标单击将传递给子组件以进行进一步处理.由于整个客户区域都包含在您要单击的子组件中,因此只需无条件地返回1,例如:
type
TTreePage = class(TCustomControl)
private
...
procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
...
end;
Run Code Online (Sandbox Code Playgroud)
procedure TTreePage.CMDesignHitTest(var Message: TCMDesignHitTest);
begin
Message.Result := 1;
end;
Run Code Online (Sandbox Code Playgroud)
这就是一些原生VCL组件,如TPageControl和TCoolBar,允许他们的子标签/按钮/等在设计时可点击.