2009-02-24 5 views

Odpowiedz

36

Do tej pory większość odpowiedzi tutaj jest prawie na temat i dobrze byłoby zrobić, aby posłuchać ich rady. Jednak w tej historii jest trochę więcej. Na twoje pytanie dotyczące tego, kiedy zastąpisz jedną lub drugą, postaram się trochę wyjaśnić.

CreateParams();

Ogólnie rzecz biorąc, większość czasu, który naprawdę trzeba zrobić, to zastąpić CreateParams(). Jeśli wszystko, co chcesz zrobić, to podklasa (pamiętaj o "podklasowaniu" w stylu systemu Windows? Zobacz nowatorską pracę Petzolda na temat programowania w systemie Windows) istniejącej klasy kontrolnej i opakuj ją w kontrolkę VCL, robisz to z CreateParams. Możesz także kontrolować, które bity stylu są ustawione i inne różne parametry. Zrobiliśmy bardzo prosty proces tworzenia "podklasy". Wystarczy wywołać CreateSubClass() z metody CreateParams(). Zobacz główne elementy sterujące VCL, na przykład TCheckBox lub TButton.

CreateWnd();

Zastąpiłbyś ten, jeśli potrzebujesz zrobić trochę więcej za pomocą uchwytu okna po jego utworzeniu. Na przykład, jeśli masz kontrolę, która jest jakąś listą, drzewem lub w inny sposób wymaga konfiguracji po utworzeniu, możesz to zrobić tutaj. Zadzwoń do odziedziczonego CreateWnd, a kiedy on powróci (wiesz, że masz poprawny uchwyt, jeśli wrócisz z CreateWnd, ponieważ spowoduje to wyjątek, jeśli coś poszło nie tak), po prostu zastosuj dodatkową magię. Typowym scenariuszem jest pobranie danych z pamięci podręcznej na listę instancji TStrings i przeniesienie ich do kontrolki okna podstawowego. TListBox jest klasycznym tego przykładem.

CreateWindowHandle();

Musiałem odświeżyć moją pamięć na ten temat, ale wygląda na to, że rzadko się zdarza, jeśli w ogóle, zastąpić. W nielicznych przypadkach w samym VCL wydaje się, że jest on używany do pracy z konkretną wersją systemu Windows i lokalnymi dziwnościami z niektórymi kontrolkami, takimi jak TEdit i TMemo. Innym bardziej przejrzystym przypadkiem jest sam TCustomForm. W tym przypadku ma on obsługiwać stary model MDI (interfejs wielu dokumentów). W tym przypadku dzieci MDI nie mogą zostać utworzone przy użyciu zwykłego API CreateWindowEx(), należy wysłać wiadomość do ramki nadrzędnej MDI, aby faktycznie utworzyć uchwyt. Tak więc jedynym powodem, dla którego warto zastosować tę metodę, jest fakt, że faktyczny proces tworzenia uchwytu odbywa się za pomocą środków zupełnie innych niż stara wypróbowana-i-prawdziwa funkcja CreateWindowEx().

Zauważyłem, że twoje pytanie dotyczyło jedynie procesu tworzenia, ale istnieją odpowiednie metody, które są zastępowane w niektórych przypadkach zarówno w przypadku zniszczenia uchwytu, jak i "voodoo", który czasami otacza obsługę rekreacyjną. Ale są to inne tematy, które powinny być omówione osobno :-).

+0

Świetna odpowiedź. Po prostu chciałem dodać ładny zasób sieciowy, aby ukończyć odpowiedź, ponieważ oryginalne pytanie wspomina o VCL: http://edn.embarcadero.com/article/20569 – Ampere

4

CreateWnd pierwsze wywołania CreateParams, a następnie wywołuje CreateWindowHandle przy użyciu utworzonych Params. Zasadniczo zastępujesz CreateWnd i CreateParams zamiast CreateWindowHandle.

Mam nadzieję, że to pomoże!

0

Jestem pewien, że ostateczna odpowiedź może pochodzić tylko od osób zaangażowanych w tworzenie VCL (Allen?), Ale IMHO metoda wirtualna z najmniejszą odpowiedzialnością/która jest najniższa w łańcuchu połączeń powinna być zastąpione. Właśnie dlatego zawsze zastępuję CreateParams() i CreateWindowHandle(). Wygląda to na dobre dopasowanie, ponieważ oba są wywoływane przez CreateWnd() i oba robią tylko jedną szczególną rzecz.

Ostatecznie jest to prawdopodobnie kwestia preferencji.

2

Kto co robi:
CreateWnd jest generalnym wykonawcą, który tworzy się w pełni uformowany okno dla WinControl.
Po pierwsze, musi ustawić wymagane atrybuty WindowClass, wywołując CreateParams i upewniając się, że jest poprawnie zarejestrowany.
Następnie otrzymuje okno faktycznie utworzone, wywołując CreateWindowHandle, która zwraca wynikowy uchwyt z systemu operacyjnego.
Po tym, mamy ważny okno stanie przetwarzać wiadomości i CreateWnd jest ostateczna grooming, dostosowując różne aspekty wizualne, takie jak rozmiar, czcionka, itp

Istnieje również później kroku wykonaną przez CreateHandle, po zakończeniu CreateWnd, aby pomóc VCL w zarządzaniu jego oknami (identyfikacja, pochodzenie, ...).