TRibbon 컨트롤과 MDI의 문제

델파이, C++빌더의 2010 버전부터 리본 컨트롤이 추가되었습니다. 다른 개발툴들에서는 리본 UI를 구성하기 위해 복잡한 단계를 거쳐야 하는 경우가 많은데, 이제 델파이와 C++빌더에서는 마우스 클릭 몇번만으로 리본 UI를 손쉽게 구성할 수 있게 되었습니다.

그런데 이 리본 지원에 한가지 문제가 있는데요. 바로 MDI 폼에 TRibbon 컨트롤을 사용했을 경우, MDI 차일드 창이 최대화되었을 때 MDI 시스템 버튼들이 제대로 나타나지 않고 엉뚱한 위치에 엉뚱한 모양으로 나타난다는 것입니다. 아래 그림과 같이 말이죠.

MDI 차일드 창을 최대화 하기 전

MDI 차일드 창을 최대화 하기 전

MDI 차일드 창을 최대화한 상태

MDI 차일드 창을 최대화한 상태

(버전에 따라 MDI 시스템 버튼들이 전혀 나타나지 않는 경우도 있습니다)

두번째 화면의 좌측 상단에 너무나 단순한 모양의 시스템 버튼들이 나타난 것이 보이시나요. 위치와 모양도 잘못되어 있지만, 그나마도 왼쪽 부분이 일부 잘려서 보입니다. 이건 아무래도 너무 너무 어색하죠.

이 현상은 델파이 2009, 2010, XE 등 TRibbon 컨트롤을 지원하는 모든 버전에서 나타나는 문제입니다. 버그 레포트는 오래 전에 올라가 잇는 상태인데 엠바카데로에서 몇년째 잡지 못하고 있는 문제죠.

열심히 뒤져본 결과… 러시아의 Georgi Panayotov라는 개발자가 TRibbon 자체의 소스를 수정해서 이 문제를 해결한 바 있습니다. 그 소스는 아래 위치에서 다운로드할 수 있구요.

http://www.ada-soft.bg/downloads/ribbon.patch

하지만 이 소스를 가지고 기존의 TRibbon의 VCL 소스를 직접 수정해서 사용하려면 배보다 배꼽이 더 클뿐만 아니라 향후 계속 발목을 잡게 될 여지가 있겠죠. 그래서 좀더 간편한 방법을 만들어봤습니다.

ImpRibbon.pas

위의 ImpRibbon.pas 파일은 Panayotov씨의 소스를 기반으로, TRibbon 클래스를 상속하는 새로운 클래스를 만드는 방식으로 기존 VCL 소스를 수정하지 않고 uses 만으로 리본을 패치해서 쓸 수 있도록 만든 유닛입니다.

이 패치를 적용하는 방법은 아주 간단한데, 기존에 리본 컨트롤을 이용해서 작업된 폼의 소스에 다음과 같이 내용을 추가하면 됩니다.

1. interface 섹션의 uses 절에 ImpRibbon을 추가합니다.

2. Ribbon을 사용한 폼 클래스의 선언 이전에 아래와 같이 추가합니다.
TRibbon = class(TImpRibbon);

즉, 아래와 같은 식이 됩니다.

interface

uses
Windows, Messages, Variants, Classes, ImgList, Ribbon, ImpRibbon;

type
  TRibbon = class(TImpRibbon);

  TfrmMain = class(TForm)
ActionManager1: TActionManager;
Ribbon1: TRibbon;

이렇게 하면, 폼에 사용된 TRibbon이 VCL의 기본 리본 컨트롤이 아닌, 그로부터 상속받아 제가 새로 만든 TImpRibbon 클래스로부터 다시 상속받은 것으로 인식됩니다. 따라서 TImpRibbon에서 동작을 수정한 내용이 적용됩니다.

리본 패치된 후의 MDI 시스템 버튼들

리본 패치된 후의 MDI 시스템 버튼들

이 패치를 적용하면 위와 같이 기존의 헬프 버튼 옆에 정상적으로 MDI 시스템 메뉴가 나타납니다. 물론 클릭했을 때 정상적으로 동작도 합니다.

이와 같이 델파이에서는 패치를 적용할 수 있는데, C++빌더에서는 좀 애매하네요. 델파이와 C++이 비슷한 면이 많기는 해도 아무래도 다른 언어니까요. 연구해보고 방법을 알아내게 되면 알려드리도록 하겠습니다.

3 comments for “TRibbon 컨트롤과 MDI의 문제

  1. 안녕하세요 혹시 방법을 아셨나요?
    C++빌더에서 Ribbon Control로 위의 화면처럼 구성하고 싶은데 안된네요..ㅠ.ㅠ
    도움 부탁드립니다.

  2. 데브기어에서 나온 책을 보면서 Ribbon메뉴를 규현하다. 강좌에서 올린 내용의 MDI를 처리하려고 하는데

    문제네요.   링크된 경로가 바뀌어 소스를 다운받을 수 없어 도움을 청합니다.  소스를 받을 수 있는 경로를 알고 싶습니다.

  3. 감사합니다.

    xe4 에서 해 보았는데 세번째 이미지 처럼 나오기는 하지만

    역시 2번째 이미지에서처럼 왼쪽 상단도 같이 나오네요.

     

답글 남기기

이메일 주소는 공개되지 않습니다.