0

I am learning about 2D graphics some time and I am trying to write a simple program displaying a bitmap like a sprite. I combined several codes to get this one. The application runs runs correctly (I mean it is not crashing), we can see a window, but the image is not showing.
Here is the code:

#include <stdio.h>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glext.h>
#include <GL/glu.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
GLuint LoadBMP(const char *fileName);

char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;
    MSG Msg;
    WNDCLASSEX wincl = {sizeof (WNDCLASSEX), CS_DBLCLKS, WindowProcedure, 0, 0, hThisInstance, LoadIcon (NULL, IDI_APPLICATION), LoadCursor (NULL, IDC_ARROW), (HBRUSH) COLOR_BACKGROUND, NULL, szClassName, LoadIcon (NULL, IDI_APPLICATION)};
    if (!RegisterClassEx(&wincl))
        return 0;
    hwnd = CreateWindowEx(0, szClassName, "Code::Blocks Template Windows App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL);
    ShowWindow (hwnd, nCmdShow);
            GLuint texture = LoadBMP("image.bmp");
            glEnable(GL_TEXTURE_2D);

            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
            glBindTexture(GL_TEXTURE_2D, texture);
            glBegin(GL_QUADS);
                glTexCoord2i(0, 0); glVertex2i(0, 0);
                glTexCoord2i(0, 1); glVertex2i(0, 64);
                glTexCoord2i(1, 1); glVertex2i(64, 64);
                glTexCoord2i(1, 0); glVertex2i(64, 0);
            glEnd();

            glDisable(GL_TEXTURE_2D);
    while (GetMessage (&Msg, NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

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

GLuint LoadBMP(const char *fileName)
{
    FILE *file;
    unsigned char header[54];
    unsigned int dataPos;
    unsigned int size;
    unsigned int width, height;
    unsigned char *data;
    file = fopen(fileName, "rb");
    if (file == NULL)
    {
        MessageBox(NULL, "Error: Invaild file path!", "Error", MB_OK);
        return false;
    }
    if (fread(header, 1, 54, file) != 54)
    {
        MessageBox(NULL, "Error: Invaild file!", "Error", MB_OK);
        return false;
    }
    if (header[0] != 'B' || header[1] != 'M')
    {
        MessageBox(NULL, "Error: Invaild file!", "Error", MB_OK);
        return false;
    }
    dataPos     = *(int*)&(header[0x0A]);
    size        = *(int*)&(header[0x22]);
    width       = *(int*)&(header[0x12]);
    height      = *(int*)&(header[0x16]);
    if (size == NULL)
        size = width * height * 3;
    if (dataPos == NULL)
        dataPos = 54;

    data = new unsigned char[size];

    fread(data, 1, size, file);

    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    return texture;
}

Tell me please, what I am doing wrong?

  • "The application runs runs correctly (I mean it is crashing)"...so it's *supposed* to crash? – genpfault Jun 30 '14 at 00:55
  • look here http://stackoverflow.com/a/20679773/2521214 mine simple OpenGL app in borland ... just copy the intit/exit code and change Form1->Handle to handle of your window where you want have OpenGL. App/Windw Event names are straight forward so there should not be any problems ... – Spektre Jul 02 '14 at 10:03

1 Answers1

1

You do create a Window, but you did not create an OpenGL context. You cannot use GL without a GL context. On windows, the native API to create GL contexts is wgl. This OpeGL.org wiki article explains some of the details of using wgl.

However, you might want to use some GL context and window management library, which abstracts the whole process in a platform-independent way, so that with a few calls, a GL capable window can be cretaed. Have a look at GLFW. This wiki article lists more such libraries.

derhass
  • 43,833
  • 2
  • 57
  • 78