int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow ) { HWND hWnd; DWORD threadID; MSG msg; if (!InitializeCriticalSectionAndSpinCount(&dbAccess, 0x00000400)) return 0; /* Create the window, 3 last parameters important */ /* The tile of the window, the callback function */ /* and the backgrond color */ hWnd = windowCreate (hPrevInstance, hInstance, nCmdShow, "Universe", MainWndProc, COLOR_WINDOW+1); /* start the timer for the periodic update of the window */ /* (this is a one-shot timer, which means that it has to be */ /* re-set after each time-out) */ /* NOTE: When this timer expires a message will be sent to */ /* our callback function (MainWndProc). */ windowRefreshTimer (hWnd, UPDATE_FREQ); /* create a thread that can handle incoming client requests */ /* (the thread starts executing in the function mailThread) */ /* NOTE: See online help for details, you need to know how */ /* this function does and what its parameters mean. */ /* We have no parameters to pass, hence NULL */ threadID = threadCreate (mailThread, NULL); /* (the message processing loop that all windows applications must have) */ /* NOTE: just leave it as it is. */ while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } DeleteCriticalSection(&dbAccess); return msg.wParam; }
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; HANDLE context; static DWORD color = 0; struct Node *iterator; switch( msg ) { /**************************************************************/ /* WM_CREATE: (received on window creation) /**************************************************************/ case WM_CREATE: hDC = GetDC(hWnd); break; /**************************************************************/ /* WM_TIMER: (received when our timer expires) /**************************************************************/ case WM_TIMER: /* NOTE: replace code below for periodic update of the window */ /* e.g. draw a planet system) */ /* NOTE: this is referred to as the 'graphics' thread in the lab spec. */ EnterCriticalSection(&dbAccess); iterator = head; while (iterator != NULL) { SetPixel(hDC, iterator->data.sx, iterator->data.sy, (COLORREF)color); color += 12; iterator = iterator->next; } LeaveCriticalSection(&dbAccess); windowRefreshTimer (hWnd, UPDATE_FREQ); break; /****************************************************************\ * WM_PAINT: (received when the window needs to be repainted, * * e.g. when maximizing the window) * \****************************************************************/ case WM_PAINT: /* NOTE: The code for this message can be removed. It's just */ /* for showing something in the window. */ context = BeginPaint( hWnd, &ps ); /* (you can safely remove the following line of code) */ //TextOut( context, 10, 10, "Hello, World!", 13 ); /* 13 is the string length */ EndPaint( hWnd, &ps ); break; /**************************************************************\ * WM_DESTROY: PostQuitMessage() is called * * (received when the user presses the "quit" button in the * * window) * \**************************************************************/ case WM_DESTROY: PostQuitMessage( 0 ); /* NOTE: Windows will automatically release most resources this */ /* process is using, e.g. memory and mailslots. */ /* (So even though we don't free the memory which has been*/ /* allocated by us, there will not be memory leaks.) */ ReleaseDC(hWnd, hDC); /* Some housekeeping */ break; /**************************************************************\ * Let the default window proc handle all other messages * \**************************************************************/ default: return( DefWindowProc( hWnd, msg, wParam, lParam )); } return 0; }
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; HANDLE context; static DWORD color = 0; static DWORD colors[5]; switch( msg ) { /**************************************************************/ /* WM_CREATE: (received on window creation) /**************************************************************/ case WM_CREATE: hDC = GetDC(hWnd); break; /**************************************************************/ /* WM_TIMER: (received when our timer expires) /**************************************************************/ case WM_TIMER: /* NOTE: replace code below for periodic update of the window */ /* e.g. draw a planet system) */ /* NOTE: this is referred to as the 'graphics' thread in the lab spec. */ //Creating a simple color-array. colors[0] = RGB(255, 0, 0); colors[1] = RGB(0, 255, 0); colors[2] = RGB(0, 0, 255); colors[3] = RGB(255, 255, 0); colors[4] = RGB(255, 153, 0); //Critical section so we don't get messy pointers EnterCriticalSection(&criticalSection); int i; planet_type *traverser = database; //A loop to draw all the planets with different colors. if (traverser != 0) { i = 0; while (traverser != 0) { i %= 5; SetPixel(hDC, traverser->sx, traverser->sy, (COLORREF)colors[i]); //FATTEN LINES SetPixel(hDC, traverser->sx + 1, traverser->sy, (COLORREF)colors[i]); SetPixel(hDC, traverser->sx, traverser->sy + 1, (COLORREF)colors[i]); SetPixel(hDC, traverser->sx + 1, traverser->sy + 1, (COLORREF)colors[i]); traverser = traverser->next; i++; } } LeaveCriticalSection(&criticalSection); windowRefreshTimer (hWnd, UPDATE_FREQ); break; /****************************************************************\ * WM_PAINT: (received when the window needs to be repainted, * * e.g. when maximizing the window) * \****************************************************************/ case WM_PAINT: /* NOTE: The code for this message can be removed. It's just */ /* for showing something in the window. */ context = BeginPaint( hWnd, &ps ); /* (you can safely remove the following line of code) */ TextOut( context, 10, 10, "Solar System", 13 ); /* 13 is the string length */ EndPaint( hWnd, &ps ); break; /**************************************************************\ * WM_DESTROY: PostQuitMessage() is called * * (received when the user presses the "quit" button in the * * window) * \**************************************************************/ case WM_DESTROY: PostQuitMessage( 0 ); /* NOTE: Windows will automatically release most resources this */ /* process is using, e.g. memory and mailslots. */ /* (So even though we don't free the memory which has been*/ /* allocated by us, there will not be memory leaks.) */ ReleaseDC(hWnd, hDC); /* Some housekeeping */ break; /**************************************************************\ * Let the default window proc handle all other messages * \**************************************************************/ default: return( DefWindowProc( hWnd, msg, wParam, lParam )); } return 0; }