directx的问题

limingfang 2001-02-06 04:31:00
这是一个关于directx的问题,源程序可在vc下独自运行,但不知什莫原因,运行结果只是黑屏,应该是显示"Hello World, I am DirectDraw boy !"和 "按 ESC 退出".请给与帮助,万分感谢!

如果有什莫好的directx编程资料请推荐.

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

// 工程:hello

// 文件:hello.cpp

// 内容:创建第一个DirectDraw应用程序,

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


#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 (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}



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; //页面描述

HDC hdc; //设备环境句柄

//创建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;

ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;



//创建主页面对象

if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK)

return FALSE;



//输出文字

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 TRUE;

}


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

//函数:FreeDDraw()

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

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

void FreeDDraw( void )

{

if( lpDD != NULL )

{

if( lpDDSPrimary != NULL )

{

lpDDSPrimary->Release();

lpDDSPrimary = NULL;

}

lpDD->Release();

lpDD = NULL;

}

}

...全文
117 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
limingfang 2001-02-07
  • 打赏
  • 举报
回复
经高手指点可作余下修改:
在SetDisplayMode后加入下语句便可.
UpdateWindow(GetActiveWindow());

对以上仁兄我也同样表示万分感谢.以后还请多帮忙呢.
limingfang 2001-02-07
  • 打赏
  • 举报
回复
经高手指点可作余下修改:
在SetDisplayMode后加入下语句便可.
UpdateWindow(GetActiveWindow());

对以上仁兄我也同样表示万分感谢.以后还请多帮忙呢.
rockswang 2001-02-06
  • 打赏
  • 举报
回复
lhxx(随风):显然不是窗口模式,君不见:
if ( lpDD->SetCooperativeLevel( GetActiveWindow(),

DDSCL_EXCLUSIVE ¦ DDSCL_FULLSCREEN ) != DD_OK)

return FALSE;


不过真奇怪,没见过这样的代码,没有在消息循环里更新页面,这样真的可以吗?
随风bj 2001-02-06
  • 打赏
  • 举报
回复
提几点:
1.你的程序应该是在窗口模式下吧,那还要用CreateClipper来创建裁减器,并在主Surface中用SetClipper来装入;
2.可以把InitDDraw(void)改为InitDDraw(HWND hWnd);这样的话就可以在
SetCooperativeLevel时直接给出窗口句柄;

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧