Proponowałbym zająć się problemem formatu pixela. Albo tworzyć bitmapę 32 lub 24bit poprzez CreateDIBSection i na niej wykonywać operacje /kopiować z niej bezpośrednio na kontekst okna/ albo
HDC BackDC = CreateCompatibleDC (hOknoDocelowe);
HBITMAP BackBMP = CreateCompatibleBitmap (hOknoDocelowe);
SelectObject (BackDC, BackBMP);
/*...*/
BitBlt (HDC_OknoDocelowe, /*...*/, BackDC /*...*/);
Ale tego rozwiązania nie polecam ponieważ trzeba się bawić pixelami poprzez WinApi /niby można skopiować całą pamięć takiej kompatybilnej bitmapy, przerobić i skopiować w 'drugą stronę'/ - to marnotrawstwo czasu i mocy obliczeniowej. Win konwertuje format DC to takiego jaki w danym momencie mu pasuje więc wymuszenie 32bitowego formatu pixela nic nie zmieni :>
Swego czasu miałem podobny problem, powyższe metody go rozwiązują... chyba :-)
A teraz tylko CreateDIBSection, rozpisać algo na mmx'ie i delektować się efektami :-D
Co do podstwienia własnego wskaźnika to niezbyt dobry pomysł - nie pamiętam jak to jest na 9x, ale na NT operacje na kontekstach urządzeń są realizowane bezpośrednio poprzez Ring0 - np. BitBlt robi parę sprawdzeń, wrzuca na stos kopię parametrów i wywołuje poprzez export z ntdll sysenter albo przerwanie 0x2e z wskaznikiem na argumenty w edx i numerem funkcji w eax. Dopiero w Win32k.sys po 'kilku' operacjach uzyskiwany jest wskaźnik do bufora.
Właśnie przyszło mi coś na myśl: stworzyć bitmapę poprzez CreateDIBSection i podpiąć bezpośrednio pod kontekst okna. Po każdej modyfikacji wywoływać InvalidateRect. Jak będę miał chwilę czasu wieczorem to może się tym pobawię... chociaż szczerze wątpię w taką możliość :/.