游戏开发论坛

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

不显示文字,只是黑屏(VC++)

[复制链接]

5

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2006-3-2 14:57:00 | 显示全部楼层 |阅读模式
小弟刚学DIRECT,而且VC++不是太好,下面的程序着实找不出是哪错了,希望各位仁兄不嫌小弟愚昧,多多指教。谢谢。
   WIN32程序加C++:
#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 );//声明初始化DDRAW函数

void FreeDDraw( void );//释放DDRAW函数
//*******************************************************************
//函数: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, 125, 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;
}}

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2006-3-2 17:01:00 | 显示全部楼层

Re:不显示文字,只是黑屏(VC++)

渲染代码放错位置了!
作如下修改:
1、增加一个函数:
void Render( void )
{
    //输出文字,来自你的代码
    if ( lpDDSPrimary->GetDC(&hdc) != DD_OK) return FALSE;
    SetBkColor( hdc, RGB( 0, 0 , 255 ) );
    SetTextColor( hdc, RGB( 255, 125, 0 ) );
    TextOut( hdc, 220, 200, szMsg1, lstrlen(szMsg1));
    TextOut( hdc, 280, 240, szMsg2, lstrlen(szMsg2));
    lpDDSPrimary->ReleaseDC(hdc);
}

2、修改消息循环部分:
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);

    Render();
}

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2006-3-2 18:40:00 | 显示全部楼层

Re:不显示文字,只是黑屏(VC++)

  楼上的说得没错~~但是我觉得处理消息循环最好还是用PeekMessage~~另外,楼主的程序是不能达到效果 ~还是运行时会异常终止----如果是异常终止,那么错误很有可能是因为你在创建页面时对页面描述符没有清空的缘故:
    ZeroMemory(&ddsd,sizeof(ddsd));
    然后再去创建页面~~我以前学DirectDraw7的时候遇到这个问题~~在DX中很多这种结构体在使用前都需要这样做~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 19:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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