2009-02-24 11 views
21

델파이 구성 요소는 CreateWndCreateWindowHandle (및 DestroyWndDestroyWindowHandle)입니다. 그들은 둘 다 자손에 의해 오버라이드되도록 의도 된 것입니다, 그렇죠? 그리고 기본 VCL 구현을 제외하고는 호출 할 수 없습니까?CreateWnd와 CreateWindowHandle의 차이점은 무엇입니까?

그들 사이의 차이점은 무엇입니까? 언제 그들 중 어느 것이 오버라이드되어야합니까?

답변

36

여기에 대한 답은 대부분 여기에 달려 있으며 조언을 듣는 것이 좋습니다. 그러나이 이야기에는 조금 더 많은 것이 있습니다. 하나 또는 다른 것을 덮어 쓰는시기에 대한 구체적인 질문에 대해 조금만 시도해 보겠습니다.

CreateParams();

일반적으로 대부분의 경우 CreateParams()를 재정의해야합니다. Windows 스타일 "서브 클래 싱"을 기억하고 싶다면 기존 컨트롤 클래스를 Petzold의 정액 작업으로 보아서 VCL 컨트롤로 래핑하면 CreateParams에서이 작업을 수행 할 수 있습니다. 설정되는 스타일 비트 및 기타 다양한 매개 변수를 제어 할 수도 있습니다. 우리는 "하위 클래스"를 만드는 과정을 매우 쉽게 만들었습니다. CreateParams() 메서드에서 CreateSubClass()를 호출하면됩니다. TCheckBox 또는 TButton과 같은 예를 보려면 핵심 VCL 컨트롤을 참조하십시오.

CreateWnd();

일단 창 핸들을 만들면 좀 더 많은 작업을해야 할 경우이 설정을 덮어 쓰게됩니다. 예를 들어, 어떤 종류의 목록, 트리 또는 기타 컨트롤이 포스트 생성 구성을 필요로한다면 여기에서 그렇게 할 것입니다. 상속 된 CreateWnd를 호출하고 반환하면 (뭔가 잘못되었을 때 예외를 발생시킬 수 있기 때문에 CreateWnd에서 반환하면 유효한 핸들이 있음을 알 수 있습니다.) 추가 마법을 적용하면됩니다. 일반적인 시나리오는 인스턴스 TStrings 목록에 캐시 된 데이터를 가져와 실제로 기본 창 컨트롤로 이동하는 것입니다. TListBox는 이것의 전형적인 예입니다.

CreateWindowHandle();

나는이 일에 내 기억을 새로 고쳐야 만했지만, 이것은 거의 보지 못했다. VCL 내부의 몇몇 경우에는 TEdit 및 TMemo와 같은 일부 컨트롤에서 특정 Windows 버전 및 로케일 이상한 점을 해결하는 데 사용되는 것으로 보입니다. 또 다른 명확한 사례는 TCustomForm 자체에 있습니다. 이 경우 이전 MDI (다중 문서 인터페이스) 모델을 지원할 수 있습니다. 이 경우 일반 CreateWindowEx() API를 사용하여 MDI 자식을 만들 수 없으므로 핸들을 실제로 만들려면 MDI 부모 프레임에 메시지를 보내야합니다. 그래서이 메소드를 덮어 쓰는 유일한 이유는 핸들을 생성하는 실제 프로세스가 오래된 Try-and-True CreateWindowEx()와 완전히 다른 방법을 통해 수행된다면입니다.

나는 당신의 질문은 단지 창조 과정에 관해 묻는 것이었지만, 어떤 경우에는 파괴 파괴와 때로는 레크리에이션을 둘러싼 "부두"둘 모두에 대해 무시되는 상응하는 방법이 있음을 알았습니다. 그러나 이것들은 별도로 다루어야하는 다른 주제들입니다 :-).

+0

좋은 답변입니다. 원래 질문이 VCL을 언급 한 이후로 답변을 완성하기위한 멋진 웹 리소스를 추가하고 싶었습니다. http://edn.embarcadero.com/article/20569 – Ampere

4

CreateWnd는 먼저 CreateParams를 호출 한 다음 생성 된 Params를 사용하여 CreateWindowHandle을 호출합니다. 일반적으로 CreateWindowHandle 대신 CreateWnd 및 CreateParams를 재정의합니다.

도움이 되었기를 바랍니다.

0

최종 답변은 VCL (Allen?)을 만드는 사람들과 만 만날 수 있지만 IMHO는 최소한의 책임이있는 가상 방법/통화 체인에서 가장 낮아야합니다. 재정의. 그래서 내가 항상 CreateParams()CreateWindowHandle()을 재정의했습니다. 이것들은 모두 에 의해 호출되고 CreateWnd()에 의해 호출되고 둘 다 하나의 특별한 것을 수행하기 때문에 좋은 적합성으로 보입니다.

결국에는 선호도가 높습니다.

2

것을 수행 대상 :
CreateWnd은 WinControl에 대한 완전한 형태 창을 생성하는 일반적인 계약자입니다.
먼저, CreateParams을 호출하고 올바르게 등록되었는지 확인하여 WindowClass에 필요한 속성을 설정해야합니다.
그러면 실제로 생성 된 창을 가져옵니다. CreateWindowHandle을 호출하여 OS에서 결과 핸들을 반환합니다. 그 후
, 우리는, 크기, 글꼴, 같은 다른 시각적 인 측면을 조정 최종 정리가

나중에 CreateHandle에 의해이 수행 단계입니다

않는 유효한 메시지를 처리 ​​할 수 ​​창 및 CreateWnd이 CreateWnd가 끝나면 VCL이 창 (ID, 본질, ...)을 관리하는 데 도움이됩니다.

관련 문제