Kreisumdrehung
-
Hallo zusammen.
Folgender Quellcode erzeugt einen Kreis und läßt die geometrischen Figuren Rechteck, Kreis,... darum kreisen.#include <windows.h> #include <iostream.h> #include <math.h> class Rechteck{ public: Rechteck(HDC hdc,int x,int y) { Rectangle(hdc,x-37,y-37,x+37,y+37); }; }; class Kreis { public: Kreis(HDC hdc,int x,int y,int rl,int rt) { Arc(hdc,x+50,y+50,x-50,y-50,rl,rt,rl,rt); }; }; class Elipse { public: Elipse(HDC hdc,int x,int y,int rl,int rt) { Arc(hdc,x+30,y+50,x-30,y-50,rl,rt,rl,rt); }; }; class Dreieck{ public: Dreieck(HDC hdc,int x,int y) { POINT points[3]; points[0].x=x-30; points[0].y=y-30; points[1].x=x+30; points[1].y=y-30; points[2].x=x; points[2].y=y+30; Polygon(hdc,points,3); }; }; class Kreisbahn{ private: double Pi; int xmittelpunkt; int ymittelpunkt; int xkoordinate; int ykoordinate; int radius; public: Kreisbahn(int schritt, int schritte) { Pi = 3.1415926535; xmittelpunkt=350; ymittelpunkt=350; radius= 150; xkoordinate = xmittelpunkt + sin( 2 * Pi * schritt / schritte) * radius; ykoordinate = ymittelpunkt - cos( 2 * Pi * schritt / schritte) * radius; }; int getX() { return xkoordinate; }; int getY() { return ykoordinate; }; }; LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { double centerX=10, centerY=10; const char sztext[] = "vjdfg"; HANDLE brush; HANDLE pen; brush = CreateSolidBrush(RGB(255,255,255)); pen = CreatePen(PS_SOLID,1,RGB(0,0,255)); switch(message) { case WM_KEYDOWN: { PostQuitMessage(0); return(0); }break; case WM_DESTROY: { PostQuitMessage(0); return(0); }break; default:break; } return (DefWindowProc(hwnd,message,wparam,lparam)); } int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; HWND hwnd; MSG message; HDC hdc; RECT rect; HANDLE brush; HANDLE pen; brush = CreateSolidBrush(RGB(255,255,255)); pen = CreatePen(PS_SOLID,1,RGB(0,0,255)); const char szclassname[] = "Klasenname"; winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinst; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL,IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = szclassname; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&winclass)) return(0); if (!(hwnd = CreateWindowEx(NULL,szclassname,"MGLFHGSFH",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,700,700,NULL,NULL,hinst,NULL))) return (0); ShowWindow(hwnd, ncmdshow); UpdateWindow(hwnd); int a=36000; int b=0; int c = 15; while(b<a) { hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); SelectObject(hdc, pen); SetBkMode(hdc, TRANSPARENT); //SetTextColor(hdc, RGB(0,0,255)); MoveToEx(hdc,40,20,NULL); int a=36000; int b=0; int c = 15; while(b<a) { Kreisbahn kreisb(b,a); int bx = kreisb.getX(); int by = kreisb.getY(); Kreisbahn kreisc(b+9000,a); int cx = kreisc.getX(); int cy = kreisc.getY(); Kreisbahn kreisd(b+18000,a); int dx = kreisd.getX(); int dy = kreisd.getY(); Kreisbahn kreise(b+27000,a); int ex = kreise.getX(); int ey = kreise.getY(); Arc(hdc, rect.left+200,rect.top+200,rect.right-200,rect.bottom-200,rect.left,rect.top,rect.left,rect.top); // Das Dreieck Dreieck dreieck(hdc,bx,by); // Das Quadrat Rechteck rechteck(hdc,cx,cy); // Der Kreis Kreis kreis(hdc,dx,dy,rect.left,rect.top); // Die Elipse Elipse elipse(hdc,ex,ey,rect.left,rect.top); FillRect(hdc, &rect, (HBRUSH)brush); b++; } DeleteObject(pen); ReleaseDC(hwnd,hdc); } while(GetMessage(&message,NULL,0,0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; }
Warum wird nach einer kompletten Umdrehung des Kreises durch die geometrischen Figuren auf einmal die Farbe auf schwarz gesetzt?
Und wie bekomme ich es hin, dass das Programm sofort beendet wird, sobald ich eine Taste drücke?Gruß Jetyt
-
Probiers mal so:
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; HWND hwnd; MSG message; HDC hdc; RECT rect; HANDLE brush; HANDLE pen; brush = CreateSolidBrush(RGB(255,255,255)); pen = CreatePen(PS_SOLID,1,RGB(0,0,255)); const char szclassname[] = "Klasenname"; winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinst; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL,IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = szclassname; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&winclass)) return(0); if (!(hwnd = CreateWindowEx(NULL,szclassname,"MGLFHGSFH",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,700,700,NULL,NULL,hinst,NULL))) return (0); ShowWindow(hwnd, ncmdshow); UpdateWindow(hwnd); int a=36000; int b=0; int c = 15; while(b<a) { hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); SelectObject(hdc, pen); SetBkMode(hdc, TRANSPARENT); //SetTextColor(hdc, RGB(0,0,255)); MoveToEx(hdc,40,20,NULL); int a=36000; int b=0; int c = 15; while(b<a) { Kreisbahn kreisb(b,a); int bx = kreisb.getX(); int by = kreisb.getY(); Kreisbahn kreisc(b+9000,a); int cx = kreisc.getX(); int cy = kreisc.getY(); Kreisbahn kreisd(b+18000,a); int dx = kreisd.getX(); int dy = kreisd.getY(); Kreisbahn kreise(b+27000,a); int ex = kreise.getX(); int ey = kreise.getY(); Arc(hdc, rect.left+200,rect.top+200,rect.right-200,rect.bottom-200,rect.left,rect.top,rect.left,rect.top); // Das Dreieck Dreieck dreieck(hdc,bx,by); // Das Quadrat Rechteck rechteck(hdc,cx,cy); // Der Kreis Kreis kreis(hdc,dx,dy,rect.left,rect.top); // Die Elipse Elipse elipse(hdc,ex,ey,rect.left,rect.top); FillRect(hdc, &rect, (HBRUSH)brush); b++; if (PeekMessage(&message,NULL,0,0,PM_REMOVE)) { if (message.message == WM_QUIT) break; TranslateMessage(&message); DispatchMessage(&message); } } break; } DeleteObject(pen); ReleaseDC(hwnd,hdc); return message.wParam; }
-
sorry, fehler... das letzte break; musst du noch ersetzen mit
[code]
if (message.message == WM_QUIT) break;
-
mal ne dumme frage.
fehlt da nicht die windowsprocedur und werden die messages net normal dort verarbeitet???
-
Doch! Es sollte normalerweise in der WM_PAINT gezeichnet werden.
Außerdem gibst du brush und pen, die in WindowProc bei jeder Message angelegt werden nicht frei! (Daran wird wohl das mit dem Schwarz liegen)