游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2559|回复: 1

学VC、编游戏第二章问题。

[复制链接]

1

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2008-8-15 10:59:00 | 显示全部楼层 |阅读模式
在学VC、编游戏第二章“我来了”之中发现一个问题,百思不得其解。
以下是书中的一部分代码,我把它拷贝下来了。
============================================================================================

  1. void CMyDlg::OnOK() //确定键,[类向导中定义生成]
  2. {        GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);//隐藏文本框
  3.         CClientDC dc(this);                //
  4. //A、显示文字----------------------------------------------
  5.         SetTextColor(MemDC,RGB(255,255,255));        //设置地图设备场景字色
  6.         SetBkMode(MemDC,TRANSPARENT);                //字为透明方式
  7.         cc="哈哈,我来了!!!";                        //设文字内容
  8.         TextOut(MemDC,150,100,cc,lstrlen(cc));        //在MemDC显示文字
  9.         BitBlt(dc.m_hDC,0,0,400,300,MemDC,0,0,SRCCOPY);//将MemDC的图形在当前屏幕上显出
  10. //B、显示角色------------------------------------------------------
  11.         cc.Format("%s人/c%05d.bmp",dir,p);        //设人物图片名
  12.         if(loadbmp(cc)==FALSE)                //调BMP图片       
  13.                         {AfxMessageBox(cc+"没找到!");return;}
  14.         SelectObject(MemDC,bit);                //设备相关位图关联到暂存设备场景
  15.         BitBlt(dc.m_hDC,200,160,w,h,MemDC,0,0,SRCCOPY);//将MemDC的图形在当前屏幕上显出
  16.        
  17. //        CDialog::OnOK();
  18. }
复制代码

==================================================================================
程序运行时第一次按[确定]键是正常的。
但是我第二次按[确定]键时,人物图片出现在了地图场景的0,0处。
按程序运行来讲,是不会出现在0,0处的。
因为BitBlt(dc.m_hDC,200,160,w,h,MemDC,0,0,SRCCOPY);这一句已经指定了位置(200,160)。
查看bitblt函数,也没发现问题。
第一次显示正确,而第二次不正确,和显示人物图片相关的语句也就是几条。
怀疑是SelectObject(MemDC,bit);的问题,但是到底有什么问题还不清楚。
后来在BitBlt(dc.m_hDC,200,160,w,h,MemDC,0,0,SRCCOPY);这句后又加了一句:
DeleteDC(MemDC);
再试,问题消失。百思不得其解。

1

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2008-8-15 12:05:00 | 显示全部楼层

Re:学VC、编游戏第二章问题。

终于发现问题所在了!!!!!!!
当第一次点击[确定]的时候.
第一个BitBlt(dc.m_hDC,0,0,400,300,MemDC,0,0,SRCCOPY);
这时SelectObject(MemDC,bit);所指的是地图.
可以看CMyDlg::OnInitDialog()中的代码,有个SelectObject(MemDC,bit);
CMyDlg::OnOK() 中的.SelectObject(MemDC,bit);指的是人物图片.
所以第一次点击[确定]时,显示是正确的.
当第二次点击时
SelectObject(MemDC,bit);指的还是人物图片.
第一个BitBlt(dc.m_hDC,0,0,400,300,MemDC,0,0,SRCCOPY);
显示的就是人物图片.
第二个BitBlt(dc.m_hDC,200,160,w,h,MemDC,0,0,SRCCOPY);//
显示的也是人物图片,相当于人物图片显示了两遍.

解决办法:
在BitBlt(dc.m_hDC,0,0,400,300,MemDC,0,0,SRCCOPY); 代码前加上

  1.            loadbmp(dir+"地面.BMP");       
  2.         SelectObject(MemDC,bit);
复制代码
         
即可.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 14:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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