자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 그룹박스 Paint관련
2020.01.05 18:13
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
TGroupBox를 상속받아 세부사항이 변경가능토록 구현중입니다.
헌데 이상한 점이 있더군요.
VclStyle을 기본인 Windows로 할 경우 변경사항이 발생시 마다 TCustomGroupBox의 Paint가 정상적으로 발생되는데,
VclStyle을 다른 것으로 변경하게 되면 변경사항이 발생되도 저 Paint로 넘어오질 않더군요.
아무래도 VclStyle에서 모두 직접 처리하느라 후킹된 후 발생이 되지 않는 것으로 보입니다.
이 경우 정상적으로 Paint가 호출되도록 하려면 어떻게 해야할까요?
Paint가 발생되지 않으니 Paint를 상속받은 처리도 무용지물이네요...ㅜㅜ
댓글 2
Delphi 그룹박스 Paint관련
2020.01.05 18:13
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
TGroupBox를 상속받아 세부사항이 변경가능토록 구현중입니다.
헌데 이상한 점이 있더군요.
VclStyle을 기본인 Windows로 할 경우 변경사항이 발생시 마다 TCustomGroupBox의 Paint가 정상적으로 발생되는데,
VclStyle을 다른 것으로 변경하게 되면 변경사항이 발생되도 저 Paint로 넘어오질 않더군요.
아무래도 VclStyle에서 모두 직접 처리하느라 후킹된 후 발생이 되지 않는 것으로 보입니다.
이 경우 정상적으로 Paint가 호출되도록 하려면 어떻게 해야할까요?
Paint가 발생되지 않으니 Paint를 상속받은 처리도 무용지물이네요...ㅜㅜ
이하 자문자답입니다 ----------------------------------
Vcl.StdCtrls에 있는 TCustomGroupBox의 생성/소멸 부분을 살펴보면 다음과 같이 되어있습니다.
class constructor TCustomGroupBox.Create;
begin
TCustomStyleEngine.RegisterStyleHook(TCustomGroupBox, TGroupBoxStyleHook);
end;
class destructor TCustomGroupBox.Destroy;
begin
TCustomStyleEngine.UnRegisterStyleHook(TCustomGroupBox, TGroupBoxStyleHook);
end;
즉, VclStyle이 적용되 있는 경우 TGroupBoxStyleHook에서 그룹박스의 모든 처리가 후킹되어 진행됩니다.
따라서 VclStyle이 적용된 경우, Paint등을 직접 제어하려면 저 후커를 재정의해야 합니다.
아래는 후커와 그룹박스를 상속받아 재정의 한 예시입니다.
이제 Paint를 직접 제어할 수 있으므로, 변경이 필요할 경우 그룹박스의 Paint에 기술하면 됩니다.
그룹박스 이외의 다른 컨트롤에서도, VclStyle이 적용된 경우 응용하여 작성하면 제어가 가능합니다.
첨부한 소스는 VclStyle이 적용된 그룹박스의 프레임 색상을 변경하는 예제입니다.
도움이 되시길...
--------------------------------------------
//후커 재정의
TGroupBoxStyleHookEx = class(TGroupBoxStyleHook)
protected
procedure Paint(Canvas: TCanvas); override;
end;
//그룹박스 재정의
TGroupBoxEx = class(TGroupBox)
private
class constructor Create;
class destructor Destroy;
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
end;
//폼의 그룹박스에 TGroupBoxEx가 적용되도록 한다.
TGroupBox = class(TGroupBoxEx);
TForm1 = class(TForm)
GroupBox1: TGroupBox;
private
{ Private declarations }
public
{ Public declarations }
end;
...
implementation
...
procedure TGroupBoxStyleHookEx.Paint(Canvas: TCanvas);
begin
inherited;
//추가/변경 사항이 필요한 경우 이하에 작성한다.
//원 컨트롤의 이벤트를 호출한다.
TGroupBoxEx(Control).Paint;
end;
class constructor TGroupBoxEx.Create;
begin
//후커교체
TCustomStyleEngine.RegisterStyleHook(TCustomGroupBox, TGroupBoxStyleHookEx);
end;
constructor TGroupBoxEx.Create(AOwner: TComponent);
begin
inherited;
end;
class destructor TGroupBoxEx.Destroy;
begin
//후커교체
TCustomStyleEngine.UnRegisterStyleHook(TCustomGroupBox, TGroupBoxStyleHookEx);
end;
procedure TGroupBoxEx.Paint;
begin
inherited;
//변경할 사항을 이하에 기술한다(폰트변경, 모양변경 등등)
end;