Programming/Delphi

[다이나믹스킨] 자식폼을 최소화할 때 태스크바로 내리기

통통만두 2011. 7. 6. 09:40
반응형

Version 11.60

자식폼을 최소화 했을 경우에 태스크바로 내려가지 않고 좌측 하단으로 내려간다 -_-;

외국에서는 저렇게 사용하는지, 아니면 MDI 환경을 고려한 것인지는 몰라도..

나는 여간 신경쓰이고 못마땅하다 ㅋㅋㅋㅋㅋ


소스 붙잡고 엎어치기 몇 번 한 결과..

TspDynamicSkinForm 컴포넌트의 MinimizeDefault 를 True로 바꿔주면 된다.

기본적으로 컴포넌트가 생성이 될 때 False 로 셋팅을 하기 때문에 좌측 하단으로 내려가게 된다.

자.. 이제 Form의 Create의 부분에서 TspDynamicSkinForm 컴포넌트의 MinimizeDefault 속성을 True로 바꿔보자.

아차! TspDynamicSkinForm 컴포넌트를 사용해서 창을 띄웠을 경우 자식폼은 태스크바에 표시가 아니된다.

우선 태스크바에 표시를 하고나서 해야 한다. 안그러면 기존처럼 좌측 하단으로 내려가는데 모습이 영~~ 시원찮다.

그럼 자식폼의 Create 이벤트에서 아래와 같은 코드를 추가하자.
  SetWindowLong(Handle, GWL_EXSTYLE,
  GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);


이제 다시 자식폼을 최소화 시켜보자. 슈슉~


짜잔~~ 잘 내려갔다. 그.. 그런데 -_-;

또 저기 남는 알맹이 빠져나간 허물마냥.. 또 잔상(?)이 남네... 아오 빡침 ㅋㅋㅋㅋ

다시 소스 까데기 시작!

procedure TspDynamicSkinForm.DoMinimize;
var
  P: TPoint;
begin
  if (Application.MainForm = FForm) or not FSupportNCArea
  then
    begin
      if FSupportNCArea
      then
        begin
          {$IFDEF VER200}
          if Application.MainFormOnTaskBar
          then
            if FBorderLayer.FVisible then FBorderLayer.Hide;
          {$ENDIF}
          {$IFDEF VER185}
          if Application.MainFormOnTaskBar
          then
            if FBorderLayer.FVisible then FBorderLayer.Hide;
          {$ENDIF}
        end;
      Application.Minimize;
    end
  else
  if FMinimizeDefault
  then
    begin
      // (2011-07-06) START
      //FBorderLayer.Hide;
      // (2011-07-06) END
      FForm.WindowState := wsMinimized;
    end
  else
    begin
      if IsNullRect(OldBoundsRect)
      then OldBoundsRect := FForm.BoundsRect;
      P := GetMinimizeCoord;
      if FBorderLayer.FVisible and (FBorderLayer.FData <> nil) and FBorderLayer.FData.FullBorder
      then
        FForm.SetBounds(P.X + FBorderLayer.LeftSize,
          P.Y - FBorderLayer.BottomSize + 10 - FBorderLayer.FData.RollUpFormHeight,
          GetMinWidth, GetMinHeight)
      else
        FForm.SetBounds(P.X, P.Y, GetMinWidth, GetMinHeight);
      if (FForm.FormStyle = fsMDIChild) and (FWindowState <> wsMaximized)
      then
        begin
          SendMessage(Application.MainForm.Handle, WM_MDICHILDRESTORE, 0, 0);
        end;
    end;
  if Assigned(FOnMinimize) then FOnMinimize(Self);
end;

휴.. 찾긴 찾았으나.. 최선입니까? ㅋㅋㅋㅋ

위의 소스에서 날짜로 주석처리된 부분을 추가해주면 된다. 이 스킨컴포넌트는 기본적으로 껍데기를 다시 그린(?)다.

즉, 테두리 따로 몸통 따로 논다는 얘기.

이로써 자식폼 최소화할 때 태스크바로 내리기 설명을 끝내겠쉼다.

p.s 이제 메인창을 내리면 모든 창이 최소화 되는 현상을 해결해보기위해 삽질해보겠습니다. ㅎㅎ

반응형