C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[70615] Re:[질문] MDI 화면에서 Client 영역을 Left/Right 영역으로 나누어서 왼쪽은 붙박이로 쓰고 싶어요..
둘리.CSIEDA [dooly386] 6206 읽음    2014-01-04 08:24
그림을 보니 docking 을 사용하여 특정 폼을 docking 한 형태군요.

그리고 원하시는 부분이 drag bar를 제거하고 싶으신거군요.

docking할 경우 drag bar가 자동적으로 만들어져서 그렇습니다.

오래전에 저도 이문제를 해결하기 위하여 한참 찾아보았으나 제가 내린 결론은

docking 되는 것이 내부적으로 drag bar를 만들고 그 drag bar height가 절대로 VCL에 의존해서는 0 이 될수 없음을 알게 되었습니다.

그래서 저는 panel을 상속받아 drag bar height을 0을 허락 하도록 만들어 사용한 적이 있습니다.

아래 부분은 제가 만든 코드 같은데요.. 오래되서 쩝...

C/C++ 프로그래머이지, Delphi 코더가 아니고 , 요즘은 사용하지 않고 있는것이라 코드가 영 그렀습니다만,,,, 혹시나 해서 올립니다.

unit cDockPanelUnit;


interface

uses
  Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics;
type
  TXPDockTree = class(TDockTree)
  protected
    property DockSite;
  public
    GrabberSize: Integer;
    procedure AdjustDockRect(Control: TControl; var ARect: TRect); override;
    procedure PaintDockFrame(Canvas: TCanvas; Control: TControl; const ARect: TRect); override;
    procedure PaintSite(DC: HDC); override;
    constructor Create(DockSite: TWinControl);
  end;
type
  TC6DockPanel = class(TPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    DockingManager: TXPDockTree;
    constructor Create(Owner: TWinControl);
    procedure SetGrabberSize(size: Integer);
  published
    { Published declarations }
  end;


procedure Register;

implementation

constructor TC6DockPanel.Create(Owner: TWinControl);
begin
  inherited Create(Owner);
  DockingManager := nil;
end;

procedure TC6DockPanel.SetGrabberSize(size: Integer);
begin
  self.UseDockManager:=false;
  if(DockingManager<>nil) then
  begin
    DockingManager.Free;
  end;

  DockingManager := TxpDockTree.Create(self);
  DockingManager.GrabberSize := size;
  self.DockManager := DockingManager;
  //TXPDockTree.Create(self);
  self.UseDockManager:= true;

end;

constructor TXPDockTree.Create(DockSite: TWinControl);
begin
  inherited Create(DockSite);
  GrabberSize := 10;
end;

procedure TXPDockTree.AdjustDockRect(Control: TControl; var ARect: TRect);
begin
  if DockSite.Align in [alTop, alBottom] then
    Inc(ARect.Left, GrabberSize)
  else
    Inc(ARect.Top, GrabberSize);
end;

procedure TXPDockTree.PaintDockFrame(Canvas: TCanvas; Control: TControl; const ARect: TRect);

  procedure DrawCloseButton(Left, Top: Integer);
  var
    R: TRect;
  begin
    {
    R := Rect(Left + 1, Top + 1, Left + GrabberSize - 3, Top + GrabberSize - 3);
    with Canvas do begin
      Rectangle(R);
      MoveTo(Left + 4, Top + 4);
      LineTo(Left + GrabberSize - 6, Top + GrabberSize - 6);
      MoveTo(Left + GrabberSize - 7, Top + 4);
      LineTo(Left + 3, Top + GrabberSize - 6);
    end;
    }
  end;

var
  R: TRect;
  Title: String;
begin
  R := ARect;
  R.Bottom := R.Top + GrabberSize;
  with Canvas do begin
    if (Control.Tag = 0) then begin
      Brush.Color := clBtnFace;
      Pen.Color := clBtnShadow;
      Font.Color := clBtnText;
    end else begin
      Brush.Color := clActiveCaption;
      Pen.Color := clActiveCaption;
      Font.Color := clCaptionText;
    end;
    FillRect(R);
    Rectangle(R.Left, R.Top, R.Right, R.Bottom);
    {
    if (Control is TPanel) then begin
      Font.Name := (Control as TPanel).Font.Name;
      Title := (Control as TPanel).Caption;
    end else begin
      Title := Control.ClassName;
    end;
    }
  end;
  {
  with ARect do begin
    Canvas.TextOut(Left + 3, Top + 1, Title);
    if Control.Tag <> 0 then Canvas.Pen.Color := clCaptionText;
    if DockSite.Align in [alTop, alBottom] then
      DrawCloseButton(Left + 1, Top + 1)
    else
      DrawCloseButton(Right - GrabberSize + 1, Top + 1);
  end;
  }
end;

{ Borland Code BEGIN }
procedure TXPDockTree.PaintSite(DC: HDC);
var
  Canvas: TControlCanvas;
  Control: TControl;
  I: Integer;
  R: TRect;
begin
  Canvas := TControlCanvas.Create;
  try
    Canvas.Control := DockSite;
    Canvas.Lock;
    try
      Canvas.Handle := DC;
      try
        for I := 0 to DockSite.ControlCount - 1 do
        begin
          Control := DockSite.Controls[I];
          if Control.Visible and (Control.HostDockSite = DockSite) then begin
            R := Control.BoundsRect;
            AdjustDockRect(Control, R);
            Dec(R.Left, 2 * (R.Left - Control.Left));
            Dec(R.Top, 2 * (R.Top - Control.Top));
            Dec(R.Right, 2 * (Control.Width - (R.Right - R.Left)));
            Dec(R.Bottom, 2 * (Control.Height - (R.Bottom - R.Top)));
            PaintDockFrame(Canvas, Control, R);
          end;
        end;
      finally
        Canvas.Handle := 0;
      end;
    finally
      Canvas.Unlock;
    end;
  finally
    Canvas.Free;
  end;
end;
{ Borland Code END }

procedure Register;
begin
  RegisterComponents('EDAFramework6', [TC6DockPanel]);
end;

end.





땅주인 님이 쓰신 글 :
: 환경: C++ Builder XE5 ( RAD Studio XE5)
:
: [BCB] 메인창이 뜰때 폼을 Docking상태로 뜨게 할 수 있을가요?
: http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_faq&no=46
:
: 를 응용해서 첨부하는 그림처럼 left Window/Right Window로 나누었습니다.
: 그런데, Left Windows는 붙박이로 쓰고 좌우 넓이만 조절하고 싶고, Left Windows의 위쪽 헤더에  해당하는
: 부분을 모두 삭제하고 싶습니다.(판넬에 윈도우가 들어가 있는 상황)
:
: 그냥 MDIChidl영역의 왼쪽 윈도우와 오른쪽 윈도우로 갈라서,
: 왼쪽 윈도우에 해당 윈도우 화면을 그대로 붙이는 방법이 있나요? (굳이 판넬을 써서 붙여야 하는 것이 좀 그래서.. )
:
: 모양도 이쁘지 않고요..
:
: 고수님들의 조언을 부탁드립니다.
:
: 감사합니다
:

+ -

관련 글 리스트
70582 [질문] MDI 화면에서 Client 영역을 Left/Right 영역으로 나누어서 왼쪽은 붙박이로 쓰고 싶어요.. 땅주인 6782 2013/12/27
70627     Re:[질문] MDI 화면에서 Client 영역을 Left/Right 영역으로 나누어서 왼쪽은 붙박이로 쓰고 싶어요.. kylix 2722 2014/01/06
70629         Re:Re:[질문] MDI 화면에서 Client 영역을 Left/Right 영역으로 나누어서 왼쪽은 붙박이로 쓰고 싶어요.. 땅주인 3064 2014/01/06
70615     Re:[질문] MDI 화면에서 Client 영역을 Left/Right 영역으로 나누어서 왼쪽은 붙박이로 쓰고 싶어요.. 둘리.CSIEDA 6206 2014/01/04
70618         감사합니다. 냉무.. 땅주인 3213 2014/01/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.