Bitmap Question

Started by
1 comment, last by iNsAn1tY 16 years, 10 months ago
Here's my problem.I have a class called Texture(sorta misleading as this my program is only a bitmap example). Anyway I have the bmp loading code as follows: class Texture { public: unsigned char * data; int width,height,bits; GLuint colortype; Texture(); ~Texture(); Texture(string fp); }; Texture::Texture(string fp) { BITMAPINFOHEADER info; BITMAPFILEHEADER header; int imageIdx; RGBQUAD tempRGB; FILE * datafile = fopen(fp.c_str(),"rb"); fread(&header,sizeof(BITMAPFILEHEADER),1,datafile); if(header.bfType != 19778) { fclose(datafile); datafile = NULL; } else { DWORD size = header.bfSize - header.bfOffBits; fread(&info,sizeof(BITMAPINFOHEADER),1,datafile); fseek(datafile,header.bfOffBits,SEEK_SET); data = new unsigned char[size]; fread(data,1,size,datafile); if(!data) { MessageBox(NULL,"Bitmap loading error.","Error!",MB_OK); }; for(imageIdx = 0;imageIdx < info.biSizeImage;imageIdx += 3) { tempRGB.rgbBlue = data[imageIdx]; data[imageIdx] = data[imageIdx + 2]; data[imageIdx + 2] = tempRGB.rgbBlue; }; fclose(datafile); datafile = NULL; width = info.biWidth; height = info.biHeight; bits = info.biBitCount; colortype = GL_RGB; }; }; The following are all declared globally: HDC hDC; HGLRC hRC; HWND hWnd; Texture texture("il.bmp"); My Window Procedure is defined as follows: LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_CREATE: { SetupOpenGL(800,600,hwnd,hDC,hRC); break; }; case WM_PAINT: { DrawTexture(); SwapBuffers(hDC); break; }; case WM_CLOSE: { wglMakeCurrent(hDC,NULL); if(!wglDeleteContext(hRC)) { MessageBox(NULL,"HRC deletion error.","Error!",MB_OK); }; wglMakeCurrent(NULL,NULL); ReleaseDC(hwnd,hDC); DestroyWindow(hwnd); break; }; case WM_DESTROY: { PostQuitMessage(0); break; }; default: return DefWindowProc(hwnd,msg,wParam,lParam); }; return 0; }; For those of you who love torture, this is the SetupOpenGL function: void SetupOpenGL(int width,int height,HWND &hwnd,HDC &hdc,HGLRC &hrc) { hdc = GetDC(hwnd); if(!hdc) { MessageBox(NULL,"HDC get error.","Error!",MB_OK); }; PIXELFORMATDESCRIPTOR pfd; memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR)); pfd.iLayerType = PFD_MAIN_PLANE; pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iLayerType = PFD_MAIN_PLANE; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); int pf = ChoosePixelFormat(hdc,&pfd); if(!SetPixelFormat(hdc,pf,&pfd)) { MessageBox(NULL,"PFD creation error.","Error!",MB_OK); }; hrc = wglCreateContext(hdc); if(!hrc) { MessageBox(NULL,"HRC creation error.","Error!",MB_OK); }; wglMakeCurrent(hdc,hrc); glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-2.0,2.0,-2.0,2.0,1.0,1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); SwapBuffers(hdc); }; Not very neat sorry...anyway WinMain is up next: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { char * cn = "My Window Class"; MSG Msg; WNDCLASSEX wc; memset(&wc,0,sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = cn; wc.lpszMenuName = NULL; RegisterClassEx(&wc); hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,cn,"My Window",WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }; Now when I compile I get no errors. I run the program and I get a black window but no texture.I'm sure the texture is in the project folder.I'm sure the texture is a bitmap.I'm sure I spelt the darn thing correctly! Nothing is showing. Can someone please help me? Thanks in advance.
Advertisement
I forgot one thing, I use the following in DrawTexture().

void DrawTexture()
{
glRasterPos2i(150,200); glDrawPixels(texture.width,texture.height,texture.colortype,GL_UNSIGNED_BYTE,texture.data);
};

Sorry if all this seems like a code dump, but this was probably the best way to explain it. I've tried changing glClearColor from black(not working), I've tried changing the HBRUSH color(works).Dunno what to do now.
Hi, if you edit your posts, then copy and paste your code again between [source] ... [/source] tags, it will retain the formatting and tabs, and will be colour-coded for C++. This makes it a lot easier to read, and a lot easier to diagnose your problem.

EDIT: had a quick look over your code; have you tried forcing your window to repaint itself? Moved it, resized it, minimized or maximized it? Sounds silly, but it could be that no WM_PAINT message is sent, so your DrawTexture function is never called. Also, try commenting out that call to glRasterPos2i, and see if that has any effect. Finally, have you stepped through with the debugger? Put breakpoints on important steps in your bitmap loading code, make sure it's actually doing what you think it's doing...
My opinion is a recombination and regurgitation of the opinions of those around me. I bring nothing new to the table, and as such, can be safely ignored.[ Useful things - Firefox | GLee | Boost | DevIL ]

This topic is closed to new replies.

Advertisement