游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8546|回复: 9

调试程序显示一个窗口,闪一下就消失是怎么回事啊?

[复制链接]

3

主题

7

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2012-10-29 10:41:00 | 显示全部楼层 |阅读模式
#include<windows.h>
#include<iostream>
#include<time.h>
#include<d3d9.h>
using namespace std;

#pragma comment (lib,"d3d9.lib")
#pragma comment (lib,"d3dx9.lib")

//program settings
const string APPTITLE="Direct3D_Windowed";
const int SCREENW=1024;
const int SCREENH=768;

//Direct3D objects
LPDIRECT3D9 d3d=NULL;
LPDIRECT3DDEVICE9 d3ddev=NULL;

bool gameover = false;

//macro to device key presses
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0)


//Game initialization function
bool Game_Init(HWND window)
{
        MessageBox(window,"Game_Init","BREAKPOINT",0);

        //initialize Direct3D
        d3d=Direct3DCreate9(D3D_SDK_VERSION);
        if(d3d==NULL) return 0;

        //set Direct3D presentation parameters
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.Windowed                        =true;
        d3dpp.SwapEffect                =D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat        =D3DFMT_X8R8G8B8;
        d3dpp.BackBufferCount        =1;
        d3dpp.BackBufferWidth        =SCREENW;
        d3dpp.BackBufferHeight        =SCREENH;
        d3dpp.hDeviceWindow                =window;


        //create Direct3D device
        d3d->CreateDevice(       
                                                D3DADAPTER_DEFAULT,
                                                D3DDEVTYPE_HAL,
                                                window,
                                                D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                &d3dpp,
                                                &d3ddev
                                                );

        if(d3ddev==NULL)        return 0;
                return true;
}



//Game update function
void Game_Run(HWND hwnd)
{
        //make sure the Direct3D device is calid
        if(!d3ddev) return ;

        //clear the backbuffer to bright green
        d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,255,0),1.0f,0);

        //start rendering
        if(d3ddev->BeginScene())
        {
                //do something?


                //stop rendering
                d3ddev->EndScene();

                //copy back buffer on the screen
                d3ddev-&gtresent(NULL,NULL,NULL,NULL);
        }

        //check for escape key (to exit program)
        if(KEY_DOWN(VK_ESCAPE))
                PostMessage(hwnd,WM_DESTROY,0,0);
}


//Game shutdown function
void Game_End(HWND hwnd)
{
        //display close message
        MessageBox(hwnd,"Program is about to end","Game_End",MB_OK);
       
        //free memory
        if(d3ddev)                d3ddev->Release();
        if(d3d)                        d3d->Release();

}


//Windows event handling function
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
        switch(msg)
        {
        case WM_DESTROY:
                gameover=true;
                PostQuitMessage(0);
                break;
        }
        return DefWindowProc(hwnd,msg,wParam,lParam);
}


//Main Windows entry function
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        //set the new window's properties
        //previousl found in the MyRegisterClass function
        WNDCLASSEX wc;
        wc.cbSize                =sizeof(WNDCLASSEX);
        wc.style                =CS_HREDRAW|CS_VREDRAW;
        wc.lpfnWndProc        =(WNDPROC)WinProc;
        wc.cbClsExtra        =0;
        wc.cbWndExtra        =0;
        wc.hInstance        =hInstance;
        wc.hIcon                =NULL;
        wc.hCursor                =LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
        wc.lpszMenuName        =NULL;
        wc.lpszClassName=APPTITLE.c_str();
        wc.hIconSm                =NULL;
        //set up the window with the class info
        return RegisterClassEx(&wc);
       

        //reate a new window
        //previously found int the InitInstance function
        HWND window=CreateWindow(
                                                        APPTITLE.c_str(),
                                                        APPTITLE.c_str(),
                                                        WS_OVERLAPPEDWINDOW,
                                                        CW_USEDEFAULT,
                                                        CW_USEDEFAULT,
                                                        SCREENW,
                                                        SCREENH,
                                                        NULL,
                                                        NULL,
                                                        hInstance,
                                                        NULL
                                                );
        //was there an error creating the window?
        if(window==0) return 0;

        //display the window
        ShowWindow(window,nCmdShow);
        UpdateWindow(window);
       
        if(!Game_Init(window))        return 0;
       

        //main message loop
        MSG message;
        while(!gameover)
        {
                //process Windows events
                if(PeekMessage(&message,NULL,0,0,PM_REMOVE))
                {
                        TranslateMessage(&message);
                        DispatchMessage(&message);
                }

                //process game loop
                Game_Run(window);
        }
       
        //free game resources
        Game_End(window);
        return message.wParam;
}

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-10-29 12:30:00 | 显示全部楼层

Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

return RegisterClassEx(&wc);

3

主题

7

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2012-10-31 19:25:00 | 显示全部楼层

Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

1楼,问下这个函数有问题,难道返回值为0了么?

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-11-1 11:19:00 | 显示全部楼层

Re: Re:调试程序显示一个窗口,闪一下就消失是怎么回事

追影逍遥: Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

1楼,问下这个函数有问题,难道返回值为0了么?


主函数都返回了,程序能不退出么.

3

主题

7

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2012-11-1 13:04:00 | 显示全部楼层

Re: Re: Re:调试程序显示一个窗口,闪一下就消失是怎么回

微无渊: Re: Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?



主函数都返回了,程序能不退出么.



return RegisterClassEx(&wc);函数的功能不是向Windows注册窗口么,你说主函数返回了,我又看了程序还是没看到是在哪个位置返回的,我刚开始学习,很多都不懂,能帮我具体的讲解下么,谢谢了~~!!

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-11-1 14:02:00 | 显示全部楼层

Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

你这代码和这个是一样的:

int main()
{
   return xx;
  
  // 下面是其他代码
}

主函数都返回了,程序就退出了。

3

主题

7

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2012-11-1 17:39:00 | 显示全部楼层

Re: Re:调试程序显示一个窗口,闪一下就消失是怎么回事

微无渊: Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

你这代码和这个是一样的:

int main()
{
   return xx;
  
  // 下面是其他代码
}

主函数都返回了,程序就退出了。

非常感谢,我明白是怎么回事了

3

主题

7

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2012-11-1 18:03:00 | 显示全部楼层

Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

我这还有个程序,我把那个错误改过了,可是还是同一个毛病,你能帮我看看么?
#include<Windows.h>
#include<d3d9.h>
#include<d3dx9.h>
#include<time.h>
#include<iostream>
using namespace std;

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0)

const string APPTITLE="Load Bitmap Program";
const int SCREENW=1024;
const int SCREENH=768;

LPDIRECT3D9 d3d=NULL;
LPDIRECT3DDEVICE9 d3ddev=NULL;
LPDIRECT3DSURFACE9 backbuffer=NULL;
LPDIRECT3DSURFACE9 surface=NULL;

bool gameover=false;

bool Game_Init(HWND window)
{
        d3d= Direct3DCreate9(D3D_SDK_VERSION);
        if(!d3d)
        {
                MessageBox(window,"Error initializing Direct3D","Error",MB_OK);
                return 0;
        }
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.Windowed=true;
        d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
        d3dpp.BackBufferCount=1;
        d3dpp.BackBufferWidth=SCREENW;
        d3dpp.BackBufferHeight=SCREENH;
        d3dpp.hDeviceWindow=window;

        d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,window,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&d3ddev);
        if(!d3ddev)
        {
                MessageBox(window,"Error creating Direct3D device","Error",MB_OK);
                return false;
        }

        d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
       
        HRESULT result=d3ddev->CreateOffscreenPlainSurface(SCREENW,SCREENH,D3DFMT_X8R8G8B8,
                                                                                                           D3DPOOL_DEFAULT,&surface,NULL);
        if(!SUCCEEDED(result)) return false;

        result=D3DXLoadSurfaceFromFile(surface,NULL,NULL,"legotron.bmp",NULL,D3DX_DEFAULT,0,NULL);

        if(!SUCCEEDED(result))  return false;

        return true;
}

void Game_Run(HWND hwnd)
{
        if(!d3ddev) return ;

        d3ddev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backbuffer);

        if(d3ddev->BeginScene())
        {
                d3ddev->StretchRect(surface,NULL,backbuffer,NULL,D3DTEXF_NONE);

                d3ddev->EndScene();
                d3ddev-&gtresent(NULL,NULL,NULL,NULL);
        }

        if(KEY_DOWN(VK_ESCAPE))
                PostMessage(hwnd,WM_DESTROY,0,0);
}
void Game_End(HWND hwnd)
{
        if(surface) surface->Release();
        if(d3ddev)d3ddev->Release();
        if(d3d)d3d->Release();
}

LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
        switch(msg)
        {
        case WM_DESTROY:
                gameover =true;
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hwnd ,msg,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        WNDCLASSEX wc;
        wc.cbSize                                = sizeof(WNDCLASSEX);
        wc.style                                =CS_HREDRAW|CS_VREDRAW;
        wc.lpfnWndProc                        =(WNDPROC)WinProc;
        wc.cbClsExtra                        =0;
        wc.cbWndExtra                        =0;
        wc.hInstance                        =hInstance;
        wc.hIcon                                =NULL;
        wc.hCursor                                =LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground                =(HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName                        =NULL;
        wc.lpszClassName                =APPTITLE.c_str();
        wc.hIconSm                                =NULL;
        RegisterClassEx(&wc);

        HWND window=CreateWindow(
                                                                APPTITLE.c_str(),
                                                                APPTITLE.c_str(),
                                                                WS_OVERLAPPEDWINDOW,
                                                                CW_USEDEFAULT,
                                                                CW_USEDEFAULT,
                                                                SCREENW,
                                                                SCREENH,
                                                                NULL,
                                                                NULL,
                                                                hInstance,
                                                                NULL
                                                          );
        if(window==0)
                return 0;
        ShowWindow(window,nCmdShow);
        UpdateWindow(window);

        if(!Game_Init(window))
                return 0;
        MSG message;
        while(!gameover)
        {
                if(PeekMessage(&message,NULL,0,0,PM_REMOVE))
                {
                        TranslateMessage(&message);
                        DispatchMessage(&message);
                }
                Game_Run(window);
        }
        return message.wParam;

}

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-11-2 09:29:00 | 显示全部楼层

Re:调试程序显示一个窗口,闪一下就消失是怎么回事啊?

回楼上,
你不会断点+单步调试么?要是不会的话,我建议你百度一下,看看怎么调试,
一步步跟下来,你就知道哪出问题了。

result=D3DXLoadSurfaceFromFile(surface,NULL,NULL,"legotron.bmp",NULL,D3DX_DEFAULT,0,NULL);
应该是这里加载失败了,就是它没找到图片,要么是你没放图片,要么是你的编译器调试设置的工作目录不对。

5

主题

92

帖子

685

积分

高级会员

Rank: 4

积分
685
发表于 2012-12-24 10:35:40 | 显示全部楼层
return RegisterClassEx(&wc);//问题出在这啊。。

//....
if(!RegisterClassEx(&wc))
{
   return 0;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-27 06:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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