我已经使用了这个例子How to implement a close button for a TTabsheet of a TPageControl中提供的代码来绘制一个关闭按钮到一个页面控件的每个选项卡,我已经在代码中用样式服务替换了ThemeServices,当应用样式时,关闭按钮不会显示,也不会做出任何React。有人能给我指出一条解决这个问题的不同道路吗?谢谢!这是OnDrawTab事件的代码:
procedure TFormMain.PageControlCloseButtonDrawTab(Control: TCustomTabControl;
TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
CloseBtnSize: Integer;
PageControl: TPageControl;
TabCaption: TPoint;
CloseBtnRect: TRect;
CloseBtnDrawState: Cardinal;
CloseBtnDrawDetails: TThemedElementDetails;
begin
PageControl := Control as TPageControl;
if InRange(TabIndex, 0, Length(FCloseButtonsRect) - 1) then
begin
CloseBtnSize := 14;
TabCaption.Y := Rect.Top + 3;
if Active then
begin
CloseBtnRect.Top := Rect.Top + 4;
CloseBtnRect.Right := Rect.Right - 5;
TabCaption.X := Rect.Left + 6;
end
else
begin
CloseBtnRect.Top := Rect.Top + 3;
CloseBtnRect.Right := Rect.Right - 5;
TabCaption.X := Rect.Left + 3;
end;
CloseBtnRect.Bottom := CloseBtnRect.Top + CloseBtnSize;
CloseBtnRect.Left := CloseBtnRect.Right - CloseBtnSize;
FCloseButtonsRect[TabIndex] := CloseBtnRect;
PageControl.Canvas.FillRect(Rect);
PageControl.Canvas.TextOut(TabCaption.X, TabCaption.Y, PageControl.Pages[TabIndex].Caption);
if not UseThemes then
begin
if (FCloseButtonMouseDownIndex = TabIndex) and FCloseButtonShowPushed then
CloseBtnDrawState := DFCS_CAPTIONCLOSE + DFCS_PUSHED
else
CloseBtnDrawState := DFCS_CAPTIONCLOSE;
Winapi.Windows.DrawFrameControl(PageControl.Canvas.Handle,
FCloseButtonsRect[TabIndex], DFC_CAPTION, CloseBtnDrawState);
end
else
begin
Dec(FCloseButtonsRect[TabIndex].Left);
if (FCloseButtonMouseDownIndex = TabIndex) and FCloseButtonShowPushed then
CloseBtnDrawDetails := StyleServices.GetElementDetails(twCloseButtonPushed)
else
CloseBtnDrawDetails := StyleServices.GetElementDetails(twCloseButtonNormal);
StyleServices.DrawElement(PageControl.Canvas.Handle, CloseBtnDrawDetails,
FCloseButtonsRect[TabIndex]);
end;
end;
end;
2条答案
按热度按时间mpgws1up1#
如果你正在使用vcl样式,你必须写一个vcl样式钩子来在选项卡控件中绘制一个关闭按钮,看看Vcl.Styles.ColorTabs单元(在这些文章Creating colorful tabsheets with the VCL Styles,Added border to TTabColorControlStyleHook中介绍),了解你需要写一个这样的样式钩子。除了在选项卡中绘制按钮的代码之外,您还必须处理WM_MOUSEMOVE和WM_LBUTTONUP消息(在样式钩子中)以更改按钮的状态(正常,热)并检测关闭按钮中的单击。
如果你在实现样式钩子时遇到问题,让我知道在这里发布完整的解决方案。
更新
我只是写了这个简单的样式钩子来为选项卡中的关闭按钮添加支持。
以这种方式注册
这是一个演示
cygmwpex2#
我一直在做这个例子,我让它在 Delphi XE6的Metro UI上工作。
为了获得Tab名称和按钮之间的正确距离,我的解决方法是修改这一行
并在PageController属性上设置更大的TabWith。
此外,提醒“注册”行,在单元结束前继续上课。