| 
 
안녕하세요?
 여기 이곳을 조금 다듬으시면 가능하게 될것입니다.
 Source\VCL\TABS.PAS 파일입니다.
 이것을 열어서 고쳐보세요.
 그리고 씨++ 빌더에서도 컴포넌트 작업시에 당연히 파스칼코드가 컴파일이 됩니다.
 그래야 소스레벨에 있는 컴포넌트를 사용할 수 있죠.
 이것을 폼에 올려놓고 같이 디버깅을 하시면 됩니다.
 거의 API로 이루어져 있어서 씨++하시는 분들에게 별로 무리가 없을 것입니다.
 
 procedure TTabSet.Paint;
 var
   TabStart, LastTabPos: Integer;
   TabPos: TTabPos;
   Tab: Integer;
   Leading: TEdgeType;
   Trailing: TEdgeType;
   isFirst, isLast, isSelected, isPrevSelected: Boolean;
   R: TRect;
 begin
   if not HandleAllocated then Exit;
 
   { Set the size of the off-screen bitmap.  Make sure that it is tall enough to
     display the entire tab, even if the screen won't display it all.  This is
     required to avoid problems with using FloodFill. }
   MemBitmap.Width := ClientWidth;
   if ClientHeight < FTabHeight + 5 then MemBitmap.Height := FTabHeight + 5
   else MemBitmap.Height := ClientHeight;
 
   MemBitmap.Canvas.Font := Self.Canvas.Font;
 
   TabStart := StartMargin + EdgeWidth;        { where does first text appear? }
   LastTabPos := Width - EndMargin;            { tabs draw until this position }
   Scroller.Left := Width - Scroller.Width - 2;
 
   { do initial calculations for how many tabs are visible }
   FVisibleTabs := CalcTabPositions(TabStart, LastTabPos, MemBitmap.Canvas,
     FirstIndex);
 
   { enable the scroller if FAutoScroll = True and not all tabs are visible }
   if AutoScroll and (FVisibleTabs < Tabs.Count) then
   begin
     Dec(LastTabPos, Scroller.Width - 4);
     { recalc the tab positions }
     FVisibleTabs := CalcTabPositions(TabStart, LastTabPos, MemBitmap.Canvas,
       FirstIndex);
 
     { set the scroller's range }
     Scroller.Visible := True;
     ShowWindow(Scroller.Handle, SW_SHOW);
     Scroller.Min := 0;
     Scroller.Max := Tabs.Count - VisibleTabs;
     Scroller.Position := FirstIndex;
   end
   else
     if VisibleTabs >= Tabs.Count then
     begin
       Scroller.Visible := False;
       ShowWindow(Scroller.Handle, SW_HIDE);
     end;
 
   if FDoFix then
   begin
     FixTabPos;
     FVisibleTabs := CalcTabPositions(TabStart, LastTabPos, MemBitmap.Canvas,
       FirstIndex);
   end;
   FDoFix := False;
 
   { draw background of tab area }
   with MemBitmap.Canvas do
   begin
     Brush.Bitmap := BrushBitmap;
     FillRect(Rect(0, 0, MemBitmap.Width, MemBitmap.Height));
 
     Pen.Width := 1;
     Pen.Color := clBtnShadow;
     MoveTo(0, 0);
     LineTo(MemBitmap.Width + 1, 0);
 
     Pen.Color := clWindowFrame;
     MoveTo(0, 1);
     LineTo(MemBitmap.Width + 1, 1);
   end;
 
   for Tab := 0 to TabPositions.Count - 1 do
   begin
     Pointer(TabPos) := TabPositions[Tab];
 
     isFirst := Tab = 0;
     isLast := Tab = VisibleTabs - 1;
     isSelected := Tab + FirstIndex = TabIndex;
     isPrevSelected := (Tab + FirstIndex) - 1 = TabIndex;
 
     { Rule: every tab paints its leading edge, only the last tab paints a
       trailing edge }
     Trailing := etNone;
 
     if isLast then
     begin
       if isSelected then Trailing := etLastIsSel
       else Trailing := etLastNotSel;
     end;
 
     if isFirst then
     begin
       if isSelected then Leading := etFirstIsSel
       else Leading := etFirstNotSel;
     end
     else  { not first }
     begin
       if isPrevSelected then Leading := etSelToNotSel
       else
         if isSelected then Leading := etNotSelToSel
         else Leading := etNotSelToNotSel;
     end;
 
     { draw leading edge }
     if Leading <> etNone then
       PaintEdge(TabPos.StartPos - EdgeWidth, 0, FTabHeight - 1, Leading);
 
     { set up the canvas }
     R := Rect(TabPos.StartPos, 0, TabPos.StartPos + TabPos.Size, FTabHeight);
     with MemBitmap.Canvas do
     begin
       if isSelected then Brush.Color := SelectedColor
       else Brush.Color := UnselectedColor;
       ExtTextOut(Handle, TabPos.StartPos, 2, ETO_OPAQUE, @R,
         nil, 0, nil);
     end;
 
     { restore font for drawing the text }
     MemBitmap.Canvas.Font := Self.Canvas.Font;
 
     { Owner }
     if (FStyle = tsOwnerDraw) then
       DrawTab(MemBitmap.Canvas, R, Tab + FirstIndex, isSelected)
     else
     begin
       with MemBitmap.Canvas do
       begin
         Inc(R.Top, 2);
         DrawText(Handle, PChar(Tabs[Tab + FirstIndex]),
           Length(Tabs[Tab + FirstIndex]), R, DT_CENTER);
       end;
     end;
 
     { draw trailing edge  }
     if Trailing <> etNone then
       PaintEdge(TabPos.StartPos + TabPos.Size, 0, FTabHeight - 1, Trailing);
 
     { draw connecting lines above and below the text }
 
     with MemBitmap.Canvas do
     begin
       Pen.Color := clWindowFrame;
       MoveTo(TabPos.StartPos, FTabHeight - 1);
       LineTo(TabPos.StartPos + TabPos.Size, FTabHeight - 1);
 
       if isSelected then
       begin
         Pen.Color := clBtnShadow;
         MoveTo(TabPos.StartPos, FTabHeight - 2);
         LineTo(TabPos.StartPos + TabPos.Size, FTabHeight - 2);
       end
       else
       begin
         Pen.Color := clWindowFrame;
         MoveTo(TabPos.StartPos, 1);
         LineTo(TabPos.StartPos + TabPos.Size, 1);
 
         Pen.Color := clBtnShadow;
         MoveTo(TabPos.StartPos, 0);
         LineTo(TabPos.StartPos + TabPos.Size + 1, 0);
       end;
     end;
   end;
 
   { draw onto the screen }
   Canvas.Draw(0, 0, MemBitmap);
 end;
 
 위의 소스중에 그 탭을 그려주는 부분이 있습니다.
 그곳을 의 Y좌표를 꺼꾸로 만들어 버리시면 됩니다.
 
 물론 그 작업은 본인의 몫이겠죠...?
 
 참.. 그리고 서드파티의 컴포넌트를 물어보셨는데 상당히 많습니다.
 하지만 모양이 딱 탭셋하고 똑같은것은...
 오히려 Win95컴포넌트 팔레트 페이지에 있는 탭콘트롤을 사용하시는것이 
 어떤지요...
 
 저도 이것을 사용하는데요.. 물론 Win3.1용 NoteBook과 함께요.
 
 
 
    |