#define WIN32_LEAN_AND_MEAN //裁剪過大的windows庫
#include "windows.h"
#include "gl\gl.h"
#include "gl\glu.h"
//#include "GLaux.h"
static LPCTSTR lpszAppName = "OpenGL App";
float angle = 0.0f;
HDC g_HDC;
//HBRUSH hBlueBrush,hRedBrush;
void SetupPixelFormat(HDC hDC)
{
int nPixelFormat; //像素格式變數
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,
};
nPixelFormat = ChoosePixelFormat(hDC,&pfd);
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
//windows事件處理器
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC;
static HDC hDC;
// char string[] = "hello world!";
int width,height;
switch(message)
{
case WM_CREATE:
hDC = GetDC(hWnd);
g_HDC = hDC;
SetupPixelFormat(hDC);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
/*MessageBox(NULL,"error5。","關閉錯誤",MB_OK | MB_ICONINFORMATION);*/
return 0;
break;
case WM_CLOSE:
wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
PostQuitMessage(0);
/* MessageBox(NULL,"error4。","關閉錯誤",MB_OK | MB_ICONINFORMATION);*/
return 0;
break;
case WM_SIZE:
height = HIWORD(lParam);
width = LOWORD(lParam);
if(height == 0)
{height = 1;}
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 1.0f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/*MessageBox(NULL,"error3。","關閉錯誤",MB_OK | MB_ICONINFORMATION);*/
return 0;
break;
/*
case WM_PAINT:
{
PAINTSTRUCT ps;
HBRUSH hOldBrush;
BeginPaint(hWnd, &ps);
hOldBrush = SelectObject(ps.hdc, hRedBrush);
Rectangle(ps.hdc, 100,100,150,150);
SelectObject(ps.hdc, hOldBrush);
EndPaint(hWnd, &ps);
}
break;
*/
default:
break;//return DefWindowProc(hWnd,message,wParam,lParam);
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
BOOL done;
/*
hBlueBrush = CreateSolidBrush(RGB(0,0,255));
hRedBrush = CreateSolidBrush(RGB(255,0,0));
*/
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW ;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszClassName = lpszAppName;
wc.lpszMenuName = NULL;
wc.hIconSm = LoadIcon(wc.hInstance,IDI_WINLOGO);
if(!RegisterClassEx(&wc))
// return 0;
{MessageBox(NULL,"error1。","關閉錯誤",MB_OK | MB_ICONINFORMATION);return 0;}
hWnd = CreateWindowEx( NULL,
lpszAppName,
"The OpenGL window Application",
//WS_EX_APPWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
100,100,
400,400,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
{
MessageBox(NULL,"error2。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
return 0;
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
done = FALSE;
while(!done)
{
PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE);
if(msg.message == WM_QUIT)
{done = TRUE;}
else
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
angle = angle + 0.1f;
if(angle >= 360.f)
angle = 0.0f;
glTranslatef(0.0f, 0.0f, -5.0f); //向后移動五個單位
glRotatef(angle, 0.0f, 0.0f, 1.0f); //繞z軸轉
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
SwapBuffers(g_HDC);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
如上,為全部代碼,運行程序中可以顯示視窗,但是沒有進行任何繪制操作,而且改變視窗大小后背景也在變化,變成全黑的了。。。到底是什么問題啊,馬上要見導師了,急急急!!!
uj5u.com熱心網友回復:
樓主,你現在畢業了嗎?但是是怎么搞定的呢?我可能和你一樣的題目,求指導
uj5u.com熱心網友回復:
搜網路教程“學OpenGL編3D游戲”。uj5u.com熱心網友回復:
參考
int WINAPI WinMain( HINSTANCE hInstance, // Instance
HINSTANCE hPrevInstance, // Previous Instance
LPSTR lpCmdLine, // Command Line Parameters
int nCmdShow) // Window Show State
{
MSG msg; // Windows Message Structure
BOOL done=FALSE; // Bool Variable To Exit Loop
// Ask The User Which Screen Mode They Prefer
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE; // Windowed Mode
}
// Create Our OpenGL Window
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0; // Quit If Window Was Not Created
}
while(!done) // Loop That Runs While done=FALSE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
{
if (msg.message==WM_QUIT) // Have We Received A Quit Message?
{
done=TRUE; // If So done=TRUE
}
else // If Not, Deal With Window Messages
{
TranslateMessage(&msg); // Translate The Message
DispatchMessage(&msg); // Dispatch The Message
}
}
else // If There Are No Messages
{
// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
if (active) // Program Active?
{
if (keys[VK_ESCAPE]) // Was ESC Pressed?
{
done=TRUE; // ESC Signalled A Quit
}
else // Not Time To Quit, Update Screen
{
// MyIdle();
DrawGLScene(); // Draw The Scene
SwapBuffers(hDC); // Swap Buffers (Double Buffering)
}
}
if (keys[VK_F1]) // Is F1 Being Pressed?
{
keys[VK_F1]=FALSE; // If So Make Key FALSE
KillGLWindow(); // Kill Our Current Window
fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0; // Quit If Window Was Not Created
}
}
}
}
// Shutdown
KillGLWindow(); // Kill The Window
return (msg.wParam); // Exit The Program
}
uj5u.com熱心網友回復:
你的 draw 功能沒錯!
int DrawGLScene1(GLvoid)// Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
g_angle += 0.1f;
if(g_angle >= 360.f) g_angle = 0.0f;
glTranslatef(0.0f, 0.0f, -5.0f); //向后移動五個單位
glRotatef(g_angle, 0.0f, 0.0f, 1.0f); //繞z軸轉
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
return TRUE;
}
uj5u.com熱心網友回復:
錯誤 在wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW ;
wc.lpfnWndProc = WndProc; 不是 DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/153526.html
