游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2625|回复: 6

求助:想要在离屏中贴图并翻页在屏幕上显示,但运行却

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-6-1 22:38:00 | 显示全部楼层 |阅读模式
请大虾们给小弟看看。。
#define INITGUID
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <stdarg.h>
#define TIMER_ID 1
#define TIMER_RATE  500

LPDIRECTDRAW lpDD;
LPDIRECTDRAW7 lpDD7;
LPDIRECTDRAWSURFACE7 lpDDSPrimary;
LPDIRECTDRAWSURFACE7 lpDDSBack;
LPDIRECTDRAWSURFACE7 lpDDopl;
BOOL bActive;
HDC hdc,hdc1;
HBITMAP bitmap;
HRESULT result;
DDSURFACEDESC2 ddsd;
RECT rect;
char szMsg1[] = "Hello World, I am DirectDraw boy !";
char szMsg2[] = "按 ESC 退出";
char szMsg3[] = "按 ffff 退出";
char szMsg4[] = "按 gggg 退出";
void CreateBitmapSurface(LPDIRECTDRAWSURFACE7 lpSurface, char *fname, int xs, int ys);
void DrawHBitmap(IDirectDrawSurface7 *lpSurface, HBITMAP hBitmap, int x, int y, int width, int height);
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
HWND hwnd;
HINSTANCE hINST;

BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );
BOOL InitDDraw( void );
void FreeDDraw( void );
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    if ( !InitWindow( hInstance, nCmdShow ) )
        return FALSE;
    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;
}


static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
     
    WNDCLASS wc;
    wc.style = 0;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
    wc.hbrBackground=(HBRUSH)(COLOR_BACKGROUND+1);
        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;
    }
LRESULT CALLBACK WinProc( HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam )
{
   
        RECT rc;
        static BYTE phase=0;
        PAINTSTRUCT ps;
    switch (message)
        {
        case WM_ACTIVATEAPP:
                bActive=wParam;
                break;
        case WM_CREATE:
                break;
        case WM_SETCURSOR:
                SetCursor(NULL);
                return TRUE;
        case WM_TIMER:
                if(bActive)
                {
                        if(lpDDSBack->GetDC(&hdc)==DD_OK)
                        {
                                if(phase)
                                {     
                                    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));
                                        phase=0;
                                }
                                else
                                {
                                    SetBkColor(hdc,RGB(255,0,0));
                                    SetTextColor(hdc,RGB(255,255,0));                                       
                                        TextOut( hdc, 220, 200, szMsg3, lstrlen(szMsg3));
                    TextOut( hdc, 280, 240, szMsg4, lstrlen(szMsg4));
                                        phase=1;
                                }
                                lpDDSBack->ReleaseDC(hdc);
                        }
                        while(1)
                        {
                                HRESULT ddrval;
                                ddrval=lpDDSPrimary->Flip(NULL,0);
                                if(ddrval==DD_OK)
                                {
                                        break;
                                }
                                if(ddrval==DDERR_SURFACELOST)
                                {
                                        ddrval=lpDDSPrimary->Restore();
                                        if(ddrval!=DD_OK)
                                        {
                                                break;
                                        }
                                }
                                if(ddrval!=DDERR_WASSTILLDRAWING)
                                {
                                        break;
                                }
                        }
                }
                break;
        case WM_KEYDOWN:
                switch(wParam)
                {
                case VK_ESCAPE:
                case VK_F12:
                        PostMessage(hWnd,WM_CLOSE,0,0);
                        break;
                }
                break;
                case WM_PAINT:
                        BeginPaint(hWnd,&ps);
                        GetClientRect(hWnd,&rc);
                //        GetTextExtentPoint(ps.hdc,szMsg4,lstrlen(szMsg4),&size);
                //        SetBkColor(ps.hdc,RGB(0,0,255));
                //        SetTextColor(ps.hdc,RGB(255,255,0));
                //        TextOut(ps.hdc,(rc.right-size.cx)/2,(rc.bottom-size.cy)/2,szMsg4,lstrlen(szMsg4));
                        break;
}

        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);
}
BOOL InitDDraw(void)
{
    DDSCAPS   ddscaps;
        HDC hdc;
    if ( DirectDrawCreate( NULL, &lpDD, NULL ) != DD_OK ) return FALSE;
        if(FAILED(lpDD->QueryInterface(IID_IDirectDraw7, (LPVOID *)&lpDD7)))
        {
       MessageBox(NULL,TEXT("DirectDraw QueryInterface error!"),
       TEXT("Wrong!"),MB_OK);
       return(0);
        }

    if ( lpDD7->SetCooperativeLevel( GetActiveWindow(),
                    DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK)
        return FALSE;
    if (lpDD7->SetDisplayMode(800, 600, 16,0,0) != DD_OK) return FALSE;
        memset(&ddsd,0,sizeof(ddsd));
        ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
        ddsd.dwBackBufferCount=1;   
        if (lpDD7->CreateSurface(&ddsd, &lpDDSPrimary, NULL) == DD_OK)
        {
                ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
                if(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBack)==DD_OK)
                {
                        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);
                   }
           if ( lpDDSBack->GetDC(&hdc) != DD_OK) return FALSE;
                   {
                                  SetBkColor(hdc,RGB(255,0,0));
                                  SetTextColor(hdc,RGB(255,255,0));
                  TextOut( hdc, 220, 200, szMsg3, lstrlen(szMsg3));
                  TextOut( hdc, 280, 240, szMsg4, lstrlen(szMsg4));
                  lpDDSBack->ReleaseDC(hdc);
                   }
                   ZeroMemory(&ddsd,sizeof(ddsd));
                   memset(&ddsd,0,sizeof(ddsd)); //清空结构内容
           ddsd.dwSize=sizeof(ddsd); //设置大小
           ddsd.dwFlags = DDSD_CAPS |DDSD_HEIGHT|DDSD_WIDTH;
           ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;//指定页面类型
           ddsd.dwWidth=320;
           ddsd.dwHeight=210; //设置离屏页面大小
           if (lpDD7->CreateSurface(&ddsd, &lpDDopl, NULL)!=DD_OK)
                   {
                           MessageBox(NULL,TEXT("DirectDraw Create offscreen plain error!"),
               TEXT("Wrong!"),MB_OK);
                   }
                   CreateBitmapSurface(lpDDopl,"saiche.bmp",320,210);
                   lpDDopl->Release();
                   if(SetTimer(hwnd,TIMER_ID,TIMER_RATE,NULL))
                   {
                           return TRUE;
                   }
                }
        }
    return TRUE;
}
void FreeDDraw( void )
{
    if( lpDD != NULL )
    {
        if( lpDDSPrimary != NULL )
        {
            lpDDSPrimary->Release();
            lpDDSPrimary = NULL;
        }
                if (lpDD7!=NULL)
                {
          lpDD7->Release();
          lpDD7 = NULL;
                }
        lpDD->Release();
        lpDD = NULL;
    }
}

void DrawHBitmap(IDirectDrawSurface7 *lpSurface, HBITMAP hBitmap, int x, int y, int width, int height)
{
    HDC hdcImage;
    HDC hdc;
    BITMAP bm;

    if (lpSurface == NULL || hBitmap == NULL)
        return;
    lpSurface->Restore();

    hdcImage = CreateCompatibleDC(NULL);
    SelectObject(hdcImage, hBitmap);

    GetObject(hBitmap, sizeof(bm), &bm);
    width = width == 0 ? bm.bmWidth : width;
    height = height == 0 ? bm.bmHeight : height;

    lpSurface->GetDC(&hdc);
    BitBlt(hdc, x, y, width, height, hdcImage, 0, 0, SRCCOPY);
    lpSurface->ReleaseDC(hdc);
    DeleteDC(hdcImage);
}

void CreateBitmapSurface(LPDIRECTDRAWSURFACE7 lpSurface, char *fname, int xs, int ys)
{
    HBITMAP hBitmap;
    hBitmap = (HBITMAP)LoadImage(NULL, fname, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    DrawHBitmap(lpSurface, hBitmap, 0, 0, xs, ys);
    DeleteObject(hBitmap);
}


[em19] [em19]

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-6-2 10:18:00 | 显示全部楼层

Re:求助:想要在离屏中贴图并翻页在屏幕上显示,但运行

看了好半天,不知道该怎么改

wc.hCursor = LoadCursor(NULL,IDC_ARROW);
我这不加这个CreateWindowEx返回NULL


  1.     if ( DirectDrawCreate( NULL, &lpDD, NULL ) != DD_OK ) return FALSE;
  2.     if(FAILED(lpDD->QueryInterface(IID_IDirectDraw7, (LPVOID *)&lpDD7)))
  3.     {
  4.        MessageBox(NULL,TEXT("DirectDraw QueryInterface error!"),
  5.        TEXT("Wrong!"),MB_OK);
  6.        return(0);
  7.     }
复制代码

写 if(DirectDrawCreateEx(NULL, (LPVOID*)&lpDD7, IID_IDirectDraw7, NULL)!=DD_OK)return FALSE; 就可以,不用那么麻烦



  1. case WM_PAINT:
  2.     hdc = BeginPaint(hWnd, &ps);
  3.     //什么也不要做
  4.     EndPaint(hWnd, &ps); //别忘了这句
  5.     break;
复制代码


唉,请原谅我耐心不够,先玩儿会游戏去

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-6-2 10:25:00 | 显示全部楼层

Re:求助:想要在离屏中贴图并翻页在屏幕上显示,但运行

另外问一句,你用ddraw只是为了Flip?
为什么要用GDI的BitBlt而不用DDraw的IDirectDrawSurface7::Blt呢?

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2006-6-3 11:30:00 | 显示全部楼层

感谢大哥的帮助:

我的不用这句:if(DirectDrawCreateEx(NULL, (LPVOID*)&lpDD7, IID_IDirectDraw7, NULL)!=DD_OK)return FALSE; 不会返回NULL,还是可以运行的。
我是一个初学者,对GDI的BitBlt和IDirectDrawSurface7::Blt还不很了解,还望大哥多多指点。。 [em13]

6

主题

14

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2006-6-3 22:44:00 | 显示全部楼层

Re:求助:想要在离屏中贴图并翻页在屏幕上显示,但运行

你写的代码太长,看的头晕。

推荐一本好书《Windows游戏编程大师技巧》
里面有DX的知识。

你可以到下面的网站去下载,
下载需要积分,你可以用我的帐号去下载,

我的帐号和密码发你邮箱 376527639@qq.com 了,自己去查看。

网址:http://www.netyi.net/

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2006-6-3 23:34:00 | 显示全部楼层

谢谢哈!!

谢谢你给我推荐这么好的书哈!!

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-6-4 07:39:00 | 显示全部楼层

Re:求助:想要在离屏中贴图并翻页在屏幕上显示,但运行

DDraw了解一下就行了,微软已经不支持它了,D3D和OpenGL都可以做2D,还方便一些
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 15:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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