有没有源代码,我自己画了画,发现功力不够啊,想学习一下。效果就像是多标签页浏览器的一样,最右边的标签页右边有个按钮。

解决方案 »

  1.   

    这个不如自己写个组合控件
    在Pagecontrol上改, 也可以改出来,但是比较麻烦
    简单点, 自己用个工具条, 下边用个pagecontrol组合就行了
      

  2.   

    用TabControl+Panel就可以实现,TabControl的最后一个选项页的Caption设置为“+”,在TabControl的OnChange事件中判断,是否增加一个Tab,如果增加,同时增加一个Panel。至于Panel里放什么东西,那就是你设计的了。
      

  3.   

    tabcontrol的标签页的大小不能随便设置,这样的话就会造成很长的标签页里只有一个加号啊
      

  4.   

    右边是 tab页(内部)的左上方 还是 tab页外部的右边 ?
    前者有个换肤控件支持
    后者干脆多使用一个 tab ,它没有真正的内容(tabsheet),只是供人点击它的tab,程序在进入事件里执行新建页之类的工作
      

  5.   

    把OwnerDraw设成True,然后在OnDrawTab中画,再在OnMouseDown,OnMouseUp,OnMouseMove中来处理鼠标点击事件。
      

  6.   

    下面的代码供你参考,我是弄了一个按钮图片,你也可以直接用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;