Backbuffering ist kaputt
-
Hi zusammen,
Irgendwie kommt bei meinen bescheidenen Backbuffering Versuchen nix vernünftiges bei raus. Bekomme zwar das Rechteck aber nur mit nem verrückten Muster und die Farbe ist nicht wirklich ne Farbe....
Was hab ich falsch gemacht???
case WM_MOUSEMOVE: x=LOWORD(lParam); y=HIWORD(lParam); malen(hwnd,x,y); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } void malen(HWND hwnd,int x,int y) { PAINTSTRUCT ps; RECT rc; HDC hdcMem; HBITMAP hbmMem; HBRUSH hbrDelete; hdc = BeginPaint (hwnd, &ps); GetClientRect(hwnd,&rc); hdcMem = CreateCompatibleDC(hdc); hbmMem = CreateCompatibleBitmap (hdcMem,rc.right-rc.left,rc.bottom-rc.top); SelectObject(hdcMem,hbmMem); hbrDelete = CreateSolidBrush(RGB(255,255,255)); FillRect(hdcMem, &rc, hbrDelete); DeleteObject(hbrDelete); SelectObject(hdcMem,CreateSolidBrush(RGB(0,0,255))); Rectangle(hdcMem,x-30,y-30,x+30,y+30); hdc=GetDC(hwnd); BitBlt(hdc,0,0,rc.right-rc.left,rc.bottom-rc.top,hdcMem,0,0,SRCCOPY); ReleaseDC(hwnd,hdc); DeleteObject(hbmMem); DeleteDC(hdcMem); EndPaint (hwnd, &ps); };
-
Du solltest besser bei WM_PAINT malen, nicht bei WM_MOUSEMOVE.
BeginPaint() darf sogar ausschließlich bei WM_PAINT benutzt werden.
-
Außerdem solltest du den Backbuffer-DC erst mit FillRect in einen definierten Ausgangszustand versetzen

-
@cd9000: Das mit Begin Paint habe ich auch nur gemacht weil es ohne überhaupt net klappt. Das ist die andere Sache die ich net verstehe... warum ist das so??
@flenders: Dachte eigentlich das ich das gemacht habe

hbrDelete = CreateSolidBrush(RGB(255,255,255)); FillRect(hdcMem, &rc, hbrDelete); DeleteObject(hbrDelete);
-
Mr.Nobody schrieb:
Das mit Begin Paint habe ich auch nur gemacht weil es ohne überhaupt net klappt. Das ist die andere Sache die ich net verstehe... warum ist das so??
Zeig bitte mal den Code, der nicht geht.
Wie aber ich aber schon gesagt habe, Zeichnen macht man bei WM_PAINT, nicht bei WM_MOUSEMOVE.
-
Da ist er. Versteh echt nicht warum mir die Puffersache so schwer fällt...
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HWND hwnd; HDC hdc; void malen(HWND,int,int); int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Fensterklasse"; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) CreateSolidBrush(GetSysColor(COLOR_WINDOW)); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); hwnd = CreateWindow (szName, "", WS_SYSMENU | WS_THICKFRAME, 0, 0, 800, 600, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; int x,y; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); EndPaint (hwnd, &ps); return 0; case WM_MOUSEMOVE: x=LOWORD(lParam); y=HIWORD(lParam); malen(hwnd,x,y); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } void malen(HWND hwnd,int x,int y) { PAINTSTRUCT ps; RECT rc; HDC hdcMem; HBITMAP hbmMem; HBRUSH hbrDelete; hdc = BeginPaint (hwnd, &ps); GetClientRect(hwnd,&rc); hdcMem = CreateCompatibleDC(hdc); hbmMem = CreateCompatibleBitmap(hdcMem,rc.right-rc.left,rc.bottom-rc.top); SelectObject(hdcMem,hbmMem); hbrDelete = CreateSolidBrush(RGB(255,255,255)); FillRect(hdcMem, &rc, hbrDelete); DeleteObject(hbrDelete); SelectObject(hdcMem,CreateSolidBrush(RGB(0,0,255))); Rectangle(hdcMem,x-30,y-30,x+30,y+30); hdc=GetDC(hwnd); BitBlt(hdc,0,0,rc.right-rc.left,rc.bottom-rc.top,hdcMem,0,0,SRCCOPY); ReleaseDC(hwnd,hdc); DeleteObject(hbmMem); DeleteDC(hdcMem); EndPaint (hwnd, &ps); };
-
Und zum dritten Mal: Ruf die Funktion malen() bei WM_PAINT und nicht bei WM_MOUSEMOVE auf.

-
Mr.Nobody schrieb:
@flenders: Dachte eigentlich das ich das gemacht habe

hbrDelete = CreateSolidBrush(RGB(255,255,255)); FillRect(hdcMem, &rc, hbrDelete); DeleteObject(hbrDelete);Sorry, hatte ich irgendwie völlig übersehen

Mr.Nobody schrieb:
@cd9000: Das mit Begin Paint habe ich auch nur gemacht weil es ohne überhaupt net klappt. Das ist die andere Sache die ich net verstehe... warum ist das so??
Wie schon gesagt - zeichnen eigentlich nur in WM_PAINT. Für deinen Code würde ich dann x und y static machen und in WM_MOUSEMOVE einfach InvalidateRect aufrufen (dadurch bekommst du eine WM_PAINT-Nachricht) - in WM_PAINT kannst du dann von mir aus deine malen-Funktion aufrufen (aber dann in WM_PAINT dein Begin-/EndPaint rausnehmen)

-
Hi,
Hab alles gemacht was ihr mir vorgeschlagen habt. Aber es ist nach wie vor das gleiche
Wenn ich direkt mit dem hdc zeichene klappts. Aber wenn ich kann die f*** Sachen speichere bakomm ich son f*** angezeigt. Alsob ich durch das Rechteck auf ein Muster im hintergrund guck....p.s. das das keinen großen Sinn macht was ich das programmieren will weiß ich.
Würds aber gern verstehen.#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HWND hwnd; HDC hdc; void malen(HWND,int,int); int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Fensterklasse"; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; // CS = "class style" wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) CreateSolidBrush(GetSysColor(COLOR_WINDOW)); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); hwnd = CreateWindow (szName, "", WS_SYSMENU | WS_THICKFRAME, 0, 0, 800, 600, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; static int x,y; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); malen(hwnd,x,y); EndPaint (hwnd, &ps); return 0; case WM_MOUSEMOVE: x=LOWORD(lParam); y=HIWORD(lParam); InvalidateRect(hwnd,NULL,FALSE); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } void malen(HWND hwnd,int x,int y) { RECT rc,Rect; HDC hdcMem; HBITMAP hbmMem; HBRUSH hbrDelete,hbrFarbe1; //Tolle Sachen machen GetClientRect(hwnd,&rc); hdcMem = CreateCompatibleDC(hdc); hbmMem = CreateCompatibleBitmap(hdcMem,rc.right-rc.left,rc.bottom-rc.top); SelectObject(hdcMem,hbmMem); //Feld leeren hbrDelete = CreateSolidBrush(RGB(255,255,255)); FillRect(hdcMem, &rc, hbrDelete); DeleteObject(hbrDelete); //Zeichnen hbrFarbe1 = CreateSolidBrush(RGB(0,0,255)); SetRect(&Rect,x-30,y-30,x+30,y+30); FillRect(hdcMem, &Rect, hbrFarbe1); DeleteObject(hbrFarbe1); //Kopieren BitBlt(hdc,0,0,rc.right-rc.left,rc.bottom-rc.top,hdcMem,0,0,SRCCOPY); DeleteObject(hbmMem); DeleteDC(hdcMem); };
-
Du musst dein CreateCompatibleBitmap mit dem Handle des richtigen DCs aufrufen, denn der Memory-DC ist nach dem Erstellen schwarz-weiß.
-
Ahh sag das doch gleich

Jetzt klappts
Also kann ich die Farbe von dem monochromen bitmap was ich erzeugt habe nicht verändern.(momochrom halt)
Und wenn ich den hdc direkt hole bekomm ich ein farbiges BITMAP.Hoffe hab das jetzt richtig verstanden
Danke für die Hilfe wär ich nie drauf gekommen