Hello Guest, please login or register.
Did you miss your activation email?
Login with username, password and session length.

Pages: [1]   Go Down

Author Topic: wglCreateContext() not working >_>  (Read 1606 times)

0 Members and 1 Guest are viewing this topic.
wglCreateContext() not working >_>
« on: August 05, 2008, 08:56:26 pm »
  • Doesn't afraid of anything
  • *
  • Reputation: +42/-0
  • Offline Offline
  • Gender: Male
  • Posts: 7002
I've run into a bit of a runtime issue.  There's no errors or anything, I just get a nice empty window.

main.cpp
Code: [Select]
#define WIN32_LEAN_AND_MEAN
#include "Windows_Main.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwnd;
MSG msg;
bool done;

MainWin = HVSTWIN::SetupWin(CS_HREDRAW | CS_VREDRAW,
0, 0,
(HBRUSH)GetStockObject(WHITE_BRUSH),
(LPCWSTR)"Harvest SDK 1.0",
(LPCWSTR) "HVSTWIN",
hInstance);

HVSTMATH::CCoordinate Coords[4];
Coords[0].X = 1;
Coords[0].Y = 1;
Coords[0].Z = 0;

Coords[1].X = 1;
Coords[1].Y = -1;
Coords[1].Z = 0;

Coords[2].X = -1;
Coords[2].Y = -1;
Coords[2].Z = 0;

Coords[3].X = -1;
Coords[3].Y = 1;
Coords[3].Z = 0;

if (!RegisterClassEx(&MainWin))
return 0;

hwnd = CreateWindowEx(NULL,
  (LPCWSTR)"HVSTWIN",
  (LPCWSTR)"Harvest SDK 1.0",
  WS_OVERLAPPEDWINDOW |
  WS_VISIBLE |
  WS_SYSMENU,
  100, 100,
  400, 400,
  NULL,
  NULL,
  hInstance,
  NULL);

if (!hwnd){
return 0;
}

if (!hrc){
MessageBox(hwnd,(LPCWSTR)"Error with hrc!", NULL, MB_OK);
return 0;
}

done = false;

//main loop
while (!done)
{
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

if (msg.message == WM_QUIT)
{
done = true;
}
else
{
HVSTGL::RenderQuad(Coords[0], Coords[1], Coords[2], Coords[3]);
SwapBuffers(g_HDC);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return msg.wParam;
}

windowsmain.h
Code: [Select]
#ifndef _H_WINDOWS_MAIN_
#define _H_WINDOWS_MAIN_
#include "command.h"


//list of windows we want to use
static WNDCLASSEX MainWin;
static WNDCLASSEX ConsoleWin;

static HDC hdc;
static HGLRC hrc;
static HDC g_HDC;
static int width, height;

static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
g_HDC = hdc;
HVSTGL::createPixelFormat(hdc);

hrc = wglCreateContext(hdc);
GetLastError();
wglMakeCurrent(hdc, hrc);

glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_TEXTURE_2D);


return 0;
break;

case WM_CLOSE:
glDisable(GL_TEXTURE_2D);
wglMakeCurrent(hdc, NULL);
wglDeleteContext(hrc);

PostQuitMessage(0);

return 0;
break;

case WM_SIZE:
height = HIWORD(lParam);
width = LOWORD(lParam);

if (height==0)
height = 1;

glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 1.0f, 1000.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

return 0;
break;


default:
break;
}

return (DefWindowProc(hwnd, message, wParam, lParam));
}

namespace HVSTWIN
{
WNDCLASSEX SetupWin( UINT style,
int classInfo,
int winInfo,
HBRUSH BG,
LPCTSTR winName,
LPCTSTR className,
HINSTANCE hInstance);
};

#endif

windowsmain.cpp
Code: [Select]
#include "Windows_Main.h"

WNDCLASSEX HVSTWIN::SetupWin(UINT style, int classInfo, int winInfo, HBRUSH BG, LPCTSTR winName, LPCTSTR className, HINSTANCE hInstance)
{
WNDCLASSEX tempWin;

tempWin.cbSize = sizeof(WNDCLASSEX);
tempWin.style = style;
tempWin.lpfnWndProc = WndProc;
tempWin.cbClsExtra = classInfo;
tempWin.cbWndExtra = winInfo;
tempWin.hInstance = hInstance;
tempWin.hIcon = NULL;
tempWin.hCursor = LoadCursor(NULL, IDC_ARROW);
tempWin.hbrBackground = BG;
tempWin.lpszMenuName = winName;
tempWin.lpszClassName = className;
tempWin.hIconSm = NULL;

return tempWin;
}

glmain.h
Code: [Select]
#ifndef _H_GLMAIN_
#define _H_GLMAIN_

#include <windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include "TGAExt.h"
#include "Math_Main.h"
#include "HarvestIO.h"

namespace HVSTGL
{
void createPixelFormat(HDC& hDC);

static void RenderQuad(HVSTMATH::CCoordinate Coord1, HVSTMATH::CCoordinate Coord2,
HVSTMATH::CCoordinate Coord3, HVSTMATH::CCoordinate Coord4)
{
glBegin(GL_QUADS);
glVertex3d(Coord1.X, Coord1.Y, Coord1.Z);
glVertex3d(Coord2.X, Coord2.Y, Coord2.Z);
glVertex3d(Coord3.X, Coord3.Y, Coord3.Z);
glVertex3d(Coord4.X, Coord4.Y, Coord4.Z);
glEnd();

glFlush();
}

void RenderQuad (double coord1x, double coord1y, double coord1z,
double coord2x, double coord2y, double coord2z,
double coord3x, double coord3y, double coord3z,
double coord4x, double coord4y, double coord4z);

static void RenderTexQuad(HVSTMATH::CCoordinate Coord1, HVSTMATH::CCoordinate Coord2,
HVSTMATH::CCoordinate Coord3, HVSTMATH::CCoordinate Coord4)
{
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex3d(Coord1.X, Coord1.Y, Coord1.Z);
glTexCoord2d(1.0, 0.0); glVertex3d(Coord2.X, Coord2.Y, Coord2.Z);
glTexCoord2d(1.0, 1.0);glVertex3d(Coord3.X, Coord3.Y, Coord3.Z);
glTexCoord2d(0.0, 1.0);glVertex3d(Coord4.X, Coord4.Y, Coord4.Z);
glEnd();

glFlush();
}

char* LoadBMP(char* fileName, BITMAPINFOHEADER * bitmapinfoheader);
int LoadTGA(char* fileName, TGAFILE* tgaFile);
void PrepareTexture(char* texels);



};
#endif

glmain.cpp
Code: [Select]
#include "GLMain.h"

void HVSTGL::createPixelFormat(HDC& hDC)
{
int pxlfmt;

static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0,0,0,0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0 };

pxlfmt = ChoosePixelFormat(hDC, &pfd);

SetPixelFormat(hDC, pxlfmt, &pfd);
}

void HVSTGL::RenderQuad (double coord1x, double coord1y, double coord1z,
double coord2x, double coord2y, double coord2z,
double coord3x, double coord3y, double coord3z,
double coord4x, double coord4y, double coord4z)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glVertex3d(coord1x, coord1y, coord1z);
glVertex3d(coord2x, coord2y, coord2z);
glVertex3d(coord3x, coord3y, coord3z);
glVertex3d(coord4x, coord4y, coord4z);
glEnd();

glFlush();
}

char* HVSTGL::LoadBMP(char* fileName, BITMAPINFOHEADER* bitmapinfoheader)
{
std::ifstream file;
BITMAPFILEHEADER* bitmapfileheader;
char* BMPimage;
int ImageIDx = 0;
unsigned char tempRGB;

//open file
HVSTIO::fileOpen(file, fileName);

//start reading that data!
file.read((char*)&bitmapfileheader,sizeof(BITMAPFILEHEADER));

if (bitmapfileheader->bfType != 0x4D42)
return NULL;

file.read((char*)&bitmapfileheader, sizeof(BITMAPFILEHEADER));

BMPimage = new char[bitmapinfoheader->biSizeImage];

if (!BMPimage)
{
delete BMPimage;
return NULL;
}

file.read((char*)&BMPimage, bitmapinfoheader->biSizeImage);

if (BMPimage == NULL)
{
HVSTIO::fileClose(file);
return NULL;
}

//switch R and G values so that they're you know..not in a retarded order
for (ImageIDx = 0; ImageIDx < bitmapinfoheader->biSizeImage; ImageIDx += 3)
{
tempRGB = BMPimage[ImageIDx];
BMPimage[ImageIDx] = BMPimage[ImageIDx + 2];
BMPimage[ImageIDx + 2] = tempRGB;
}

HVSTIO::fileClose(file);
return BMPimage;
}

int HVSTGL::LoadTGA(char* fileName, TGAFILE* tgaFile)
{
std::ifstream file;
unsigned char garbagechar;
short int garbageint;
long imagesize;
int colormode;
long ImageIDx;
unsigned char colorswap;

HVSTIO::fileOpen(file, fileName);

file.read((char*)&garbagechar, sizeof(unsigned char));
file.read((char*)&garbagechar, sizeof(unsigned char));

file.read((char*)&tgaFile->imageTypeCode, sizeof (unsigned char));

if ((tgaFile->imageTypeCode !=2) && (tgaFile->imageTypeCode != 3))
{
HVSTIO::fileClose(file);
return 0;
}

file.read((char*)&garbageint, sizeof (short int));
file.read((char*)&garbageint, sizeof (short int));
file.read((char*)&garbagechar, sizeof (unsigned char));
file.read((char*)&garbageint, sizeof (short int));

file.read((char*)&tgaFile->imageWidth, sizeof (short int));
file.read((char*)&tgaFile->imageHeight, sizeof (short int));

file.read((char*)&tgaFile->bitCount, sizeof (unsigned char));

file.read((char*)&garbagechar, sizeof (unsigned char));

colormode = tgaFile->bitCount / 8;
imagesize = tgaFile->imageWidth * tgaFile->imageHeight * colormode;

tgaFile->imageData = new unsigned char[sizeof(unsigned char)*imagesize];

file.read((char*)&tgaFile->imageData, sizeof(tgaFile->imageData));

for (ImageIDx = 0; ImageIDx < imagesize; ImageIDx += colormode)
{
colorswap = tgaFile->imageData[ImageIDx];
tgaFile->imageData[ImageIDx] = tgaFile->imageData[ImageIDx + 2];
tgaFile->imageData[ImageIDx + 2] = colorswap;
}

HVSTIO::fileClose(file);

return 1;
}



I know it's hrc that isn't working right with wglCreateContext because of the error flag I have in winmain.  So um...yea, why isn't it creating the render context properly? >_>
Logged



i love big weenies and i cannot lie
Re: wglCreateContext() not working >_>
« Reply #1 on: August 05, 2008, 09:02:15 pm »
  • The devil in the mirror.
  • *
  • Reputation: +0/-0
  • Offline Offline
  • Gender: Male
  • Posts: 238
I don't have TOO much experience with Windows API(Just started using it myself) so I'm mostly guessing here.
Is "WM_CREATE" called before, inside or after CreateWindowEx? I know that it's what sends the message, but you use it's return value on hdc = GetDC(hwnd), so maybe the returned DC is invalid in some way?

As I said, not too much experience on this myself, so just trowing out some ideas =P

EDIT: I do believe I'm correct:
Quote from: MSDN
The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.)
« Last Edit: August 05, 2008, 09:05:16 pm by wildex999 »
Logged
Working on my Masters Degree in Computer Science.
Hey look, Zelda Coop....later.
Proud user of C++ for 9 years, and counting!
Re: wglCreateContext() not working >_>
« Reply #2 on: August 06, 2008, 04:28:49 pm »
  • Doesn't afraid of anything
  • *
  • Reputation: +42/-0
  • Offline Offline
  • Gender: Male
  • Posts: 7002
So, what you're saying is, hdc is actually where the problem is, which in turn, is causing hrc so have a problem?
Logged



i love big weenies and i cannot lie
Re: wglCreateContext() not working >_>
« Reply #3 on: August 06, 2008, 04:53:57 pm »
  • The devil in the mirror.
  • *
  • Reputation: +0/-0
  • Offline Offline
  • Gender: Male
  • Posts: 238
I'm saying hwnd might be different when you call GetDC(hwnd); because hwnd = CreateWindowEx has not yet returned. I'm not sure how it works =/
Logged
Working on my Masters Degree in Computer Science.
Hey look, Zelda Coop....later.
Proud user of C++ for 9 years, and counting!
Re: wglCreateContext() not working >_>
« Reply #4 on: August 06, 2008, 05:06:11 pm »
  • Doesn't afraid of anything
  • *
  • Reputation: +42/-0
  • Offline Offline
  • Gender: Male
  • Posts: 7002
oh...hmm..

Infini, get your ass in here! XD
Logged



i love big weenies and i cannot lie
Re: wglCreateContext() not working >_>
« Reply #5 on: August 06, 2008, 06:47:55 pm »
  • *
  • Reputation: +3/-0
  • Offline Offline
  • Gender: Male
  • Posts: 6629
Bah to much code, don't want to look through it all at the moment;

Couple of fast solutions;

1. Copy code from zfgsdk :D.
2. Gimmie the result of http://msdn.microsoft.com/en-us/library/ms679360(VS.85).aspx at the point your code fails and I'll see if I can help.
Logged
Re: wglCreateContext() not working >_>
« Reply #6 on: August 07, 2008, 12:56:49 am »
  • *
  • Reputation: +0/-0
  • Offline Offline
  • Posts: 256
wglCreateContext() works fine.

The way you've got everything set up with the static variables Windows_Main.h is... interesting, to say the least.

Hm. I'm not sure why it's happening the way it does, but when you try to access hrc from main.cpp, it doesn't like to see it.

However, I put the line: 'hrc = wglGetCurrentContext()' above the check you're doing in main.cpp, and it gets the same context that was created in your wndproc. This shouldn't have to happen.

I'm cant explain exactly what happens, but when the WM_CREATE message gets sent, the rendering context gets created just fine, and every time I hit a breakpoint in the wndproc, it sits unchanged. Though back in main, by time CreateWindowEx() returns, hrc seems to be NULL. (Further, the same thing seems to happen with 'hdc'.)

The structure of everything with these static variables in the header is very odd.

I fixed it, and here's what I did:

Removed the keyword 'static' from all the variable declarations.
Moved the WndProc() from the header, to Windows_Main.cpp.
Moved HDC hdc, HGLRC hrc, and the two windows classes to the global space in main.cpp.
Moved int height, width into the WndProc function.
In the WndProc, at the top:
Code: [Select]
extern HDC hdc;
extern HGLRC hrc;

I'm pretty sure those are the only changes I made. Let me know if that works for you.

Edit:

Also, if you handle "WM_CLOSE", you're expected to call DestroyWindow(). (http://msdn.microsoft.com/en-us/library/ms632617(VS.85).aspx)

Also:
I'm saying hwnd might be different when you call GetDC(hwnd); because hwnd = CreateWindowEx has not yet returned. I'm not sure how it works =/

Nah. They're not gonna switch up the HWND on you, even if it's all during the creation of the window. Once you get the WM_CREATE message, that handle to the window is valid, and will remain valid.
« Last Edit: August 07, 2008, 05:06:38 am by nitz »
Logged
  • My Myspace?
Re: wglCreateContext() not working >_>
« Reply #7 on: August 07, 2008, 04:13:34 pm »
  • Doesn't afraid of anything
  • *
  • Reputation: +42/-0
  • Offline Offline
  • Gender: Male
  • Posts: 7002
Seems to be working now, thanks ^^  ..Now I just need to figure out why openGL won't render anything >_>  I'll save that for another time, though.
Logged



i love big weenies and i cannot lie
Pages: [1]   Go Up

 


Contact Us | Legal | Advertise Here
2013 © ZFGC, All Rights Reserved



Page created in 0.025 seconds with 67 queries.