回 帖 发 新 帖 刷新版面

主题:[原创]Win32环境下OpenGL编程框架

#include <windows.h>
#include <windowsx.h>
#include <gl\gl.h>
#include <gl\glu.h>

#pragma comment(lib,"OpenGL32.lib")
#pragma comment(lib,"GLu32.lib")

TCHAR szTitle[] = TEXT("WndOpenGL");                    
TCHAR szClass[] = TEXT("WndOpenGL");    

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

    WNDCLASSEX wcex;
    HWND hwnd;
    MSG msg;    

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style            = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = NULL;
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = NULL;
    wcex.lpszMenuName    = NULL;
    wcex.lpszClassName    = szClass;
    wcex.hIconSm        = NULL;

    if(!RegisterClassEx(&wcex))
    {
        MessageBox (NULL, TEXT("Failed to Register the Window Class!"), szTitle, MB_ICONERROR);
        return 0;
    }


    hwnd = CreateWindowEx(WS_EX_APPWINDOW|WS_EX_WINDOWEDGE, 
                            szClass, 
                            szTitle, 
                            WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 
                            CW_USEDEFAULT, 
                            CW_USEDEFAULT, 
                            CW_USEDEFAULT, 
                            CW_USEDEFAULT, 
                            NULL, NULL, 
                            hInstance, 
                            NULL);
    
    if(!hwnd) return 0;
    
    ShowWindow(hwnd, SW_MAXIMIZE);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

回复列表 (共7个回复)

沙发

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PIXELFORMATDESCRIPTOR pfd;
    static BOOL bKeyState[256];
    static HDC hDC;
    static HGLRC hRC;    
    int  iPixelFormat;
    int width,height;

    switch(message)
    {
    case WM_ERASEBKGND:
        return 1;
    case WM_PAINT:
        glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glTranslatef(0.0f,0.0f,-6.0f);
        glBegin(GL_TRIANGLES);
        glColor3f(2.0f,0.0f,0.0f); 
        glVertex3f( 0.0f, 2.0f, 0.0f); 
        glColor3f(0.0f,2.0f,0.0f);
        glVertex3f(-2.0f,-2.0f, 0.0f); 
        glColor3f(0.0f,0.0f,2.0f);
        glVertex3f( 2.0f,-2.0f, 0.0f); 
        glEnd();
        SwapBuffers(hDC);
        ValidateRect(hwnd,NULL);
        return 0;
    case WM_KEYDOWN:
        bKeyState[wParam] = TRUE;
        //Add More ...
        return 0;
    case WM_KEYUP:
        bKeyState[wParam] = FALSE;
        //Add More ..
        return 0;
    case WM_SIZE:
        width = LOWORD(lParam);
        height = HIWORD(lParam);
        if(height > 0 && width > 0)
        {    
            glViewport(0,0,width,height);    
            glMatrixMode(GL_PROJECTION);                        
            glLoadIdentity();
            gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
            glMatrixMode(GL_MODELVIEW);                            
            glLoadIdentity();
        }        
        return 0;

板凳

case WM_CREATE:
        ZeroMemory(&pfd, sizeof(pfd));
        pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 32;
        pfd.iLayerType = PFD_MAIN_PLANE;
        hDC = GetDC(hwnd);
        iPixelFormat = ChoosePixelFormat(hDC, &pfd);
        if(iPixelFormat)
        {
            SetPixelFormat(hDC, iPixelFormat, &pfd);
            if(hRC = wglCreateContext(hDC))
            {
                if(wglMakeCurrent(hDC, hRC))
                {
                    glShadeModel(GL_SMOOTH);                    
                    glClearDepth(1.0f);                                    
                    glEnable(GL_DEPTH_TEST);                            
                    glDepthFunc(GL_LEQUAL);                                
                    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
                    return 0;
                }
            }
        }
        return -1;
    case WM_DESTROY:
        if(hRC)
        {
            wglMakeCurrent(NULL, NULL);            
            ReleaseDC(hwnd, hDC); 
            wglDeleteContext(hRC);
        }
        PostQuitMessage(0);
        return 0;        
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

3 楼

这个程序好长 而且没有点注释
对我们初学者的理解力估计的真的 太有点 高拉!
虽然看不懂,但是把这个程序运行后,发现有两个错误!!
(编译的时候没有问题,运行的时候才有错误的!!)
如下:Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/text1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

还有:
#pragma comment(lib,"OpenGL32.lib")
#pragma comment(lib,"GLu32.lib")
这个是什么啊?
以前程序中没有见过,希望楼主指教 

4 楼

第一个问题:你的工程建的不对,不要建控制台的工程,而要建windows的工程。
第二个问题:#pragma comment表示指定连接要使用的库

程序好长,而且没有点注释,是因为SDK方式编程,框架都一样,只要看关键的地方(设计到OpenGL函数的地方)。

5 楼

谢谢你的东西.
我是刚学OpegGL的,是在控制台下写的,现在感觉还没有入门.
不知道哪里可以找下一些类似于<<深入浅出MFC>>这样的资料或
是书呀.

6 楼

www.infoxa.com搜索一下又很多很好的

7 楼

[quote]第一个问题:你的工程建的不对,不要建控制台的工程,而要建windows的工程。
第二个问题:#pragma&nbsp;comment表示指定连接要使用的库

程序好长,而且没有点注释,是因为SDK方式编程,框架都一样,只要看关键的地方(设计到OpenGL函数的地方)。[/quote]
谢谢你的解答
现在运行通拉

我来回复

您尚未登录,请登录后再回复。点此登录或注册