2009-02-24 2 views
21

Các thành phần Delphi có CreateWndCreateWindowHandle (và DestroyWndDestroyWindowHandle). Cả hai đều được dự định bị ghi đè bởi hậu duệ, phải không? Và không có ý định được gọi là ngoại trừ việc thực hiện VCL cơ bản?Sự khác nhau giữa CreateWnd và CreateWindowHandle là gì?

Sự khác nhau giữa chúng là gì; khi nào một trong hai người đó bị ghi đè?

Trả lời

36

Cho đến nay hầu hết các câu trả lời ở đây là khá nhiều trên nhãn hiệu và bạn sẽ làm tốt để chú ý lời khuyên của họ. Tuy nhiên, có một chút nữa cho câu chuyện này. Đối với câu hỏi cụ thể của bạn về khi bạn sẽ ghi đè lên một hoặc khác, tôi sẽ thử và tóm lại mọi thứ một chút.

CreateParams();

Nói chung, phần lớn thời gian bạn thực sự cần làm là ghi đè CreateParams(). Nếu tất cả những gì bạn muốn làm là subclass (nhớ kiểu Windows "subclassing?" Xem công việc của Petzold seminal trên Windows programming) một lớp điều khiển hiện có và bọc nó trong một điều khiển VCL, bạn làm điều này từ CreateParams. Bạn cũng có thể kiểm soát các bit kiểu được thiết lập và các tham số khác nhau. Chúng tôi đã thực hiện quá trình tạo "phân lớp" rất dễ dàng. Chỉ cần gọi CreateSubClass() từ phương thức CreateParams() của bạn. Xem các điều khiển VCL lõi cho một ví dụ như TCheckBox hoặc TButton.

CreateWnd();

Bạn sẽ ghi đè điều này nếu bạn cần làm nhiều hơn một chút với xử lý cửa sổ sau khi được tạo. Ví dụ, nếu bạn có một điều khiển đó là một số loại danh sách, cây, hoặc nếu không yêu cầu cấu hình sau khi tạo, bạn sẽ làm điều đó ở đây. Gọi CreateWnd kế thừa, và khi nó trả về (bạn biết bạn có một handle hợp lệ nếu bạn quay trở lại từ CreateWnd bởi vì nó sẽ tăng một ngoại lệ nếu có gì đó không ổn), chỉ cần áp dụng phép thuật phụ của bạn. Một tình huống phổ biến là lấy dữ liệu được lưu trữ trong một danh sách TStrings instance và thực sự di chuyển nó vào trong điều khiển cửa sổ nằm bên dưới. TListBox là một ví dụ điển hình về điều này.

CreateWindowHandle();

Tôi phải làm mới bộ nhớ của mình trên bộ nhớ này, nhưng có vẻ như đây là một trong những điều hiếm khi, nếu có, bị ghi đè. Trong một vài trường hợp bên trong VCL, nó xuất hiện rằng nó được sử dụng để làm việc xung quanh phiên bản Windows cụ thể và các vùng địa phương kỳ lạ với một số điều khiển, chẳng hạn như TEdit và TMemo. Trường hợp rõ ràng hơn khác trong chính TCustomForm. Trong trường hợp này, nó có hỗ trợ mô hình MDI cũ (giao diện tài liệu mutli). Trong trường hợp này, không thể tạo các MDI cho trẻ em bằng cách sử dụng API CreateWindowEx() bình thường, bạn phải gửi một thông điệp đến khung cha mẹ MDI để thực sự tạo ra các xử lý. Vì vậy, lý do duy nhất để vượt qua phương thức này là nếu quá trình thực tế của việc tạo ra xử lý được thực hiện thông qua một phương tiện hoàn toàn khác với phương thức CreateWindowEx() đã thử nghiệm và thực sự cũ.

Tôi đã nhận thấy rằng câu hỏi của bạn chỉ đơn thuần là hỏi về quy trình tạo, nhưng có các phương pháp tương ứng bị ghi đè trong một số trường hợp cho cả việc xử lý sự phá hủy và "voodoo" đôi khi bao quanh xử lý giải trí. Nhưng đây là những chủ đề khác cần được bảo vệ riêng :-).

+0

Câu trả lời hay. Chỉ muốn thêm một tài nguyên web đẹp để hoàn thành câu trả lời vì câu hỏi ban đầu đề cập đến VCL: http://edn.embarcadero.com/article/20569 – Ampere

4

TạoWnd first calls CreateParams, sau đó gọi CreateWindowHandle bằng Params đã tạo. Nói chung, bạn sẽ ghi đè CreateWnd và CreateParams thay vì CreateWindowHandle.

Tôi hy vọng điều này sẽ hữu ích!

0

Tôi chắc chắn rằng câu trả lời cuối cùng chỉ có thể đến từ những người liên quan đến việc tạo ra VCL (Allen?), Nhưng IMHO phương pháp ảo có trách nhiệm ít nhất/thấp nhất trong chuỗi cuộc gọi ghi đè. Đó là lý do tại sao tôi luôn ghi đè CreateParams()CreateWindowHandle(). Điều này có vẻ phù hợp vì cả hai được gọi là CreateWnd() và cả hai chỉ thực hiện một điều đặc biệt.

Cuối cùng, đó có thể là vấn đề ưu tiên.

2

Ai làm việc gì:
CreateWnd là tổng thầu mà tạo ra các cửa sổ hình thành đầy đủ cho một WinControl.
Đầu tiên, nó phải đặt các thuộc tính bắt buộc cho WindowClass bằng cách gọi CreateParams và đảm bảo rằng nó được đăng ký chính xác.
Sau đó, cửa sổ sẽ được tạo ra thực sự, bằng cách gọi CreateWindowHandle trả về Xử lý từ hệ điều hành.
Sau đó, chúng tôi có một cửa sổ hợp lệ có thể xử lý các thông điệp, và CreateWnd nào chải chuốt thức, điều chỉnh các khía cạnh hình ảnh khác nhau như kích thước, font chữ, vv

Có còn sau bước thực hiện bằng cách CreateHandle, sau khi CreateWnd kết thúc, để giúp VCL quản lý các cửa sổ của nó (nhận dạng, cha mẹ, ...).