Brauche Hilfe! Simples GDI
-
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); //Deklaration der Windows-Nachrichten-Prozedur 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) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hwnd = CreateWindow (szName, "Katjes - yes - yes - yes", WS_SYSMENU | WS_THICKFRAME, 0, 0, 470, 630, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); //UpdateWindow (hwnd); // Nachrichten-Schleife MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { // TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } int PaintRaster(HWND hwnd); int Cursor(HWND hwnd, int lParam); HDC hdc; // Windows-Nachrichten-Prozedur LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HBRUSH Cursorfarbe=CreateSolidBrush(RGB(255,255,255)); switch (message) { case WM_PAINT: hdc = BeginPaint(hwnd, &ps); PaintRaster(hwnd); EndPaint (hwnd,&ps); return 0; case WM_MOUSEMOVE: Cursor(hwnd,lParam); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } int PaintRaster(HWND hwnd) { RECT Auswahl; HBRUSH Rasterfarbe= CreateSolidBrush(RGB(0,0,0)); int x_rasterpos,y_rasterpos,rastercount; x_rasterpos=0; y_rasterpos=0; hdc=GetDC(hwnd); for(rastercount=0;rastercount<30;rastercount++) { Auswahl.left=x_rasterpos; Auswahl.top=y_rasterpos; Auswahl.right=Auswahl.left+90; Auswahl.bottom=Auswahl.top+100; FrameRect (hdc, &Auswahl, Rasterfarbe); x_rasterpos=x_rasterpos+90; if(x_rasterpos>=450) { x_rasterpos=0; y_rasterpos=y_rasterpos+100; } } ReleaseDC (hwnd,hdc); return 0; } int x_cursorposition,y_cursorposition; int Cursor(HWND hwnd, int lParam) { RECT Auswahl; HBRUSH Rasterfarbe= CreateSolidBrush(RGB(0,0,0)); HBRUSH Cursorfarbe= CreateSolidBrush(RGB(255,255,255)); int x_mousepos,y_mousepos; x_mousepos=LOWORD (lParam); y_mousepos=HIWORD (lParam); if (Auswahl.left!=x_cursorposition || Auswahl.top!=y_cursorposition) { hdc=GetDC(hwnd); Auswahl.left=x_cursorposition; Auswahl.top=y_cursorposition; Auswahl.right=Auswahl.left+90; Auswahl.bottom=Auswahl.top+100; FrameRect(hdc, &Auswahl, Rasterfarbe); Auswahl.left=x_mousepos-(x_mousepos%90); Auswahl.top=y_mousepos-(y_mousepos%100); Auswahl.right=Auswahl.left+90; Auswahl.bottom=Auswahl.top+100; FrameRect(hdc, &Auswahl, Cursorfarbe); ReleaseDC(hwnd,hdc); x_cursorposition=Auswahl.left; y_cursorposition=Auswahl.top; } return 0; }
-
So, ich hoffe, das geht noch mit der Länge. Also, wer den Fehler findet, bekommt ein Fleisskärtchen
Nee, Spass beiseite, ich verzweifele...
-
Auf Anhieb seh ich schonmal diesen Fehler:
HBRUSH Cursorfarbe=CreateSolidBrush(RGB(255,255,255));
Bei jedem Durchlauf (und die Funktion wird sehr oft durchlaufen) der WndProc erstellst du einen neuen Brush und nirgendwo wird er freigegeben. Das gleiche gilt auch für die anderen CreateSolidBrush Aufrufe. Das muss alles mit DeleteObject wieder freigegeben werden.
-
Gut, das merke ich mir schonmal... danke!
Aber das war's noch nicht... Kann es vielleicht sein, dass es Probleme mit hwnd gibt?
Das Programm malt seine Rechtecke nach einiger Zeit auf meinen Desktop.
-
Moment, scheinbar ist es nur in anderen Programmfenstern zu sehen.
-
Also es liegt IMHO nur an nicht freigegebene GDI-Resourcen. Bei mir läuft das Programm eigentlich spitze (Windows XP) bis 10000 GDI-Objekte erstellt wurden. Also guck nochmal genau ob du alles freigibst. Du hast 4 CreateSolidBrush Aufrufe. Hast du wirklich alle Brushes mit DeleteObject wieder freigegeben?
-
Ohje, da hatte ich noch einen Brush übersehen. Ich glaube es funzt jetzt. So einfach kann es sein...
Der Tip mit DeleteObject bringt mich weiter. Danke Dir!!!
-
Ein GetDC-Aufruf hat in WM_PAINT eigentlich wenig verloren. Übergib deiner Funktion lieber das DC-Handle und nutz dieses, anstatt dir ein Neues über das Fenster-Handle zu besorgen.
[ Dieser Beitrag wurde am 12.01.2003 um 18:56 Uhr von D@niel $chumann editiert. ]
-
Danke, D@niel, für deinen Tipp. Habs geändert. Ist ja auch Quatsch, sich in jeder Funktion ein neues Handle zu besorgen, wenn das Handle schon bekannt ist.
Könnte mir vielleicht noch jemand erklären, wie ich die aktuelle Bildschirmauflösung ermittele/verändere und ein Fullscreen-Window programmiere?
Vielen Dank!
[ Dieser Beitrag wurde am 13.01.2003 um 03:29 Uhr von Bello editiert. ]
-
FullScreen: Benutze die Suchfunktion, und du wirst fündig werden.
Auflösung:LONG ChangeDisplaySettings(DWORD x, DWORD y, DWORD bpp) { DEVMODE dm; ZeroMemory(&dm,sizeof(DEVMODE)); dm.dmSize = sizeof(DEVMODE); dm.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; dm.dmBitsPerPel = bpp; // Farbtiefe dm.dmPelsWidth = x; // Breite dm.dmPelsHeight = y; // Hoehe return ::ChangeDisplaySettings(&dm, 0); }
-
GetSystemMetrics() mit den Params SM_CXSCREEN bzw SM_CYSCREEN liefert dir die Auflösung.
-
Tausend Dank! Super Forum, schnelle Infos, sogar in der Nacht zum Montag um halb 4
Ihr seid NERDS!!
Nur, dass leider die Suchfunktion von diesem Forum so unendlich langsam ist, finde ich schade,...
Bis später
-
definiere unendlich langsam *g* ich finds eigentlich recht flott
(recht flott: suche "fullscreen" in winapi; ergebnis nach grob 5 sekunden)
-
bei meiner suche kam ständig "weiterleitung nach: suche fortsetzen
wahrscheinich einfach zuviele treffer gefunden. nach der 5. weiterleitung hab ich dann abgebrochen. werds nochmal probieren
-
Dann hast du wohl auf "alle Foren durchsuchen" geklickt. Wähl da einfach WinAPI Forum aus, dann gehts auch mit einer Weiterleitung.