ďťż

Ładny brzuch

Witam!

Mam program który ma realizować podwójne buforowanie. Wczytywana z dysku bitmapa jest cała zielona. Po transferze bitmapy wczytanej z dysku pomiędzy kontekstami i wyświetleniu jej na oknie zamiast zielonego jest kolor czarny. Czy mógłby mi ktoś powiedzieć co robię nie tak (mile wskazane poprawienie danego fragmentu kodu jeśli nie będzie to sprawiało komuś problemu).
Oto kod: #include <windows.h> HWND thwnd; HDC temphdc; HBITMAP Oldbitmap; HBITMAP tempbitmap; RECT rRect; HBITMAP smallObraz; HBITMAP OldsmallObraz; HDC hdcsmallObraz; LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); void buforowanie(int x,int y); void killall(); char szClassName[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx ( 0, szClassName, "Windows App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, HWND_DESKTOP, NULL, hThisInstance, NULL ); thwnd = hwnd; ShowWindow (hwnd, nFunsterStil); smallObraz =(HBITMAP)LoadImage(NULL, "bg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); if(smallObraz==0) { MessageBox(0,"Nie można otworzyć pliku!!!","Brak pliku",MB_IConerror); return 0; } HDC hdc=GetDC(hwnd); hdcsmallObraz = CreateCompatibleDC(hdc); OldsmallObraz = (HBITMAP)SelectObject(hdcsmallObraz, smallObraz); temphdc=CreateCompatibleDC(hdc); tempbitmap=CreateCompatibleBitmap(temphdc,400,200); Oldbitmap=(HBITMAP)SelectObject(temphdc,tempbitmap); SetRect(&rRect,0,0,400,200); FillRect(temphdc,&rRect,(HBRUSH)GetStockObject(WHITE_BRUSH)); ReleaseDC(hwnd,hdc); buforowanie(10,10); buforowanie(20,20); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(thwnd, &ps); BitBlt(hdc,0,0,400,200,temphdc,0,0,SRCCOPY); EndPaint(thwnd, &ps); } break; case WM_DESTROY: killall(); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } void buforowanie(int x,int y) { HDC hdc = GetDC(thwnd); SelectObject(hdcsmallObraz,smallObraz); BitBlt(temphdc,x,y,10,10,hdcsmallObraz,0,0,SRCCOPY); ReleaseDC(thwnd, hdc); } void killall() { SelectObject(hdcsmallObraz,OldsmallObraz); DeleteDC(hdcsmallObraz); SelectObject(temphdc,Oldbitmap); DeleteDC(temphdc); DeleteObject(tempbitmap); DeleteObject(smallObraz); PostQuitMessage(0); }

Z góry dziękuję za ewentualną pomoc:)
Użytkownik gregussss edytował ten post 10 czerwiec 2009, 17:28


Popełniłeś niewielki błąd. Proponuję przyjrzeć się poniższemu fragmentowi kodu:

temphdc=CreateCompatibleDC (hdc);
tempbitmap=CreateCompatibleBitmap (temphdc, 400, 200);
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •