游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1551|回复: 2

初级问题请教

[复制链接]

4

主题

38

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2004-7-28 23:16:00 | 显示全部楼层 |阅读模式
小弟最近开始学DX,看教程上的一个例子,创建一个DirectDraw应用程序,按F7编译成功后,按Ctrl+F5,执行该程序,显示器将切换到640*480*256色模式, 黑屏后,屏幕中央会打印出蓝底黄字“Hello World, I am DirectDraw boy !”
但是我运行后我按ESC退出,却总出错,提示XX引用的XX内存不能为“read”,2天了,请大家帮帮忙看看错在哪?,谢谢!!
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
LPDIRECTDRAW lpDD; // DirectDraw对象
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw主页面
char szMsg1[ ] = "Hello World, I am DirectDraw boy !";
char szMsg2[ ] = "按 ESC 退出";

//函数声明

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );

BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );

BOOL InitDDraw( void );

void FreeDDraw( void );
//*******************************************************************

//函数:WinMain()

//功能:Win32应用程序入口函数。进行初始化工作,处理消息循环

//*******************************************************************

int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,

                      LPSTR lpCmdLine, int nCmdShow)

{

    MSG msg;

   

    //初始化主窗口

    if ( !InitWindow( hInstance, nCmdShow ) )

        return FALSE;

    //初始化DirectDraw环境,并实现DirectDraw功能

    if ( !InitDDraw())

    {

        MessageBox(GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK );

        FreeDDraw();

        DestroyWindow(GetActiveWindow());

        return FALSE;

    }

   

    //进入消息循环

    while(1)
        {
                if(GetMessage(&msg, NULL, 0, 0))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
            HDC hdc;
                if ( lpDDSPrimary->GetDC(&hdc) != DD_OK) return FALSE; //获得设备环境句柄
            SetBkColor( hdc, RGB( 0, 0, 255 )); //设置背景颜色
            SetTextColor( hdc, RGB( 255, 255, 0 )); //设置文字颜色
            TextOut( hdc, 220, 200, szMsg1, lstrlen(szMsg1)); //输出文字
            TextOut( hdc, 280, 240, szMsg2, lstrlen(szMsg2));
            lpDDSPrimary->ReleaseDC(hdc);
        }
        return msg.wParam;

}

//******************************************************************

//函数:InitWindow()

//功能:创建主窗口。

//******************************************************************

static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )

{

    HWND hwnd; //窗口句柄

    WNDCLASS wc; //窗口类结构

   

    //填充窗口类结构

    wc.style = 0;

    wc.lpfnWndProc = WinProc;

    wc.cbClsExtra = 0;

    wc.cbWndExtra = 0;

    wc.hInstance = hInstance;

    wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );

    wc.hCursor = LoadCursor( NULL, IDC_ARROW );

    wc.hbrBackground =(HBRUSH) GetStockObject(BLACK_BRUSH);

    wc.lpszMenuName = NULL;

    wc.lpszClassName = "dxHello";

    //注册窗口类

    RegisterClass( &wc );
    //创建主窗口

    hwnd = CreateWindowEx(

    0,

    "dxHello",

    "",

    WS_POPUP,
    0, 0,

    GetSystemMetrics( SM_CXSCREEN ),

    GetSystemMetrics( SM_CYSCREEN ),

    NULL,

    NULL,

    hInstance,

    NULL );

   

    if( !hwnd ) return FALSE;

    //显示并更新窗口

    ShowWindow( hwnd, nCmdShow );

    UpdateWindow( hwnd );

    return TRUE;

    }

   

//******************************************************************

//函数:WinProc()

//功能:处理主窗口消息

//******************************************************************

LRESULT CALLBACK WinProc( HWND hWnd, UINT message,

                             WPARAM wParam, LPARAM lParam )

{

    switch( message )

    {

        case WM_KEYDOWN://击键消息

            switch( wParam )

            {

                case VK_ESCAPE:

                    PostMessage(hWnd, WM_CLOSE, 0, 0);

                    break;

            }

            break;

        case WM_DESTROY://退出消息

            FreeDDraw();

            PostQuitMessage( 0 );

            break;

    }

    //调用缺省消息处理过程

    return DefWindowProc(hWnd, message, wParam, lParam);
}
//******************************************************************

//函数:InitDDraw()

//功能:初始化DirectDraw环境并实现其功能。包括:创建DirectDraw对象,

// 设置显示模式,创建主页面,输出文字。

//******************************************************************

BOOL InitDDraw(void)

{

    DDSURFACEDESC ddsd; //页面描述

   
        //创建DirectCraw对象
        if ( DirectDrawCreate( NULL, &lpDD, NULL ) != DD_OK ) return FALSE;
       
       
       

       
        // 设置控制程度:取得独占和全屏模式
        if ( lpDD->SetCooperativeLevel( GetActiveWindow()/*主窗口句柄*/ ,

                    DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK)

        return FALSE;
       

   


   
        //设置显示模式
        if ( lpDD->SetDisplayMode(640, 480, 8) != DD_OK) return FALSE;
       
   


   
        //填充主页面信息
    ddsd.dwSize = sizeof( ddsd ); //结构的大小

    ddsd.dwFlags = DDSD_CAPS; //指定DDSURFACEDESC结构的ddsCaps成员为可用

    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; //指定要创建的是主页面



   

    //创建主页面对象
        if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK)  
                return FALSE;

        return TRUE;

}



//******************************************************

//函数:FreeDDraw()

//功能:释放所有的DirectDraw对象。

//******************************************************
void FreeDDraw( void )
{
    if(lpDDSPrimary!=NULL)
        {
                lpDDSPrimary->Release();
        lpDDSPrimary = NULL;
        }
    if(lpDD!=NULL)
        {
                lpDD->Release();
        lpDD = NULL;
        }
}

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-7-28 23:33:00 | 显示全部楼层

Re:初级问题请教

窗口收到WM_DESTORY消息之后便调用了FreeDDraw函数来释放COM对象,然后又在消息循环中使用了已经无效的COM对象接口指针。

4

主题

38

帖子

46

积分

注册会员

Rank: 2

积分
46
 楼主| 发表于 2004-7-29 10:33:00 | 显示全部楼层

Re:初级问题请教

哦,那屏闭掉这个消息就可以了啊
谢谢兄台!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 09:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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