Monday, February 6, 2017

CLion + Win32

cmake_minimum_required(VERSION 3.6)
project(untitled4)

set(CMAKE_CXX_STANDARD 14)

#include_directories(${PROJECT_SOURCE_DIR}/INC)
#link_directories(${PROJECT_SOURCE_DIR}/LIB)

set(SOURCE_FILES main.cpp defines.h)
add_executable(untitled4 ${SOURCE_FILES})
target_link_libraries(untitled4 winmm.lib)

#target_link_libraries(untitled4 SDL2.lib SDL2main.lib)
 
defines.h

#ifndef DEFINES_H
#define DEFINES_H

#define WINDOW_WIDTH  400
#define WINDOW_HEIGHT 400

#define RADIUS        10
#define NUM_BALLS     15
#define MAX_VELOCITY  3

#define FRAMES_PER_SECOND 60

#endif
 
 
main.cpp
 
#include <windows.h>   
#include "defines.h"

//--------------------------------- Globals ------------------------------   
//   
//------------------------------------------------------------------------   

char* g_szApplicationName = "HelloWorld4";
char*   g_szWindowClassName = "MyWindowClass";

//---------------------------- WindowProc ---------------------------------   
//     
//  This is the callback function which handles all the windows messages   
//-------------------------------------------------------------------------   

LRESULT CALLBACK WindowProc (HWND   hwnd,
                             UINT   msg,
                             WPARAM wParam,
                             LPARAM lParam)
{

    switch (msg)
    {

        //A WM_CREATE msg is sent when your application window is first   
        //created   
        case WM_CREATE:
        {
            PlaySound("window_open.wav", NULL, SND_FILENAME | SND_ASYNC);
        }

            break;

        case WM_KEYUP:
        {
            switch(wParam)
            {
                case VK_ESCAPE:
                {
                    PostQuitMessage(0);
                }
                    break;
            }
        }


        case WM_PAINT:
        {
            PAINTSTRUCT ps;

            BeginPaint (hwnd, &ps);

            //**this is where we do any drawing to the screen**

            EndPaint (hwnd, &ps);
        }

            break;

        case WM_DESTROY:
        {
            // kill the application, this sends a WM_QUIT message
            PostQuitMessage (0);
        }

            break;


    }//end switch

    //this is where all the messages not specifically handled by our
    //winproc are sent to be processed
    return DefWindowProc (hwnd, msg, wParam, lParam);
}

//-------------------------------- WinMain -------------------------------   
//   
//  The entry point of the windows program   
//------------------------------------------------------------------------   
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     szCmdLine,
                    int       iCmdShow)
{
    //handle to our window
    HWND                       hWnd;

    //our window class structure
    WNDCLASSEX     winclass;

    // first fill in the window class stucture
    winclass.cbSize        = sizeof(WNDCLASSEX);
    winclass.style         = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc   = WindowProc;
    winclass.cbClsExtra    = 0;
    winclass.cbWndExtra    = 0;
    winclass.hInstance     = hInstance;
    winclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
    winclass.lpszMenuName  = NULL;
    winclass.lpszClassName = g_szWindowClassName;
    winclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    //register the window class
    if (!RegisterClassEx(&winclass))
    {
        MessageBox(NULL, "Registration Failed!", "Error", 0);

        //exit the application
        return 0;
    }

    //create the window and assign its ID to hwnd
    hWnd = CreateWindowEx (NULL,                 // extended style
                           g_szWindowClassName,  // window class name
                           g_szApplicationName,  // window caption
                           WS_OVERLAPPEDWINDOW,  // window style
                           0,                    // initial x position
                           0,                    // initial y position
                           WINDOW_WIDTH,         // initial x size
                           WINDOW_HEIGHT,        // initial y size
                           NULL,                 // parent window handle
                           NULL,                 // window menu handle
                           hInstance,            // program instance handle
                           NULL);                // creation parameters

    //make sure the window creation has gone OK
    if(!hWnd)
    {
        MessageBox(NULL, "CreateWindowEx Failed!", "Error!", 0);
    }

    //make the window visible
    ShowWindow (hWnd, iCmdShow);
    UpdateWindow (hWnd);

    //this will hold any windows messages
    MSG msg;

    //entry point of our message handler
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }

    return msg.wParam;
}