学习directdraw

刚开始学习directdraw,看directdraw手册上的例子,copy下来编译错误n多,好不容易改好了,一运行就是个黑屏,在SetDisplayMode后加入下语句 UpdateWindow(GetActiveWindow()); 倒是有字了,不过全是乱码。。。真是个悲剧,先不管了,看有没有高手来帮忙解决,等先再学习一下再做改进吧,fighting,呵呵 代码如下:

// helloddraw.cpp : Defines the entry point for the console application.
//

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

// 工程:hello

// 文件:hello.cpp

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

//*******************************************************************
#include "stdafx.h"

#include <windows.h>

#include <windowsx.h>

#include <ddraw.h>


#pragma comment (lib,"ddraw.lib")


LPDIRECTDRAW lpDD;// DirectDraw对象

LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw主页面

char szMsg1[]= "Hello World, I am studying DirectDraw  !";

char szMsg2[] = "按 ESC 退出";

//char*szMsg1=_T("Hello World, I am studying DirectDraw  !");

//函数声明

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(), TEXT("初始化DirectDraw过程中出错"), TEXT("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 = _T("dxHello");

    //注册窗口类

    RegisterClass( &wc );

   

    //创建主窗口

    hwnd = CreateWindowEx(

    0,

    TEXT("dxHello"),

   TEXT("") ,

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

 UpdateWindow(GetActiveWindow());//newly added
   

    //填充主页面信息

    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 ) );//set the background color

    SetTextColor( hdc, RGB( 255, 255, 0 ) );

 //TextOut( hdc, 220, 200, szMsg1, lstrlen(szMsg1));

    TextOut( hdc, 220, 200, (LPCWSTR)szMsg1, lstrlen((LPCWSTR)szMsg1));

    TextOut( hdc, 280, 240, (LPCWSTR)szMsg2, lstrlen((LPCWSTR)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;

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值