游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3294|回复: 8

用DirectDraw显示位图问题

[复制链接]

1

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2006-6-1 14:08:00 | 显示全部楼层 |阅读模式
我用一个DirectDrawSurface作为主页,另一个DirectDrawSurface用CreateSurfaceFromFile方法载入位图,然后用Blt方法传送位图到主页中,可结果为什么只是闪了一下,就没有了呢,
没有我想要的效果(显示图片)急啊,在这先谢了~

1

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-6-1 15:45:00 | 显示全部楼层

Re:用DirectDraw显示位图问题

没有人提供一个线索吗?

9

主题

99

帖子

124

积分

注册会员

Rank: 2

积分
124
QQ
发表于 2006-6-1 18:40:00 | 显示全部楼层

Re:用DirectDraw显示位图问题

全屏模式还是窗口模式
filp还是blt
blt lock了么

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2006-6-1 19:23:00 | 显示全部楼层

Re:用DirectDraw显示位图问题

楼主提供信息太少。

你是使用哪种方式绘图?

1

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-6-1 23:12:00 | 显示全部楼层

Re: 用DirectDraw显示位图问题

不是全屏模式的,代码如下,省略设置窗口和图片框属性:
Option Explicit
Option Base 0

Dim WithEvents picture1 As PictureBox

Dim DX As DirectX7
Dim DDraw As DirectDraw7
Dim DDrawSurfacePrimary As DirectDrawSurface7
Dim ddsdPrimary As DDSURFACEDESC2
Dim DDClip As DirectDrawClipper
Dim DDSBackGround As DirectDrawSurface7
Dim ddsdBackGround As DDSURFACEDESC2

Dim DDrawSurfaceSecond As DirectDrawSurface7
Dim ddsdSecond As DDSURFACEDESC2


Private Sub Form_Load()
   
    With Form1
        ...
    End With
   
    Set picture1 = Controls.Add("VB.PictureBox", "picture1")
    With picture1
    ...
    End With
   
        
    Dim rSecond As RECT
    Set DX = New DirectX7
    Set DDraw = DX.DirectDrawCreate("")
    DDraw.SetCooperativeLevel picture1.hWnd, DDSCL_NORMAL
   
    ddsdPrimary.lFlags = DDSD_CAPS 'Or DDSD_WIDTH Or DDSD_HEIGHT
   
    ddsdPrimary.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE
    ddsdPrimary.lWidth = 640
    ddsdPrimary.lHeight = 480
    Set DDrawSurfacePrimary = DDraw.CreateSurface(ddsdPrimary)
    Set DDClip = DDraw.CreateClipper(0)
    DDClip.SetHWnd picture1.hWnd
    DDrawSurfacePrimary.SetClipper DDClip
   
    ddsdSecond.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
    ddsdSecond.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
    ddsdSecond.lWidth = 640
    ddsdSecond.lHeight = 480
   
    Set DDrawSurfaceSecond = DDraw.CreateSurface(ddsdSecond)
    rSecond.Right = 640
    rSecond.Bottom = 480
    'DDrawSurfacePrimary.Blt rSecond, DDrawSurfaceSecond, rSecond, DDBLT_WAIT
    ddsdBackGround.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
    ddsdBackGround.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
    ddsdBackGround.lWidth = 640
    ddsdBackGround.lHeight = 480
   
   Set DDSBackGround = DDraw.CreateSurfaceFromFile(App.Path & "\backGround.bmp", ddsdBackGround)
   DDrawSurfaceSecond.Blt rSecond, DDSBackGround, rSecond, DDBLT_WAIT
   
   
   
   DDrawSurfacePrimary.Blt rSecond, DDrawSurfaceSecond, rSecond, DDBLT_WAIT
   
    'DDrawSurfaceSecond.BltFast 0, 0, DDrawSurfacePrimary, rSecond, DDBLTFAST_WAIT
End Sub

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-6-2 05:14:00 | 显示全部楼层

Re:用DirectDraw显示位图问题

你只画一次,当然只闪一下啊
应该要用do...loop循环,不停的画才行

1

主题

4

帖子

10

积分

新手上路

Rank: 1

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

Re: Re:用DirectDraw显示位图问题

liiir1985: Re:用DirectDraw显示位图问题

你只画一次,当然只闪一下啊
应该要用do...loop循环,不停的画才行

以前用GDI绘图的时候好像不是这个样子的,肯定是我理解有误,
请DX指点啊~~

6

主题

14

帖子

20

积分

注册会员

Rank: 2

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

Re:用DirectDraw显示位图问题

哦,你学的是VB。我学的是C++。

vb中好象有一个“定时”控件。

DX画图每秒不能少于30帧,

1000毫秒=1秒
1000毫秒/30帧≈33毫秒

你可以把“定时控件”设置为没33毫秒执行一次“翻页”或Bit。

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-6-5 02:11:00 | 显示全部楼层

Re:用DirectDraw显示位图问题

DX是需要不停的往屏幕上面画图才能正常显示图像,所以你得用do...loop或者用timer来重复画,否则就会像你看到的,闪一下就没了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 16:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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