Vorsichtiger Sceensaver Versuch
-
OK, ich dachte mir ich probiers mal... Compiliert auch fehlerfrei, aber der Bildschirm bleibt schwarz... Weiß mir nicht zu helfen.
#include <windows.h> #include <scrnsave.h> #define ID_TIMER 1 #define NUM 300 int v[NUM]; void fill() { srand((int) GetCurrentTime()); for (int j=0;j<NUM;++j) { int a=rand()%10; v[j]=a; }; }; LONG WINAPI ScreenSaverProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int x1,x2,y1,y2,cx,cy,i=0; static HBITMAP hBitmap; static HDC hdcMem,hdc; PAINTSTRUCT ps; switch(message) { case WM_CREATE: SetTimer (hwnd, ID_TIMER, 10, NULL); fill(); cx=GetSystemMetrics(SM_CXSCREEN)/10; cy=GetSystemMetrics(SM_CYSCREEN)/10; break; case WM_TIMER: if (i==300) i=100; x1=cx*v[i++]; y1=cy*v[i++]; x2=cx*v[i++]; y2=cy+v[i++]; hdc=BeginPaint(hwnd, &ps); hdcMem=CreateCompatibleDC (hdc); hBitmap=CreateCompatibleBitmap (hdc, cx, cy); SelectObject(hdcMem, hBitmap); BitBlt (hdcMem,0,0,cx,cy,hdc,x1,y1, SRCCOPY); BitBlt (hdc,x1,y1,cx,cy,hdc,x2,y2, SRCCOPY); BitBlt (hdc,x2,y2,cx,cy,hdcMem,0,0, SRCCOPY); EndPaint(hwnd, &ps); DeleteDC(hdcMem); DeleteObject(hBitmap); break; case WM_DESTROY: DeleteDC(hdcMem); ReleaseDC(hwnd, hdc); DeleteObject(hBitmap); break; } return DefScreenSaverProc(hwnd,message,wParam,lParam); }; BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hWnd,0); return TRUE; case IDCANCEL: EndDialog(hWnd,0); return TRUE; } break; } return FALSE; } BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; };
-
Zeichnen solltest du in WM_PAINT - und auch nur dort gehört Begin-/EndPaint hin

-
Klappt imme noch nicht...
Könnte es sein, das der Bildschirm erst schwarz gemacht wird und dann erst der screenie angemacht wird? Wenn ja, wie kann ich das verhindern?
-
ness schrieb:
Könnte es sein, das der Bildschirm erst schwarz gemacht wird und dann erst der screenie angemacht wird?
Nein, dem ist nicht so - wie sieht dein Code denn jetzt aus?!
-
#include <windows.h> #include <scrnsave.h> #define ID_TIMER 1 #define NUM 1200 int v[NUM]; void fill() { srand((int) GetCurrentTime()); for (int j=0;j<NUM;++j) { int a=rand()%10; v[j]=a; }; }; LONG WINAPI ScreenSaverProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int x1,x2,y1,y2,cx,cy,i=0; static HBITMAP hBitmap; static HDC hdcMem,hdc; PAINTSTRUCT ps; switch(message) { case WM_CREATE: SetTimer (hwnd, ID_TIMER, 10, NULL); fill(); cx=GetSystemMetrics(SM_CXSCREEN)/10; cy=GetSystemMetrics(SM_CYSCREEN)/10; break; case WM_TIMER: if (i==NUM) { i=0; fill(); }; x1=cx*v[i++]; y1=cy*v[i++]; x2=cx*v[i++]; y2=cy+v[i++]; InvalidateRect(hwnd,NULL,TRUE); case WM_PAINT: hdc=BeginPaint(hwnd, &ps); hdcMem=CreateCompatibleDC (hdc); hBitmap=CreateCompatibleBitmap (hdc, cx, cy); SelectObject(hdcMem, hBitmap); BitBlt (hdcMem,0,0,cx,cy,hdc,x1,y1, SRCCOPY); BitBlt (hdc,x1,y1,cx,cy,hdc,x2,y2, SRCCOPY); BitBlt (hdc,x2,y2,cx,cy,hdcMem,0,0, SRCCOPY); EndPaint(hwnd, &ps); DeleteDC(hdcMem); DeleteObject(hBitmap); break; case WM_DESTROY: DeleteDC(hdcMem); ReleaseDC(hwnd, hdc); DeleteObject(hBitmap); break; } return DefScreenSaverProc(hwnd,message,wParam,lParam); }; BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hWnd,0); return TRUE; case IDCANCEL: EndDialog(hWnd,0); return TRUE; } break; } return FALSE; } BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; };
-
Wenn du Messages abfängst, dann solltest du am Ende return 0 aufrufen und nicht DefScreenSaverProc. Außerdem fehlt bei WM_TIMER noch ein return 0;
Außerdem fällt mir spontan auf, dass du bei CreateCompatibleBitmap cx und cy also schon die durch 10 geteilten Werte verwendest. Und auch deine BitBlt-Aufrufe (besonders den mittleren) verstehe ich nicht so ganz
-
Das ist doch wie dreieckstausch! Erst verschieb ich was vom Fenster zum Speicherkontext, dann, ich denke du weißt was Dreieckstausch ist...

(Achja, bin grad auf Visoal Studio umgestiegen, hab ein paar Startschwierigkeiten)
-
ness schrieb:
ich denke du weißt was Dreieckstausch ist...

Das weiß ich schon, nur werden x1,y1 und x2y2 ja zufällig generiert und somit könnte evtl eine Überschneidung der beiden Bereiche auftreten, was beim mittleren BitBlt afaik zu Problemen (undefiniertes Verhalten) führen kann.
Lösung: einfach die beiden letzten BitBlt aus hdcMem heraus blitten.