Bezpośredni dostęp do bufora vs windows

0

Witam !

Sprawa wygląda tak, mam jeden wskaźnik do buforu tylnego (pamięć alokowana na stercie) i musze jego zawartość wstawić (skopiować, ale lepiej tylko podstawić wskaźnik) do okna windows`owego.

Do tej pory tworzyłem bitmapę, zmieniałem jej zawartość i kopiowałem konteksty. Niestety mam problemy z formatem piksela (chyba?) i nie wyświetla mi wszystkich kolorów.

Gdyby ktoś wiedział w jaki sposób mogę tak renderować zawartość okna window`sowego z góry dziękuje za pomoc !

Pozdrawiam !

0

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ść :/.

0

A może coś takiego:
Masz główne okno, dodajesz do niego swoje niestandardowe okno (kontrolke) bez żadnych obramowań itd. W pamięci tworzysz 2 bitmapy + 2 konteksty urządzeń (które będziesz przełączał). Oczywiście bitmapy muszą mieć ten sam format co twoje dodatkowe okienko bez ramek i dobrze by było gdyby miały ten sam rozmiar. I teraz bitmapki traktujesz jak 2 bufory tylny i przedni na których rysujesz. I teraz najważniejsza sprawa w tym wszystkim (nie wiem czy to zadziała ;) ) podmieniasz obiekty bitmapy funkcją SelectObject API. Tym sposobem kontekst głównego okna jest nie ruszany modyfikujesz tylko kontekst tego dodatkowego okna i nie wywołujesz BitBlt która kopiuje całą bitmape.
Nie wiem tylko czy samo podmienienie spowoduje przerysowanie okienka którego kontekst modyfikujesz. I tu może być problem, bo wywołanie odświerzenia okna to prawie to samo co BitBlt (przynajmniej czasowo). W odstateczności proponuje zapoznać się z DirectX. Tam operując na powirzchniach (można powiedzieć bitmapach) nie dość że możesz bez problemu podmieniać wskażnik (tak naprawde jest do tego funkcja) to jeszcze masz bezpośredni dostęp do pamięci obrazu tak jak pod starym poczciwym dosem - same plusy (no może jeden mały minus że trzeba znać DirectX ale podstawy są naprawde proste)

0

Problem polega jednak na tym, że nie mogę wykorzystywać gotowych bibliotek typu DirectX czy OpenGL, a konteksty też mnie nie urządzają :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1