用WindowedMode显示位图图象(转)[@more@]   前面所所讲过的例子里,整个画面全部被 DirectX 独占,这种模式叫 "Full Screen Mode(全屏模式)",需要高速描绘的游戏程序,很多都使用全屏模式。   这回我们让 DirectX 程序与其他 Windows 程序同屏显示。   这个模式其实就是标准 Windows 程序的运行方式,所以称作 "Windowed Mode(窗口模式)" 。在窗口模式下,参照同时运行的其它程序来切换窗口、移动、调整大小等因素都必须考虑。   以窗口模式初始化 DirectX 的代码。   "320,240" 是窗口的初始大小,这里让它跟要显示的图象大小一样:   if (FAILED(hr = g_pDisplay->CreateWindowedDisplay(hWnd,320,240)))   {  ERMSG("Failed initializing DirectDraw.");   return hr;   }      窗口模式的 CALLBACK 函数。   用它来处理窗口的移动、调整大小等事件:   //★ MainWndProc()   LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)   {  switch (msg)   {  case WM_KEYDOWN:   PostMessage(hWnd,WM_CLOSE,0,0);   return 0L;   case WM_PAINT:   if (g_pDisplay)   {  // Display the new position of the sprite   if (DisplayFrame() == DDERR_SURFACELOST)   {  PostMessage(hWnd,WM_CLOSE,0,0);   }   }   break;   case WM_MOVE:   if (g_pDisplay)  g_pDisplay->UpdateBounds();   return 0L;   case WM_SIZE:   // Check to see if we are losing our window...   if (SIZE_MAXHIDE==wParam||SIZE_MINIMIZED==wParam) g_bActive= FALSE;   else  g_bActive= TRUE;   if (g_pDisplay)  g_pDisplay->UpdateBounds();   break;   case WM_DESTROY:   // Cleanup and close the app   FreeDirectDraw();   PostQuitMessage(0);   return 0L;   }   return DefWindowProc(hWnd, msg, wParam, lParam);   }      本章的例子编译成功后,试试用鼠标拖曳来改变窗口大小。图象的大小、 Aspect Ratio(纵横比) 会适应窗口的大小而改变。   如果把 "WM_SIZE:" 下面这行注释起来跳过编译,再改变窗口大小的时候图象的大小就不会随着改变了:   //  if (g_pDisplay)  g_pDisplay->UpdateBounds();         其它的跟以前的程序一样。   窗口模式也能使用 Common 文件夹下那4个文件,跟上一节一样,我们也把它复制到工程文件夹。   下面说明工程的创建方法。      1. 新建一个 Win32 Application 空白工程,命名为 "Winmode"。      2. 向工程中新建一个 C++ Source File ,命名为 "winmode" ,向其中键入篇末附带的源程序。      3. 把下面4个文件复制到工程文件夹(我是 G:DirectX 8Winmode):   E:MssdksamplesMultimediaCommonincludeddutil.h   E:MssdksamplesMultimediaCommonincludedxutil.h   E:MssdksamplesMultimediaCommonsrcddutil.cpp   E:MssdksamplesMultimediaCommonsrcdxutil.cpp   然后选择菜单 [Project|工程]-[Add To Project|添加到工程]-[Files...|文件...] ,向工程中添加这4个文件。      4. 准备合适的图象文件(我是在 G:DirectX 8 下放了张 "旷野中的小屋.bmp")。   我用的图象大小是 320*240 ,实际上随便多大都可以。下面是读取图象的代码,请改成你自己准备的路径和文件名:   if (FAILED(hr = g_pDisplay->CreateSurfaceFromBitmap   (&g_pBmpSurface,"G:DirectX 8旷野中的小屋.bmp",0,0)))      5. 选择菜单 [Project|工程]-[Settings...|设定...] 打开[Project Settings|工程设定] 面板,点击 [Link|链接] 标签,向 [Object/library modules|对象、库模块] 栏内添加下面4个库文件:   dxguid.lib   ddraw.lib   dxerr8.lib   winmm.lib      6. 编译并执行!   源程序:   /************************************************************************/   /*★ 用 Windowed Mode(窗口模式) 显示位图图象   2001-01-10 前田 稔 ★*/   /************************************************************************/   #define   STRICT   #include     #include     #include     #include  "ddutil.h"      // Defines, constants, and global variables   #define SAFE_DELETE(p) { if (p) { delete (p);   (p)=NULL; } }   #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }   #define ERMSG(x)    MessageBox(hWnd, x, "DirectDraw Samplee", MB_OK);      CDisplay*  g_pDisplay  = NULL;   CSurface*  g_pBmpSurface = NULL;   BOOL    g_bActive   = FALSE;      // Function-prototypes   LRESULT   CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);   HRESULT   WinInit(HINSTANCE hInst, int nCmdShow, HWND* phWnd);   HRESULT   InitDirectDraw(HWND hWnd);   VOID    FreeDirectDraw();   HRESULT   DisplayFrame();      //★ Windows Main   int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)   {  MSG   msg;   HWND  hWnd;      if (FAILED(WinInit(hInst, nCmdShow, &hWnd)))  return FALSE;      if (FAILED(InitDirectDraw(hWnd)))   {  if (g_pDisplay)   g_pDisplay->GetDirectDraw()->SetCooperativeLevel(NULL, DDSCL_NORMAL);      ERMSG("DirectDraw init failed. The sample will now exit.");   return FALSE;   }      while(TRUE)   {  if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))   {  if (0 == GetMessage(&msg, NULL, 0, 0)) return (int)msg.wParam;   TranslateMessage(&msg);   DispatchMessage(&msg);   }   else   {  if (g_bActive)   {  if (FAILED(DisplayFrame()))   {  SAFE_DELETE(g_pDisplay);   ERMSG("Displaying the next frame failed. The sample will now exit.");   return FALSE;   }   }   else  WaitMessage();   }   }   }      //★ WinInit()   HRESULT WinInit(HINSTANCE hInst, int nCmdShow, HWND* phWnd)   {  WNDCLASS wc;   HWND   hWnd;      // Register the Window Class   wc.lpszClassName = TEXT("BMP View");   wc.lpfnWndProc  = MainWndProc;   wc.style     = CS_VREDRAW | CS_HREDRAW;   wc.hInstance   = hInst;   wc.hIcon     = LoadIcon(NULL,IDI_APPLICATION);   wc.hCursor    = LoadCursor(NULL, IDC_ARROW);   wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);   wc.lpszMenuName = NULL;   wc.cbClsExtra  = 0;   wc.cbWndExtra  = 0;      if (RegisterClass(&wc) == 0)  return E_FAIL;      // Create and show the main window   hWnd = CreateWindowEx(0, TEXT("BMP View"), TEXT("WindowedMode"),   WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,   CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);   if (hWnd==NULL)  return E_FAIL;      ShowWindow(hWnd, nCmdShow);   UpdateWindow(hWnd);   *phWnd = hWnd;      return S_OK;   }      //★ InitDirectDraw()   HRESULT InitDirectDraw(HWND hWnd)   {  HRESULT       hr;      g_pDisplay = new CDisplay();   if (FAILED(hr = g_pDisplay->CreateWindowedDisplay(hWnd,320,240)))   {  ERMSG("Failed initializing DirectDraw.");   return hr;   }      // Create a surface, and draw a bitmap resource on it.   if (FAILED(hr = g_pDisplay->CreateSurfaceFromBitmap   (&g_pBmpSurface,"G:DirectX 8旷野中的小屋.bmp",0,0)))   return hr;      return S_OK;   }      //★ FreeDirectDraw()   VOID FreeDirectDraw()   {  SAFE_DELETE(g_pBmpSurface);   SAFE_DELETE(g_pDisplay);   }      //★ MainWndProc()   LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)   {  switch (msg)   {  case WM_KEYDOWN:   PostMessage(hWnd,WM_CLOSE,0,0);   return 0L;   case WM_PAINT:   if (g_pDisplay)   {  // Display the new position of the sprite   if (DisplayFrame() == DDERR_SURFACELOST)   {  PostMessage(hWnd,WM_CLOSE,0,0);   }   }   break;   case WM_MOVE:   if (g_pDisplay)  g_pDisplay->UpdateBounds();   return 0L;   case WM_SIZE:   // Check to see if we are losing our window...   if (SIZE_MAXHIDE==wParam||SIZE_MINIMIZED==wParam) g_bActi

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-952196/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-952196/

用WindowedMode显示位图图象(转)相关推荐

  1. 解决导入markdown时本地图片无法显示问题——图床

    解决导入markdown时本地图片无法显示问题--图床 图床工具: PicGo 图片服务器:Gitee 辅助工具:Node.js 14.17.6 图床: 一般是指储存图片的服务器,有国内和国外之分.国 ...

  2. ImageView显示长图

    显示长图失败 我们知道,ImageView经常用来显示一些位图,但是不是所有的图片都能够正常显示的,很明显不是的,当图片超过了一定的大小之后,你会发现,调用setImageBitmap(Bitmap ...

  3. 用python tkinter显示Mandelbrot图

    我前面已经讲过了用Matlab显示Mandelbrot图的方法,原理在那里也说的,链接地址:http://blog.csdn.net/whoispo/article/details/49557823, ...

  4. 桌面新建文件夹不显示缩图_如何在Windows 10桌面上创建不可见的文件夹

    桌面新建文件夹不显示缩图 Have you ever wanted to hide files right under someone's nose? With this digital parlor ...

  5. Echarts显示行政区域图并上色

    Echarts要显示行政区域图有几种方式,这里使用type: 'map'的方式,前提是有geojson数据,这个数据的获取可以从阿里云获取,高德提供的数据 http://datav.aliyun.co ...

  6. Android显示九宫图(自定义圆角,仿微信九宫格图)

    详细解析Android显示九宫图(自定义圆角,仿微信九宫格图) 这是一个自定义九宫格图片框架,里面有设置圆角大小,还有当图片一张的时候控件自定义的大小,图片的间隔,四张图片的时候图片自定义为两行两列等 ...

  7. .Net C# 发送带背景图html邮件(解决Outlook不显示背景图问题)

    发送带背景图html邮件(解决Outlook不显示背景图问题) (二)示例背景图 (三)示例定义好的html邮件图 (四)html代码 (五)C#邮件发送代码(示例:控制台应用程序) 1.考虑兼容性问 ...

  8. DEDE列表调用有缩图显示缩图,无缩图则不显示缩图

    在list_article.htm模板页里,有文章列表没有图片,但是前面会显示"无缩略图",就是当没有图片的时候,怎么样去掉这个"无缩略图"的原始默认缩图, 下 ...

  9. 世嘉MD游戏开发【五】:显示Tile图块

    显示Tile图块,首先要有tile图块,这就要用到一个小工具了,叫Sega Genesis Tile Designer,软件界面如下: 看起来很复杂,其实自己亲自操作一下几分钟就能搞懂了,都是些很基础 ...

最新文章

  1. pip install nmslib 失败 (error: command ‘x86_64-linux-gnu-gcc‘ failed with exit status 1)
  2. 新生男婴自带新冠抗体,感染者母亲如今抗体消失,医生:抗体转移了
  3. 日志分析logstash插件-grok详解
  4. 未能找到路径的一部分_车辆路径规划三种MIP模型
  5. 手机版腐蚀rust_手机进水后黑屏,该怎么办?切忌做这几件事
  6. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
  7. 小白python教学视频教程_小白零基础入门Python开发全套完整版
  8. Mybatis中出现java.sql.SQLException: 无效的列类型: 1111
  9. (翻译)Entity Framework技巧系列之一 - Tip 1 - 5
  10. matlab/simulink中带参数的S-Function(S函数)的写法
  11. 分享个最终幻想勇气启示录脚本,手游上能一键推图自动升级
  12. 计算机log是代表什么,Log是什么文件?Log文件可以删除吗?
  13. 【视频检测】FlowNet: Learning Optical Flow with Convolutional Networks
  14. ip地址合不合法怎么看_如何判断IP地址的合法性
  15. you need to install the latest version of Visual Studio
  16. linux 秒数转时间,linux下如何把时间转成秒数,或把秒数转换成标准时间格式
  17. 框架里面的标签采集不到怎么办_怎么做微信生态的全数据采集和打通?
  18. 设计师都在看的全球设计网站,你居然还不知道!
  19. 取消Wince App 应用启动动画和隐藏分区注册表项
  20. 浅谈移动端Vin码识别技术

热门文章

  1. 每行输出5个java_在JAVA中,如何实现输出的每行只显示5个数
  2. 【js】斜率:知道两点坐标,求两点间运动每秒途径坐标
  3. Linux查容器编码,自己动手写docker笔记(4)构造简单实现run命令版本的容器
  4. 鸿蒙系统搭载麒麟990处理器,华为P40系列曝光 或搭载麒麟990处理器
  5. Ubuntu(Linux)下创建快捷方式
  6. 求一个外贸企业邮箱账号,企业邮箱怎么操作撤回邮件?
  7. npskins CSGO开箱 | CSGO皮肤直接取回网页开箱子网站
  8. android webview加载黑屏,华为10手机打开Webview ANR 黑屏问题
  9. linux同步icloud日历,而从创建日历应用的iCloud日历同步问题(iCloud calendar synchronizat...
  10. 随机模拟滚动QQ中奖信息的代码