Newsgroup: it.comp.programmare.win32
Titolo: Funzione callback

Che cosa è a cosa serve come si fa a scrivere una funzione di questo tipo.
Fatemio degli esempi
Carmelo

 Fatemio degli esempi
Una funzione callback e` (nel contesto delle API di Windows) una
funzione che il programmatore applicativo scrive, e passa a qualche
API, affinche` essa venga richiamata in certe condizioni.
Scriverla e` assai facile, basta usare la macro CALLBACK (e
rispettare gli altri aspetti della signature della funzione cosi`
come previsti dalle specifiche API).
Ad esempio, supponiamo di voler sapere quante finestre di
top level esistono in un dato momento.  Questo si fa con la
api EnumWindows, che richiede appunto una funzione di
callback:
#include <windows.h>
#include <stdio.h>
BOOL CALLBACK
ContaLeFinestre(HWND hwnd,  LPARAM lParam)
{
    ++(*(int*)lParam);      // incrementa il conteggio
    return TRUE;                // continua l'enumerazione
}
int conteggio = 0;
int main()
{
    EnumWindows(ContaLeFinestre, (LPARAM)&conteggio);
    printf("Ci sono %d finestre\n", conteggio);
    return 0;
}
Come vedi, la scrittura di una funzione di callback, come
qui la ContaLeFinestre, e` tutt'altro che difficile!
Alex

Ti spego il mio problema.
Ho implementato una finestra di dialogo Trova/Sostituisci in una mia
applicazione e tutto funziona.
Ma adesso come si fa a sapere quando l'utente pigia il tasto annulla, o il
tasto sostituisci, o il tasto sostituisci tutto
Io ho sfogliato la guida e ho letto che è possibile intercettare i messaggi
di questo dialogo con una funzione callback ma in che modo mica l'ho capito
da qui la mia domanda.
Io uso il Visual C++ 6
Ciao  e grazie
Carmelo

 da qui la mia domanda.
Immagino tu stia parlando del membro lpfnHook della struttura
FINDREPLACE.  In quel membro (se setti il relativo flag) devi
mettere l'indirizzo di una funzione simile a:
UINT CALLBACK
LaMiaFunz(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
    // testa se vuoi intercettare il messaggio, e allora torna 1, altrimenti
    return 0;    // dice alla trova/sostituisci di funziare normalmente
}
Comunque ai tuoi scopi non ne hai bisogno.  Alla tua finestra,
proprietaria di quella di find/replace, quest'ultima spedira`
dei messaggi di codice FINDMSGSTRING (usa RegisterWindowMessage
per scoprire a cosa e` associato questo codice) con, in lParam,
l'indirizzo di una struttura FINDREPLACE il cui campo Flags
contiene il codice relativo a cosa esattamente abbia "pigiato"
l'utente, ad esempio FR_REPLACEALL se ha "pigiato" quello
che tu chiami "sostituisci tutto", ecc ecc.  Ti basta, dunque,
gestire questi messaggi nella tua normale window procedure.
Se usi MFC, farai uso della macro ON_REGISTERED_MESSAGE
per associare a FINDMSGSTRING la tua funzione-membro che
lo gestisce.  Se non sbaglio l'MSDN da` proprio questo caso
come esempio di ON_REGISTERED_MESSAGE!
La tua funzione-membro di gestione sara` dunque una
normalissima funzione-membro per la gestione di messaggi,
cosi` come tutte le altre che scrivi, o che il Wizard di VStudio
scrive per conto tuo, per gestire messaggi qualsivoglia.
Alex

...

Si fa cosě anche in Borland Delphi 1.0?
--
Firmato:L'Ammiraglio
Comandante della USS "Defiant" NX74205
Attualmente in missione sul confine cardassiano.