WndProc() è molto, molto essenziale per il funzionamento di una finestra di Windows. Si tratta di un metodo di wrapper gestito attorno alla procedura della finestra , una funzione che una volta veniva scritta in C nei giorni precedenti. È il modo in cui si personalizza il comportamento di una finestra, facendolo rispondere in modo diverso alle notifiche generate dal sistema operativo o da altri programmi.
In genere non è necessario sovrascriverlo, il metodo WndProc() nella classe base gestisce la maggior parte delle notifiche di base. Trasformandoli in eventi .NET amichevoli, come Click ecc. Ma non è completo, perché la notifica è troppo oscura o necessariamente perché non può sapere nulla dei messaggi usati da una finestra personalizzata. In tal caso, puoi ricorrere a WndProc() per intercettare il messaggio. Il miglior esempio che mi viene in mente è la creazione di una finestra senza bordi per disegnare una cornice della finestra personalizzata e mantenere comunque il normale comportamento della finestra. Più facilmente fatto intercettando messaggi come WM_NCHITTEST, non inclusi da .NET.
Davvero grokking WndProc() richiede la lettura del libro di Petzold "Programmazione di Windows". Forse non è così facile da cogliere oggi, presuppone una comprensione di base del linguaggio C. Quale era la lingua designata da Winapi 30 anni fa, i linguaggi object oriented non erano ampiamente usati o disponibili a quei tempi. Ciò inoltre spiega perché scrivere codice all'interno di WndProc() è piuttosto doloroso, c'è un'astrazione molto piccola e non si possono ignorare i puntatori.
Microsoft ha fatto uno sforzo per ritirarlo, a partire da Windows 8 e l'API WinRT. Non esattamente un successo slamdunk, forse Windows 10 gli darà una certa trazione. La tecnologia fondamentale che fa funzionare WinRT è COM, un grande passo avanti rispetto a C perché supporta un modello di oggetti. Sebbene sia ben nascosto nelle proiezioni linguistiche amichevoli, la programmazione COM è qualcosa che la maggior parte dei programmatori cercheranno di evitare :)
fonte
2015-05-21 17:19:29
Questa domanda è stata referenziata su meta: https://meta.stackoverflow.com/a/295041/3614835 –