游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2762|回复: 3

[求助]Nehe第一课, 我自己写出来的程序的标题栏竟然无效,

[复制链接]

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2007-9-17 17:20:00 | 显示全部楼层 |阅读模式
移动, 双击, 右上角的3个按钮全部不管用.
下面是我的代码, 稍微不同, 但实际是一样的.
---------------------------------------------------------------------------------
// first.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "second.h"

#define MAX_LOADSTRING 100

//gl vars
HGLRC        hRC = NULL;
HDC                hDC = NULL;
HWND        hWnd = NULL;

bool        keys[256];
bool        fActive = true;
bool        fFullScreen = true;
//end of gl vars

// Global Variables:
HINSTANCE hInst;                                                                // current instance


// Forward declarations of functions included in this code module:
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);

//gl resize scene
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{
        if (height == 0)
                height = 1;

        glViewport(0, 0, width, height);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1, 100.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

//init gl
int InitGL(GLvoid)
{
        glShadeModel(GL_SMOOTH);

        glClearColor(0.0, 0.0, 0.0, 0.5);
        glClearDepth(1.0f);

        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);

        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

        return -1;
}

//gl draw scene
int DrawGLScene(GLvoid)
{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();

        return -1;
}

//kill window
GLvoid KillGLWindow(GLvoid)
{
        if (fFullScreen)
        {
                ChangeDisplaySettings(NULL, 0);
                ShowCursor(true);
        }

        if (hRC)
        {
                if (!wglMakeCurrent(NULL, NULL))
                        MessageBox(NULL, _T("release DC or RC failed."), _T("close error"), MB_OK | MB_ICONEXCLAMATION);
       
                if (!wglDeleteContext(hRC))
                        MessageBox(NULL, _T("delete DC or RC failed."), _T("close error"), MB_OK | MB_ICONEXCLAMATION);

                hRC = NULL;
        }

        if (hDC && !ReleaseDC(hWnd, hDC))
        {
                MessageBox(NULL, _T("Release DC failed."), _T("close error"), MB_OK | MB_ICONEXCLAMATION);
                hDC = NULL;
        }

        if (hWnd && !DestroyWindow(hWnd))
        {
                MessageBox(NULL, _T("release window's handle failed."), _T("close error"), MB_OK | MB_ICONEXCLAMATION);
                hWnd = NULL;
        }

        if (!UnregisterClass(_T("OpGL"), hInst))
        {
                MessageBox(NULL, _T("cann't unregister window class"), _T("close error"), MB_OK | MB_ICONEXCLAMATION);
                hInst = NULL;
        }
}

bool CreateGLWindow(TCHAR* title, int width, int height, int bits, bool fFullScrn)
{
        GLuint                PixelFormat;
        WNDCLASS        wc;
        DWORD                dwExStyle;
        DWORD                dwStyle;
        RECT                wndRect;

        wndRect.left = (long)0;
        wndRect.right = (long)width;
        wndRect.top = (long)0;
        wndRect.bottom = (long)height;

        fFullScreen = fFullScrn;

        hInst = GetModuleHandle(NULL);
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        wc.lpfnWndProc = (WNDPROC)WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInst;
        wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = NULL;
        wc.lpszMenuName = NULL;
        wc.lpszClassName = _T("OpGL");

        if (!RegisterClass(&wc))
        {
                MessageBox(NULL, _T("register window class failed!"), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
                return false;
        }

        if (fFullScreen)
        {
                DEVMODE dmScreenSettings;

                memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
                dmScreenSettings.dmSize = sizeof(dmScreenSettings);
                dmScreenSettings.dmPelsWidth = width;
                dmScreenSettings.dmPelsHeight = height;
                dmScreenSettings.dmBitsPerPel = bits;
                dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

                if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
                {
                        if (MessageBox(NULL, _T("setting fullscreen at this vidio adapter failed! \nuse window mode?"), _T("fullscreen failed"), MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
                                fFullScreen = false;
                        else
                        {
                                MessageBox(NULL, _T("the program will be closed."), _T("Info"), MB_OK | MB_ICONINFORMATION);
                               
                                return false;
                        }
                }
        }

        if (fFullScreen)
        {
                dwExStyle = WS_EX_APPWINDOW;
                dwStyle = WS_POPUP;
                ShowCursor(false);
        }
        else
        {
                dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
                dwStyle = WS_OVERLAPPEDWINDOW;
        }

        AdjustWindowRectEx(&wndRect, dwStyle, false, dwExStyle);

        if (!(hWnd = CreateWindowEx(dwExStyle,
                                                                _T("OpGL"),
                                                                title,
                                                                dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
                                                                0, 0,
                                                                width,
                                                                height,
                                                                NULL,
                                                                NULL,
                                                                hInst,
                                                                NULL)))
        {
                KillGLWindow();
                MessageBox(NULL, _T("create window failed."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

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

        if (!(hDC = GetDC(hWnd)))
        {
                KillGLWindow();
                MessageBox(NULL, _T("cannot get DC."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

        if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
        {
                KillGLWindow();
                MessageBox(NULL, _T("cannot get matched pfd."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

        if (!SetPixelFormat(hDC, PixelFormat, &pfd))
        {
                KillGLWindow();
                MessageBox(NULL, _T("cannot set pfd."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

        if (!(hRC = wglCreateContext(hDC)))
        {
                KillGLWindow();
                MessageBox(NULL, _T("creat GLRC failed."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

        if (!wglMakeCurrent(hDC, hRC))
        {
                KillGLWindow();
                MessageBox(NULL, _T("active current GLRC failed."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

        ShowWindow(hWnd, SW_SHOW);
        SetForegroundWindow(hWnd);
        SetFocus(hWnd);
        ReSizeGLScene(width, height);

        if (!InitGL())
        {
                KillGLWindow();
                MessageBox(NULL, _T("Init GL failed."), _T("Error"), MB_OK | MB_ICONSTOP);

                return false;
        }

        return true;
}


//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND        - process the application menu
//  WM_PAINT        - Paint the main window
//  WM_DESTROY        - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_ACTIVATE:
                if (!HIWORD(wParam))
                        fActive = true;
                else
                        fActive = false;
                break;
        case WM_SYSCOMMAND:
                switch (wParam)
                {
                case SC_SCREENSAVE:
                case SC_MONITORPOWER:
                        break;
                }
                break;
        case WM_KEYDOWN:
                keys[wParam] = true;
                break;
        case WM_KEYUP:
                keys[wParam] = false;
                break;
        case WM_SIZE:
                ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));
                break;
//        case WM_DESTROY:
        case WM_CLOSE:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.
        MSG                msg;
        bool        fDone = false;


        if (MessageBox(NULL, _T("fullscreen or not?"), _T("set screen mode"), MB_YESNO | MB_ICONQUESTION) == IDNO)
                fFullScreen = false;

        if (!CreateGLWindow(_T("the First: Frame."), 640, 480, 16, fFullScreen))
        {
                return 0;
        }

        while (!fDone)
        {
                if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                {
                        if (msg.message == WM_QUIT)
                                fDone = true;
                        else
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }
                }
                else
                {
                        if (fActive)
                        {
                                if (keys[VK_ESCAPE])
                                        fDone = true;
                                else
                                {
                                        DrawGLScene();
                                        SwapBuffers(hDC);
                                }
                        }

                        if (keys[VK_F1])
                        {
                                keys[VK_F1] = false;
                                KillGLWindow();
                                fFullScreen = !fFullScreen;

                                if (!CreateGLWindow(_T("the First: Frame."), 640, 480, 16, fFullScreen))
                                {
                                        return 0;
                                }
                        }
                }
        }

        KillGLWindow();

        return (int) msg.wParam;
}
-----------------------------------------------------------------------------------

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
 楼主| 发表于 2007-9-17 17:21:00 | 显示全部楼层

Re:[求助]Nehe第一课, 我自己写出来的程序的标题栏竟然无

下面是Nehe的:
--------------------------------------------------------------------------------------------
/*
*                This Code Was Created By Jeff Molofee 2000
*                A HUGE Thanks To Fredric Echols For Cleaning Up
*                And Optimizing This Code, Making It More Flexible!
*                If You've Found This Code Useful, Please Let Me Know.
*                Visit My Site At nehe.gamedev.net
*/

#include <windows.h>                // Header File For Windows
#include <gl\gl.h>                        // Header File For The OpenGL32 Library
#include <gl\glu.h>                        // Header File For The GLu32 Library
#include <gl\glaux.h>                // Header File For The Glaux Library

HDC                        hDC=NULL;                // Private GDI Device Context
HGLRC                hRC=NULL;                // Permanent Rendering Context
HWND                hWnd=NULL;                // Holds Our Window Handle
HINSTANCE        hInstance;                // Holds The Instance Of The Application

bool        keys[256];                        // Array Used For The Keyboard Routine
bool        active=TRUE;                // Window Active Flag Set To TRUE By Default
bool        fullscreen=TRUE;        // Fullscreen Flag Set To Fullscreen Mode By Default

LRESULT        CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);        // Declaration For WndProc

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)                // Resize And Initialize The GL Window
{
        if (height==0)                                                                                // Prevent A Divide By Zero By
        {
                height=1;                                                                                // Making Height Equal One
        }

        glViewport(0,0,width,height);                                                // Reset The Current Viewport

        glMatrixMode(GL_PROJECTION);                                                // Select The Projection Matrix
        glLoadIdentity();                                                                        // Reset The Projection Matrix

        // Calculate The Aspect Ratio Of The Window
        gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

        glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
        glLoadIdentity();                                                                        // Reset The Modelview Matrix
}

int InitGL(GLvoid)                                                                                // All Setup For OpenGL Goes Here
{
        glShadeModel(GL_SMOOTH);                                                        // Enable Smooth Shading
        glClearColor(0.0f, 0.0f, 0.0f, 0.5f);                                // Black Background
        glClearDepth(1.0f);                                                                        // Depth Buffer Setup
        glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
        glDepthFunc(GL_LEQUAL);                                                                // The Type Of Depth Testing To Do
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);        // Really Nice Perspective Calculations
        return TRUE;                                                                                // Initialization Went OK
}

int DrawGLScene(GLvoid)                                                                        // Here's Where We Do All The Drawing
{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        // Clear Screen And Depth Buffer
        glLoadIdentity();                                                                        // Reset The Current Modelview Matrix
        return TRUE;                                                                                // Everything Went OK
}

GLvoid KillGLWindow(GLvoid)                                                                // Properly Kill The Window
{
        if (fullscreen)                                                                                // Are We In Fullscreen Mode?
        {
                ChangeDisplaySettings(NULL,0);                                        // If So Switch Back To The Desktop
                ShowCursor(TRUE);                                                                // Show Mouse Pointer
        }

        if (hRC)                                                                                        // Do We Have A Rendering Context?
        {
                if (!wglMakeCurrent(NULL,NULL))                                        // Are We Able To Release The DC And RC Contexts?
                {
                        MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                }

                if (!wglDeleteContext(hRC))                                                // Are We Able To Delete The RC?
                {
                        MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                }
                hRC=NULL;                                                                                // Set RC To NULL
        }

        if (hDC && !ReleaseDC(hWnd,hDC))                                        // Are We Able To Release The DC
        {
                MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                hDC=NULL;                                                                                // Set DC To NULL
        }

        if (hWnd && !DestroyWindow(hWnd))                                        // Are We Able To Destroy The Window?
        {
                MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                hWnd=NULL;                                                                                // Set hWnd To NULL
        }

        if (!UnregisterClass("OpenGL",hInstance))                        // Are We Able To Unregister Class
        {
                MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
                hInstance=NULL;                                                                        // Set hInstance To NULL
        }
}

/*        This Code Creates Our OpenGL Window.  Parameters Are:                                        *
*        title                        - Title To Appear At The Top Of The Window                                *
*        width                        - Width Of The GL Window Or Fullscreen Mode                                *
*        height                        - Height Of The GL Window Or Fullscreen Mode                        *
*        bits                        - Number Of Bits To Use For Color (8/16/24/32)                        *
*        fullscreenflag        - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)        */

BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
        GLuint                PixelFormat;                        // Holds The Results After Searching For A Match
        WNDCLASS        wc;                                                // Windows Class Structure
        DWORD                dwExStyle;                                // Window Extended Style
        DWORD                dwStyle;                                // Window Style
        RECT                WindowRect;                                // Grabs Rectangle Upper Left / Lower Right Values
        WindowRect.left=(long)0;                        // Set Left Value To 0
        WindowRect.right=(long)width;                // Set Right Value To Requested Width
        WindowRect.top=(long)0;                                // Set Top Value To 0
        WindowRect.bottom=(long)height;                // Set Bottom Value To Requested Height

        fullscreen=fullscreenflag;                        // Set The Global Fullscreen Flag

        hInstance                        = GetModuleHandle(NULL);                                // Grab An Instance For Our Window
        wc.style                        = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;        // Redraw On Size, And Own DC For Window.
        wc.lpfnWndProc                = (WNDPROC) WndProc;                                        // WndProc Handles Messages
        wc.cbClsExtra                = 0;                                                                        // No Extra Window Data
        wc.cbWndExtra                = 0;                                                                        // No Extra Window Data
        wc.hInstance                = hInstance;                                                        // Set The Instance
        wc.hIcon                        = LoadIcon(NULL, IDI_WINLOGO);                        // Load The Default Icon
        wc.hCursor                        = LoadCursor(NULL, IDC_ARROW);                        // Load The Arrow Pointer
        wc.hbrBackground        = NULL;                                                                        // No Background Required For GL
        wc.lpszMenuName                = NULL;                                                                        // We Don't Want A Menu
        wc.lpszClassName        = "OpenGL";                                                                // Set The Class Name

        if (!RegisterClass(&wc))                                                                        // Attempt To Register The Window Class
        {
                MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                                        // Return FALSE
        }
       
        if (fullscreen)                                                                                                // Attempt Fullscreen Mode?
        {
                DEVMODE dmScreenSettings;                                                                // Device Mode
                memset(&dmScreenSettings,0,sizeof(dmScreenSettings));        // Makes Sure Memory's Cleared
                dmScreenSettings.dmSize=sizeof(dmScreenSettings);                // Size Of The Devmode Structure
                dmScreenSettings.dmPelsWidth        = width;                                // Selected Screen Width
                dmScreenSettings.dmPelsHeight        = height;                                // Selected Screen Height
                dmScreenSettings.dmBitsPerPel        = bits;                                        // Selected Bits Per Pixel
                dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

                // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
                if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
                {
                        // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
                        if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
                        {
                                fullscreen=FALSE;                // Windowed Mode Selected.  Fullscreen = FALSE
                        }
                        else
                        {
                                // Pop Up A Message Box Letting User Know The Program Is Closing.
                                MessageBox(NULL,&quotrogram Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
                                return FALSE;                                                                        // Return FALSE
                        }
                }
        }

        if (fullscreen)                                                                                                // Are We Still In Fullscreen Mode?
        {
                dwExStyle=WS_EX_APPWINDOW;                                                                // Window Extended Style
                dwStyle=WS_POPUP;                                                                                // Windows Style
                ShowCursor(FALSE);                                                                                // Hide Mouse Pointer
        }
        else
        {
                dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;                        // Window Extended Style
                dwStyle=WS_OVERLAPPEDWINDOW;                                                        // Windows Style
        }

        AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);                // Adjust Window To True Requested Size

        // Create The Window
        if (!(hWnd=CreateWindowEx(        dwExStyle,                                                        // Extended Style For The Window
                                                                "OpenGL",                                                        // Class Name
                                                                title,                                                                // Window Title
                                                                dwStyle |                                                        // Defined Window Style
                                                                WS_CLIPSIBLINGS |                                        // Required Window Style
                                                                WS_CLIPCHILDREN,                                        // Required Window Style
                                                                0, 0,                                                                // Window Position
                                                                WindowRect.right-WindowRect.left,        // Calculate Window Width
                                                                WindowRect.bottom-WindowRect.top,        // Calculate Window Height
                                                                NULL,                                                                // No Parent Window
                                                                NULL,                                                                // No Menu
                                                                hInstance,                                                        // Instance
                                                                NULL)))                                                                // Dont Pass Anything To WM_CREATE
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        static        PIXELFORMATDESCRIPTOR pfd=                                // pfd Tells Windows How We Want Things To Be
        {
                sizeof(PIXELFORMATDESCRIPTOR),                                // Size Of This Pixel Format Descriptor
                1,                                                                                        // Version Number
                PFD_DRAW_TO_WINDOW |                                                // Format Must Support Window
                PFD_SUPPORT_OPENGL |                                                // Format Must Support OpenGL
                PFD_DOUBLEBUFFER,                                                        // Must Support Double Buffering
                PFD_TYPE_RGBA,                                                                // Request An RGBA Format
                bits,                                                                                // Select Our Color Depth
                0, 0, 0, 0, 0, 0,                                                        // Color Bits Ignored
                0,                                                                                        // No Alpha Buffer
                0,                                                                                        // Shift Bit Ignored
                0,                                                                                        // No Accumulation Buffer
                0, 0, 0, 0,                                                                        // Accumulation Bits Ignored
                16,                                                                                        // 16Bit Z-Buffer (Depth Buffer)  
                0,                                                                                        // No Stencil Buffer
                0,                                                                                        // No Auxiliary Buffer
                PFD_MAIN_PLANE,                                                                // Main Drawing Layer
                0,                                                                                        // Reserved
                0, 0, 0                                                                                // Layer Masks Ignored
        };
       
        if (!(hDC=GetDC(hWnd)))                                                        // Did We Get A Device Context?
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))        // Did Windows Find A Matching Pixel Format?
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        if(!SetPixelFormat(hDC,PixelFormat,&pfd))                // Are We Able To Set The Pixel Format?
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        if (!(hRC=wglCreateContext(hDC)))                                // Are We Able To Get A Rendering Context?
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        if(!wglMakeCurrent(hDC,hRC))                                        // Try To Activate The Rendering Context
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        ShowWindow(hWnd,SW_SHOW);                                                // Show The Window
        SetForegroundWindow(hWnd);                                                // Slightly Higher Priority
        SetFocus(hWnd);                                                                        // Sets Keyboard Focus To The Window
        ReSizeGLScene(width, height);                                        // Set Up Our Perspective GL Screen

        if (!InitGL())                                                                        // Initialize Our Newly Created GL Window
        {
                KillGLWindow();                                                                // Reset The Display
                MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;                                                                // Return FALSE
        }

        return TRUE;                                                                        // Success
}

LRESULT CALLBACK WndProc(        HWND        hWnd,                        // Handle For This Window
                                                        UINT        uMsg,                        // Message For This Window
                                                        WPARAM        wParam,                        // Additional Message Information
                                                        LPARAM        lParam)                        // Additional Message Information
{
        switch (uMsg)                                                                        // Check For Windows Messages
        {
                case WM_ACTIVATE:                                                        // Watch For Window Activate Message
                {
                        if (!HIWORD(wParam))                                        // Check Minimization State
                        {
                                active=TRUE;                                                // Program Is Active
                        }
                        else
                        {
                                active=FALSE;                                                // Program Is No Longer Active
                        }

                        return 0;                                                                // Return To The Message Loop
                }

                case WM_SYSCOMMAND:                                                        // Intercept System Commands
                {
                        switch (wParam)                                                        // Check System Calls
                        {
                                case SC_SCREENSAVE:                                        // Screensaver Trying To Start?
                                case SC_MONITORPOWER:                                // Monitor Trying To Enter Powersave?
                                return 0;                                                        // Prevent From Happening
                        }
                        break;                                                                        // Exit
                }

                case WM_CLOSE:                                                                // Did We Receive A Close Message?
                {
                        PostQuitMessage(0);                                                // Send A Quit Message
                        return 0;                                                                // Jump Back
                }

                case WM_KEYDOWN:                                                        // Is A Key Being Held Down?
                {
                        keys[wParam] = TRUE;                                        // If So, Mark It As TRUE
                        return 0;                                                                // Jump Back
                }

                case WM_KEYUP:                                                                // Has A Key Been Released?
                {
                        keys[wParam] = FALSE;                                        // If So, Mark It As FALSE
                        return 0;                                                                // Jump Back
                }

                case WM_SIZE:                                                                // Resize The OpenGL Window
                {
                        ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
                        return 0;                                                                // Jump Back
                }
        }

        // Pass All Unhandled Messages To DefWindowProc
        return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

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
                                {
                                        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
}

--------------------------------------------------------------------------------------------

10

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
 楼主| 发表于 2007-9-17 17:31:00 | 显示全部楼层

Re:[求助]Nehe第一课, 我自己写出来的程序的标题栏竟然无

自己搞明白了.

他的可以响应WM_SYSCOMMAND除SC_SCREENSAVE和SC_MONITORPOWER之外的其他的消息, 而我的则把所有的WM_SYSCOMMAND消息全部屏蔽了.

orz......
还是该自己多想想.....

14

主题

251

帖子

251

积分

中级会员

Rank: 3Rank: 3

积分
251
发表于 2007-10-7 04:57:00 | 显示全部楼层

Re:[求助]Nehe第一课, 我自己写出来的程序的标题栏竟然无

呵呵
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-20 19:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表