想再PageControl上边的标签页右边加一个按钮,不知道怎么实现 有没有源代码,我自己画了画,发现功力不够啊,想学习一下。效果就像是多标签页浏览器的一样,最右边的标签页右边有个按钮。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个不如自己写个组合控件在Pagecontrol上改, 也可以改出来,但是比较麻烦简单点, 自己用个工具条, 下边用个pagecontrol组合就行了 用TabControl+Panel就可以实现,TabControl的最后一个选项页的Caption设置为“+”,在TabControl的OnChange事件中判断,是否增加一个Tab,如果增加,同时增加一个Panel。至于Panel里放什么东西,那就是你设计的了。 tabcontrol的标签页的大小不能随便设置,这样的话就会造成很长的标签页里只有一个加号啊 右边是 tab页(内部)的左上方 还是 tab页外部的右边 ?前者有个换肤控件支持后者干脆多使用一个 tab ,它没有真正的内容(tabsheet),只是供人点击它的tab,程序在进入事件里执行新建页之类的工作 把OwnerDraw设成True,然后在OnDrawTab中画,再在OnMouseDown,OnMouseUp,OnMouseMove中来处理鼠标点击事件。 下面的代码供你参考,我是弄了一个按钮图片,你也可以直接用API DrawFrameControl来做,不必用图片。procedure TfrmMain.pcMainDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);begin pcMain.Canvas.FillRect(Rect); imgMain.Draw(pcMain.Canvas, Rect.Left + 2, Rect.Top + 4, pcMain.Pages[TabIndex].ImageIndex); pcMain.Canvas.TextOut(Rect.Left + 20, Rect.Top + 4, Copy(pcMain.Pages[TabIndex].Caption, 1, Length(pcMain.Pages[TabIndex].Caption) - 2)); if Active then imgMain.Draw(pcMain.Canvas, Rect.Right - 20, Rect.Top + 4, CN_IMG_CLOSETAB) else imgMain.Draw(pcMain.Canvas, Rect.Right - 18, Rect.Top + 4, CN_IMG_CLOSETAB);end;procedure TfrmMain.pcMainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var ht: TC_HITTESTINFO; I: Integer; r: TRect;begin if Button = mbLeft then begin ht.pt := POINT(X, Y); I := SendMessage(pcMain.Handle, TCM_HITTEST, 0, LPARAM(@ht)); if (I >= 0) and (pcMain.Pages[I].Tag > 0) and Boolean(SendMessage(pcMain.Handle, TCM_GETITEMRECT, I, LPARAM(@r))) then begin r.Left := r.Right - 18; if PtInRect(r, ht.pt) then begin FPreTabIndex := I; FPrePoint := ht.pt; Exit; end; end; end; FPreTabIndex := -1; FPrePoint := Point(-1, -1);end;procedure TfrmMain.pcMainMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var ht: TC_HITTESTINFO; I: Integer; r: TRect;begin if Button = mbLeft then begin ht.pt := POINT(X, Y); I := SendMessage(pcMain.Handle, TCM_HITTEST, 0, LPARAM(@ht)); if (I >= 0) and (pcMain.Pages[I].Tag > 0) and Boolean(SendMessage(pcMain.Handle, TCM_GETITEMRECT, I, LPARAM(@r))) then begin r.Left := r.Right - 18; if PtInRect(r, ht.pt) and (FPreTabIndex = I) and (FPrePoint.X <> -1) and (FPrePoint.Y <> -1) then TfrmEditor(pcMain.Pages[I].Tag).Close; end; end; FPreTabIndex := -1; FPrePoint := Point(-1, -1);end; Delphi7 TCP通信例子Net chat ,修改一下就出错,不知为何? 在Access中 提示 记录过大? 请问一下,已知3个点的坐标,想把这三个点用圆滑一点的曲线连接起来delphi要怎么做? 这个程序怎么实现? 关于代码中墨绿色注释的意义 加急!! 高分求pb7.0运行库!!!!!!!!!!!!! 应用程序服务器已运行,当连接时为何会再产生一个应用程序服务器的运行 如何生成字体有边框的效果? 请帮新手。。。。 怎么判断某个文件是否存在?比如d:\a.txt(我会加分的) 又是一年过去了,有多少人想换换工作? Rad2007如何把组件面板放在IDE的ToolBar上?
在Pagecontrol上改, 也可以改出来,但是比较麻烦
简单点, 自己用个工具条, 下边用个pagecontrol组合就行了
前者有个换肤控件支持
后者干脆多使用一个 tab ,它没有真正的内容(tabsheet),只是供人点击它的tab,程序在进入事件里执行新建页之类的工作
procedure TfrmMain.pcMainDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
begin
pcMain.Canvas.FillRect(Rect);
imgMain.Draw(pcMain.Canvas, Rect.Left + 2, Rect.Top + 4, pcMain.Pages[TabIndex].ImageIndex);
pcMain.Canvas.TextOut(Rect.Left + 20, Rect.Top + 4, Copy(pcMain.Pages[TabIndex].Caption, 1, Length(pcMain.Pages[TabIndex].Caption) - 2));
if Active then
imgMain.Draw(pcMain.Canvas, Rect.Right - 20, Rect.Top + 4, CN_IMG_CLOSETAB)
else
imgMain.Draw(pcMain.Canvas, Rect.Right - 18, Rect.Top + 4, CN_IMG_CLOSETAB);
end;procedure TfrmMain.pcMainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
ht: TC_HITTESTINFO;
I: Integer;
r: TRect;
begin
if Button = mbLeft then
begin
ht.pt := POINT(X, Y);
I := SendMessage(pcMain.Handle, TCM_HITTEST, 0, LPARAM(@ht));
if (I >= 0) and (pcMain.Pages[I].Tag > 0) and Boolean(SendMessage(pcMain.Handle, TCM_GETITEMRECT, I, LPARAM(@r))) then
begin
r.Left := r.Right - 18;
if PtInRect(r, ht.pt) then
begin
FPreTabIndex := I;
FPrePoint := ht.pt;
Exit;
end;
end;
end;
FPreTabIndex := -1;
FPrePoint := Point(-1, -1);
end;procedure TfrmMain.pcMainMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
ht: TC_HITTESTINFO;
I: Integer;
r: TRect;
begin
if Button = mbLeft then
begin
ht.pt := POINT(X, Y);
I := SendMessage(pcMain.Handle, TCM_HITTEST, 0, LPARAM(@ht));
if (I >= 0) and (pcMain.Pages[I].Tag > 0) and Boolean(SendMessage(pcMain.Handle, TCM_GETITEMRECT, I, LPARAM(@r))) then
begin
r.Left := r.Right - 18;
if PtInRect(r, ht.pt) and (FPreTabIndex = I) and (FPrePoint.X <> -1) and (FPrePoint.Y <> -1) then
TfrmEditor(pcMain.Pages[I].Tag).Close;
end;
end;
FPreTabIndex := -1;
FPrePoint := Point(-1, -1);
end;