Home Step1 Step2 Step3 Step4 Step5
So you want to be a programmer...
Making a Great Circle Map program for Windows.


Introduction

Welcome! Many people have during the years asked for the source code for my Visual Basic program called GCMWin. I have shared it with several programmers, but I am not particularly proud of the source and it is fast getting outdated since it is written for Windows 3.1. Here you can follow my programming in C (And possibly some snippets of C++) of the GcmWin program for Windows 95/98 and newer.

In the last couple of years the freeware community has released several compilers and front ends. The one I like the most is nowadays Codeblocks. It is a front end for the MingW compiler. You can download it here. Be sure to download the full version including the Mingw compiler.
I may warn you that  C and C++ are not the easiest languages to start with. Buy a good book and/or read some tutorials on the net! I will comment the code as much as I can, but I will not teach you programming from the ground up!

This is how Codeblocks looks when you start it.

You can open an old project or start a new.

This is how it looks when you have opened or created a project.
You have all the source files in the left pane and source code to the right.
Below you have a status window where messages from the compiler and linker shows.

Now you got a very powerful compiler. You can make console (runnable in a "dos" window) programs, or full fledged windows programs with toolbars, statusbars, dialogs and menus.

Lets start!

First we need to test the compiler. We start with a simple window with no functionality at all.
Download the source and projectfile.

  1. Unzip in a directory (no spaces in directory names please)
  2. Start Codeblocks.
  3. Choose CTRL+O or File/Open and select Step1.cbp
#include <windows.h>


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";


int WINAPI 
WinMain (HINSTANCE hThisInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpszArgument, 
        int cmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, cmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


If this compiles with no problems - Congratulations! You are now a Windows programmer!

 

Well, not much of a program eh?

At least you can close/minimize/maximize the window.

By changing the source you can change the size of the window, the placement, window title, icon, cursor etc. Take look in the Win32Api help file and search for LoadIcon, LoadCursor, RegisterClassEx / WNDCLASSEX.

If you got problems - look in the Forum for Codeblocks and don't forget to search the Forum first. Almost all "newbie" problems has been covered before.

Start Step 2