Zdravím,
jak už psal yaqwsx, má to co dočinění s OOP a ukazateli na funkce. Jde o to, že kompilátor do všech členských (nestatických) metod dané třídy, přidavá argument - ukazatel na danou třídu. Příklad:
class Foo
{
public:
void fooMethod(int a) {
//...
}
};
// volani
Foo f;
f.fooMethod();
A mužeš si to třeba představit tak, že kompilátor z toho uděla něco jako toto:
void Foo::fooMethod(Foo* const this) {
//...
}
//volani
Foo f;
Foo::fooMethod(&f);
A jak to souvisí s ukazateli na funkce?
Je potřeba si uvědomit, že funkce má nějakou signaturu. Pokud chceš nastavit funkci nějakému ukazateli, nesmíš porušit signaturu. A zde je kámen úrazu. Ačkoliv sám ve třídě máš funkci fooMethod a ukazetel na void (*pFunc)(), tak kompilátor potichu rozšiřil fooMethod o jeden skrytý argument.
Proto má C++ ukazatel na metody. Takže když chceš předat metodu třídy do C-like ukazatele na funkci, tak se to obchází nejčastěji přes statické metody. Nicméně zde je zase problém, že statická metoda nemůže, bez instance dané třídy, přístupovat ke členským (nestatickým) atributům dané třídy. Tudíž musíš mít nějaký mechanismus, jak dostat referenci na instanci tvé třídy do statické metody. A to lze buď jak naznačil yaqwsx, nebo pokud, když už jsi ve WinApi, tak pak je velice dobrý článek: http://www.zezula.net/cz/prog/wndproc_v_tride.html