游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2979|回复: 3

紧急求助

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2003-8-6 11:35:00 | 显示全部楼层 |阅读模式
以下是我的源程序主要要在窗口中显示一张图片文件名为(set.bmp)
编译链接都没问题但图片在窗口中一闪即不见,请教诸位大虾我错在
哪里。
谢谢。


# include <iostream.h>
# include <conio.h>
# include <windows.h>
# include <windowsx.h>
# include <mmsystem.h>
# include <ddraw.h>
# include "Konfu.h"

# define WIN32_LEAN_AND_WEAN
# define SCREEN_WIDTH    640
# define SCREEN_HEIGHT   480
# define SCREEN_BPP      32
# define INIT_DXSTRUCT(dxs) {ZeroMemory(&dxs, sizeof(dxs)); ddsd.dwSize=sizeof(dxs);}

HWND hWndMain;

LPDIRECTDRAW            lpdd;
LPDIRECTDRAW4           lpdd4;
DDSURFACEDESC2          ddsd;
LPDIRECTDRAWSURFACE4    lpddsPrimary;
LPDIRECTDRAWSURFACE4    lpddsBack;
LPDIRECTDRAWSURFACE4    lpddsOffscreen;


HDC hDdc, hSdc;
BITMAP   bmp;
HBITMAP  hbmp;


//
///////////WinMain

int WINAPI WinMain(HINSTANCE hInstance,
                                   HINSTANCE hPrevInstance,
                                   LPSTR     lpCmdLine,
                                   int       nCmdShow)
{
        MSG msg;

        //初始化函数作用注册并创建主窗口
        if (!initApplication(hInstance, nCmdShow))
        {
                return FALSE;
        }

        //初始化DD作用创建DD对象、表面等。调入及显示图片
                   也在此函数中完成
           DDint();


        while(1)
        {
                if (PeekMessage(&msg,hWndMain,0,0,PM_REMOVE))
                {
                        if (msg.message == WM_QUIT)
                                break;
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);       
                }

        }

               //释放各种资源
        GameShutdown();

        return (msg.wParam);
}



//
////////////WinMainProc

LRESULT CALLBACK WinMainProc(HWND hWndMain,
                                                         UINT msg,
                                                         WPARAM wParam,
                                                         LPARAM lParam)


{


        switch(msg)
        {
        case WM_CREATE:
                {
                        return (0);
                }break;



        case WM_DESTROY:
                {
                        PostQuitMessage(0);
                        return (0);
                }break;

        default: break;

               
        }
        return (DefWindowProc(hWndMain,msg,wParam,lParam));
}

//////////////////////////////////////

static BOOL initApplication(HINSTANCE hInstance, int nCmdShow)
{
        WNDCLASSEX wcls;


//  registerWinclass
        wcls.cbSize          = sizeof(wcls);
        wcls.style           = CS_HREDRAW|CS_VREDRAW;
        wcls.lpfnWndProc     = WinMainProc;
        wcls.cbClsExtra      = 0;
        wcls.cbWndExtra      = 0;
        wcls.hInstance       = hInstance;
        wcls.hIcon           = LoadIcon(NULL, IDI_WINLOGO);
        wcls.hCursor         = LoadCursor(NULL, IDC_ARROW);
        wcls.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wcls.lpszMenuName    = NULL;
        wcls.lpszClassName   = "GameClass";
        wcls.hIconSm         = LoadIcon(NULL, IDI_WINLOGO);
        if (!RegisterClassEx(&wcls))
        {
                return FALSE;
        }

//  createWindows
        hWndMain= CreateWindowEx(
                NULL,
                "GameClass",
                "hello",
                WS_VISIBLE|WS_OVERLAPPEDWINDOW,
                0,0,
                500,500,
                NULL,
                NULL,
                hInstance,
                NULL);

        if (!hWndMain)
                return FALSE;


//  showWindows   
   ShowWindow(hWndMain, nCmdShow);
   UpdateWindow(hWndMain);
   
   return TRUE;
}



///////////////////////////

DDint()
{
  if (FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))
  {
          return (0);
  }

  if (FAILED(lpdd->QueryInterface(IID_IDirectDraw4, (LPVOID *)&lpdd4)))
  {
          return (0);
  }



  if (FAILED(lpdd4->SetCooperativeLevel(hWndMain, DDSCL_ALLOWREBOOT|DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE)))
  {
          return (0);
  }

  if (FAILED(lpdd4->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0)))
  {
          return (0);
  }

  INIT_DXSTRUCT(ddsd);
  ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
  ddsd.dwBackBufferCount=1;
  ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|
                          DDSCAPS_COMPLEX|
                                          DDSCAPS_FLIP|
                                          DDSCAPS_VIDEOMEMORY;

  if (FAILED(lpdd4->CreateSurface(&ddsd,&lpddsPrimary,NULL)))
  {
          return (0);
  }

  ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
  if (FAILED(lpddsPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsBack)))
  {
          return (0);
  }
                         
  
  INIT_DXSTRUCT(ddsd);
  ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
  ddsd.dwWidth=SCREEN_WIDTH;
  ddsd.dwHeight=SCREEN_HEIGHT;
  ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|
                          DDSCAPS_VIDEOMEMORY;
  if (FAILED(lpdd4->CreateSurface(&ddsd,&lpddsOffscreen,NULL)))
  {
          return (0);
  }


  MyLoadBitmap(lpddsPrimary);//此函数用于将图片载入内存并在
                                            主SURFACE中显示出来。

// lpddsPrimary->Blt(NULL, lpddsBack, NULL, DDBLT_WAIT, NULL);

  lpdd->Release();
  lpdd=NULL;


  return TRUE;
}

////////////////////////////////////////

GameShutdown()
{
        lpddsOffscreen->Release();
        lpddsOffscreen=NULL;
    lpddsBack->Release();
        lpddsBack=NULL;
        lpddsPrimary->Release();
        lpddsPrimary=NULL;
        lpdd4->Release();
        lpdd4=NULL;
        return (1);
}

////////////////////////////////////////

MyLoadBitmap(LPDIRECTDRAWSURFACE4 lpdds)
{
        int nHeight, nWidth;

    if ((hbmp=(HBITMAP)LoadImage(NULL, "set.bmp", IMAGE_BITMAP,0,0, LR_LOADFROMFILE))==NULL)
        {
                return FALSE;
        }

        if ((hSdc=CreateCompatibleDC(NULL))==NULL)
        {
                return FALSE;
        }
       
        if ((SelectObject(hSdc, hbmp))==NULL)
        {
                DeleteDC(hSdc);
                return FALSE;
        }

        if (GetObject(hbmp, sizeof(BITMAP), &bmp)==0)
        {
                DeleteDC(hSdc);
                return FALSE;
        }


        nHeight=bmp.bmHeight;
        nWidth=bmp.bmWidth;
   
    if (FAILED(lpdds->GetDC(&hDdc)))
        {
                DeleteDC(hSdc);
                return FALSE;
        }
   
    BitBlt(hDdc,0,0,nWidth,nHeight,hSdc,0,0,SRCCOPY);

    DeleteDC(hSdc);

        return TRUE;
}

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20527
发表于 2003-8-6 12:40:00 | 显示全部楼层

Re:紧急求助

感觉你没有用到DDraw的屏幕更新。

另外,这么长的代码很少人愿意看的,实际上这种问题你应该学会利用VC那么强大的调试器来进行代码跟踪,看看到底在哪里闪动了一下。

1

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2004-6-15 14:04:00 | 显示全部楼层

Re:紧急求助


  MyLoadBitmap(lpddsoffscreen);//此函数用于将图片载入内存并在
                                            主SURFACE中显示出来。

  lpddsBack->Blt(NULL, lpddsoffscreen, NULL, DDBLT_WAIT, NULL);
   lpddsPrimary->Flip(NULL,DDFLIP_WAIT);   
   
  

5

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2004-6-15 23:32:00 | 显示全部楼层

Re:紧急求助

没有bilt
同意楼上的~~~~
VC有很强大的跟踪调试功能,多熟悉一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 23:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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