#include <Windows.h>
#include <math.h>
#define ID_TIMER 1
LRESULT CALLBACK WndProc( HWND , UINT , WPARAM , LPARAM ) ;
void WINAPI Rotate( POINT arr[ 5 ] ) ;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int cmdShow)
{
TCHAR szAppName[ ] = TEXT( "HelloWin32" ) ;
HWND hWnd;
MSG msg;
WNDCLASS wndClass;
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = wndClass.cbWndExtra = 0 ;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon( 0 , IDI_APPLICATION) ;
wndClass.hCursor = LoadCursor( 0 , IDC_ARROW) ;
wndClass.hbrBackground = ( HBRUSH) GetStockObject( 1 ) ;
wndClass.lpszMenuName = 0 ;
wndClass.lpszClassName = szAppName;
if ( ! RegisterClass( & wndClass) )
{
MessageBox( 0 , TEXT( "Failed to register window class" ) , TEXT( "Error" ) , MB_OK | MB_DEFBUTTON1 | MB_ICONERROR) ;
return 1 ;
}
hWnd = CreateWindow( szAppName, TEXT( "Hello World Win32!!" ) , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL , NULL , hInstance, NULL ) ;
if ( ! hWnd)
{
MessageBox( NULL , TEXT( "Failed to create the window" ) , TEXT( "Win32 Error" ) , MB_ICONERROR) ;
return 1 ;
}
SetTimer( hWnd, ID_TIMER, 400 , NULL ) ;
ShowWindow( hWnd, cmdShow) ;
UpdateWindow( hWnd) ;
while ( GetMessage( & msg, NULL , 0 , 0 ) )
{
TranslateMessage( & msg) ;
DispatchMessage( & msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM w, LPARAM l)
{
static HDC hdc;
static PAINTSTRUCT ps;
static POINT arr[ 5 ] ;
static int i;
static RECT rect;
switch ( message)
{
case WM_CREATE:
GetClientRect( hWnd, & rect) ;
arr[ 0 ] .x = 200 ;
arr[ 0 ] .y = 100 ;
arr[ 1 ] .x = 100 ;
arr[ 1 ] .y = 100 ;
arr[ 2 ] .x = 100 ;
arr[ 2 ] .y = 200 ;
arr[ 3 ] .x = 200 ;
arr[ 3 ] .y = 200 ;
arr[ 4 ] .x = arr[ 0 ] .x ;
arr[ 4 ] .y = arr[ 0 ] .y ;
return 0 ;
case WM_TIMER:
Rotate( arr) ;
InvalidateRect( hWnd, & rect, TRUE) ;
return 0 ;
case WM_DESTROY:
KillTimer( hWnd, ID_TIMER) ;
PostQuitMessage( 0 ) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint( hWnd, & ps) ;
MoveToEx( hdc, arr[ 0 ] .x , arr[ 0 ] .y , NULL ) ;
for ( i = 1 ; i < 5 ; ++ i) LineTo( hdc, arr[ i] .x , arr[ i] .y ) ;
EndPaint( hWnd, & ps) ;
return 0 ;
case WM_SIZE:
GetClientRect( hWnd, & rect) ;
return 0 ;
default :
return DefWindowProc( hWnd, message, w, l) ;
}
}
void WINAPI Rotate( POINT arr[ 5 ] )
{
static const POINT origin = { 150 , 150 } ;
static int i;
static const double angle = 0.1 ;
static const int direction = 1 ; // 1 or -1
for ( i = 0 ; i < 5 ; ++ i)
{
arr[ i] .x - = origin.x ;
arr[ i] .y - = origin.y ;
arr[ i] .x = arr[ i] .x * cos ( angle) - direction * arr[ i] .y * sin ( angle) ;
arr[ i] .y = direction * arr[ i] .x * sin ( angle) + arr[ i] .y * cos ( angle) ;
arr[ i] .x + = origin.x ;
arr[ i] .y + = origin.y ;
}
}
I2luY2x1ZGUgPFdpbmRvd3MuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2RlZmluZSBJRF9USU1FUiAxCgpMUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCAsIFVJTlQgLCBXUEFSQU0gLCBMUEFSQU0gKTsKdm9pZCBXSU5BUEkgUm90YXRlKFBPSU5UIGFycls1XSk7CgppbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0YW5jZSwgSElOU1RBTkNFIGhQcmV2SW5zdGFuY2UsIFBTVFIgc3pDbWRMaW5lLCBpbnQgY21kU2hvdykKewogICAgVENIQVIgc3pBcHBOYW1lW10gPSBURVhUKCJIZWxsb1dpbjMyIik7CglIV05EIGhXbmQ7CglNU0cgbXNnOwoJV05EQ0xBU1Mgd25kQ2xhc3M7Cgl3bmRDbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwoJd25kQ2xhc3MubHBmblduZFByb2MgPSBXbmRQcm9jOwoJd25kQ2xhc3MuY2JDbHNFeHRyYSA9IHduZENsYXNzLmNiV25kRXh0cmEgPSAwOwoJd25kQ2xhc3MuaEluc3RhbmNlID0gaEluc3RhbmNlOwoJd25kQ2xhc3MuaEljb24gPSBMb2FkSWNvbigwLCBJRElfQVBQTElDQVRJT04pOwoJd25kQ2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKCXduZENsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKSBHZXRTdG9ja09iamVjdCgxKTsKCXduZENsYXNzLmxwc3pNZW51TmFtZSA9IDA7Cgl3bmRDbGFzcy5scHN6Q2xhc3NOYW1lID0gc3pBcHBOYW1lOwoKCWlmICghUmVnaXN0ZXJDbGFzcygmd25kQ2xhc3MpKQoJewoJCU1lc3NhZ2VCb3goMCwgVEVYVCgiRmFpbGVkIHRvIHJlZ2lzdGVyIHdpbmRvdyBjbGFzcyIpLCBURVhUKCJFcnJvciIpLCBNQl9PSyB8IE1CX0RFRkJVVFRPTjEgfCBNQl9JQ09ORVJST1IpOwoJCXJldHVybiAxOwoJfQoJaFduZCA9IENyZWF0ZVdpbmRvdyhzekFwcE5hbWUsIFRFWFQoIkhlbGxvIFdvcmxkIFdpbjMyISEiKSwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKCQlDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAoJCU5VTEwsIE5VTEwsIGhJbnN0YW5jZSwgTlVMTCk7CglpZiAoIWhXbmQpCgl7CgkJTWVzc2FnZUJveChOVUxMLCBURVhUKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSB3aW5kb3ciKSwgVEVYVCgiV2luMzIgRXJyb3IiKSwgTUJfSUNPTkVSUk9SKTsKCQlyZXR1cm4gMTsKCX0KCVNldFRpbWVyKGhXbmQsIElEX1RJTUVSLCA0MDAsIE5VTEwpOwoKCVNob3dXaW5kb3coaFduZCwgY21kU2hvdyk7CglVcGRhdGVXaW5kb3coaFduZCk7CgoJd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpCgl7CgkJVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKCQlEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Cgl9CglyZXR1cm4gbXNnLndQYXJhbTsKfQoKTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gdywgTFBBUkFNIGwpCnsKCXN0YXRpYyBIREMgaGRjOwoJc3RhdGljIFBBSU5UU1RSVUNUIHBzOwoJc3RhdGljIFBPSU5UIGFycls1XTsKCXN0YXRpYyBpbnQgaTsKCXN0YXRpYyBSRUNUIHJlY3Q7Cglzd2l0Y2ggKG1lc3NhZ2UpCgl7CgljYXNlIFdNX0NSRUFURToKCQlHZXRDbGllbnRSZWN0KGhXbmQsICZyZWN0KTsKCQlhcnJbMF0ueCA9IDIwMDsKCQlhcnJbMF0ueSA9IDEwMDsKCQlhcnJbMV0ueCA9IDEwMDsKCQlhcnJbMV0ueSA9IDEwMDsKCQlhcnJbMl0ueCA9IDEwMDsKCQlhcnJbMl0ueSA9IDIwMDsKCQlhcnJbM10ueCA9IDIwMDsKCQlhcnJbM10ueSA9IDIwMDsKCQlhcnJbNF0ueCA9IGFyclswXS54OwoJCWFycls0XS55ID0gYXJyWzBdLnk7CgkJcmV0dXJuIDA7CgljYXNlIFdNX1RJTUVSOgoJCVJvdGF0ZShhcnIpOwoJCUludmFsaWRhdGVSZWN0KGhXbmQsICZyZWN0LCBUUlVFKTsKCQlyZXR1cm4gMDsKCWNhc2UgV01fREVTVFJPWToKCQlLaWxsVGltZXIoaFduZCwgSURfVElNRVIpOwoJCVBvc3RRdWl0TWVzc2FnZSgwKTsKCQlyZXR1cm4gMDsKCWNhc2UgV01fUEFJTlQ6CgkJaGRjID0gQmVnaW5QYWludChoV25kLCAmcHMpOwoJCU1vdmVUb0V4KGhkYywgYXJyWzBdLngsIGFyclswXS55LCBOVUxMKTsKCQlmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSBMaW5lVG8oaGRjLCBhcnJbaV0ueCwgYXJyW2ldLnkpOwoJCUVuZFBhaW50KGhXbmQsICZwcyk7CgkJcmV0dXJuIDA7CgljYXNlIFdNX1NJWkU6CgkJR2V0Q2xpZW50UmVjdChoV25kLCAmcmVjdCk7CgkJcmV0dXJuIDA7CglkZWZhdWx0OgoJCXJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHcsIGwpOwoJfQp9Cgp2b2lkIFdJTkFQSSBSb3RhdGUoUE9JTlQgYXJyWzVdKQp7CglzdGF0aWMgY29uc3QgUE9JTlQgb3JpZ2luID0geyAxNTAsIDE1MCB9OwoJc3RhdGljIGludCBpOwoJc3RhdGljIGNvbnN0IGRvdWJsZSBhbmdsZSA9IDAuMTsKCXN0YXRpYyBjb25zdCBpbnQgZGlyZWN0aW9uID0gMTsgLy8gMSBvciAtMQoJZm9yIChpID0gMDsgaSA8IDU7ICsraSkKCXsKCQlhcnJbaV0ueCAtPSBvcmlnaW4ueDsKCQlhcnJbaV0ueSAtPSBvcmlnaW4ueTsKCQlhcnJbaV0ueCA9IGFycltpXS54ICogY29zKGFuZ2xlKQkJCQkgLSBkaXJlY3Rpb24gKiBhcnJbaV0ueSAqIHNpbihhbmdsZSk7CgkJYXJyW2ldLnkgPSBkaXJlY3Rpb24gKiBhcnJbaV0ueCAqIHNpbihhbmdsZSkJICsgYXJyW2ldLnkgKiBjb3MoYW5nbGUpOwoJCWFycltpXS54ICs9IG9yaWdpbi54OwoJCWFycltpXS55ICs9IG9yaWdpbi55OwoJfQp9Cg==