Hasta ahora, la mayoría de las respuestas aquí son bastante acertadas y haría bien en seguir sus consejos. Sin embargo, hay un poco más de esta historia. A su pregunta específica sobre cuándo anularía una u otra, intentaré resumir las cosas un poco.
CreateParams();
En general, la mayoría de las veces todo lo que necesita hacer es anular CreateParams(). Si todo lo que quieres hacer es crear una subclase (¿recuerdas el estilo de Windows "subclasificación"? Ver el trabajo seminal de Petzold sobre programación de Windows) una clase de control existente y envolverlo en un control de VCL, lo haces desde CreateParams. También puede controlar qué bits de estilo se establecen y otros parámetros diversos. Hemos hecho que el proceso de creación de una "subclase" sea muy fácil. Simplemente llame a CreateSubClass() desde su método CreateParams(). Consulte los controles de VCL principales para ver un ejemplo como TCheckBox o TButton.
CreateWnd();
Anularía esta si necesita hacer un poco más con el identificador de ventana una vez que se ha creado. Por ejemplo, si tiene un control que es algún tipo de lista, árbol o requiere configuración posterior a la creación, lo haría aquí. Llame al CreateWnd heredado, y cuando vuelva (usted sabe que tiene un identificador válido si regresa de CreateWnd porque generará una excepción si algo salió mal), simplemente aplique su magia extra. Un escenario común es tomar los datos que se almacenan en caché en una lista TStrings de instancia y realmente moverlos al control de ventana subyacente. El TListBox es un ejemplo clásico de esto.
CreateWindowHandle();
Tuve que actualizar mi memoria en este caso, pero parece que este es uno rara vez, si es que alguna vez, anulado. En los pocos casos dentro de VCL en sí, parece que se usa para trabajar con versiones específicas de Windows y rarezas locales con algunos controles, como TEdit y TMemo. El otro caso más claro está en TCustomForm. En este caso, está ahí para admitir el viejo modelo de MDI (interfaz de documentos múltiples). En este caso, los elementos secundarios MDI no pueden crearse utilizando la API normal CreateWindowEx(), debe enviar un mensaje al cuadro padre MDI para crear realmente el identificador. Por lo tanto, la única razón para superar este método es si el proceso real de creación del identificador se realiza a través de un medio completamente diferente del antiguo y probado CreateWindowEx().
Me di cuenta de que su pregunta era simplemente preguntando sobre el proceso de creación, pero existen métodos correspondientes que se anulan en algunos casos para la destrucción del mango y el "vudú" que a veces rodea el manejo de la recreación. Pero estos son otros temas que deberían tratarse por separado :-).
Gran respuesta. Solo quería agregar un buen recurso web para completar la respuesta ya que la pregunta original menciona el VCL: http://edn.embarcadero.com/article/20569 – Ampere