学习directdraw

    技术2022-05-19  24

    刚开始学习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;

        }

    }

     


    最新回复(0)