【Visual C++】游戏开发笔记之五——游戏画面绘图(二)绘制位图

以游戏文件来说,使用的位图数量相当多,因此都会先将位图存成文件,等到程序需要时再将文件加载到窗口中。将位图从文件加载带绘图窗口中必须经过一下几个步骤。

<1>从文件中加载位图对象

<2>建立一个与窗口DC兼容的内存DC

<3>内存DC只用步骤1中所建立的位图对象

<4>将内存DC的内容粘贴到窗口DC中,完成显像操作。


下面进行这四个步骤的详细说明:


步骤一:加载位图

要从文件加载位图,常常使用LoadImage()函数。

HANDLE LoadImage( 

    HINSTANCE hinst,  //包含目标位图的DLL或exe文件的模块句柄

LPCTSTR lpszName, 

UINT uType,       

int cxDesired,      

    int cyDesired,      

    UINT fuLoad      

);

下面是该函数参数的详细说明。

▲HINSTANCE  来源实体:包含位图所在的实体,若要加载的位图在硬盘或者资源文件中,此项设置为"NULL"。

▲LPCTSTR 名称:要加载的位图所在的路径与文件名或者资源名称

▲UINT 位图类型:加载位图的类型,有下面三种:

★IMAGE_BITMAP: 加载的位图为一般图文件,扩展名为".bmp"

★IMAGE_CUSOR: 加载的位图为光标图标,扩展名为".cur"

★IMAGE_ICON: 加载的位图为图标,扩展名为".ico"

▲int 加载宽度:位图加载的宽度,单位为像素

▲int 加载高度:位图加载的高度,单位为像素

▲UINT 加载方式:设定位图的加载方式,若是从文件中加载位图,则设为"LR_LOADFROMFILE"


步骤二:建立与窗口DC兼容的内存DC

我们调用CreateCompatible()函数来建立内存DC

HDC CreateCompatibleDC(HDC hdc);  //建立兼容DC

函数中输出的唯一参数就是要与内存DC兼容的目的DC

跟窗口DC一样,内存DC使用后也必须进行释放的操作,释放内存DC所调用的函数为DeleteDC()

DeleteDC(HDC DC名称);            //释放DC


步骤三:选用位图对象

位图对象是GDI的6种对象之一,内存DC选用位图对象的方法和前面介绍的选用画笔或画刷的方式相同,都是通过调用SelectObject()函数来实现。


步骤四:贴图

把内存DC中的位图复制到显示的DC上,即"贴图"。这个操作使用的函数是BitBlt(),后面我们会经常用到他。这个函数的定义如下

BOOL BitBlt(

   int x,            //  目的DC x坐标

   int y,            //  目的DC y坐标

   int nWidth,       //  贴到目的DC的宽度

   int nHeight,      //  贴到目的DC的高度

   CDC* pSrcDC,   //  来源DC

   int xSrc,         //  来源DC x坐标

   int ySrc,         //  来源DC y坐标

   DWORD dwRop  //  贴图方式();

);



下面我们用一个实例来看看如何从文件中加载位图:

  1. #include "stdafx.h"  
  2.   
  3. #include "stdafx.h"  
  4. //全局变量声明  
  5. HINSTANCE hInst;  
  6. HBITMAP hbmp;  
  7. HDC     mdc;  
  8.   
  9. //全局函数的声明  
  10. ATOM                MyRegisterClass(HINSTANCE hInstance);  
  11. BOOL                InitInstance(HINSTANCEint);  
  12. LRESULT CALLBACK    WndProc(HWNDUINTWPARAMLPARAM);  
  13. void                MyPaint(HDC hdc);  
  14.   
  15. //****Winmain函数,程序入口点函数**************************************  
  16. int APIENTRY WinMain(HINSTANCE hInstance,  
  17.                      HINSTANCE hPrevInstance,  
  18.                      LPSTR     lpCmdLine,  
  19.                      int       nCmdShow)  
  20. {  
  21.     MSG msg;  
  22.   
  23.     MyRegisterClass(hInstance);  
  24.   
  25.     if (!InitInstance (hInstance, nCmdShow))   
  26.     {  
  27.         return FALSE;  
  28.     }  
  29.   
  30.     //消息循环  
  31.     while (GetMessage(&msg, NULL, 0, 0))   
  32.     {  
  33.         TranslateMessage(&msg);  
  34.         DispatchMessage(&msg);  
  35.     }  
  36.       
  37.     return msg.wParam;  
  38. }  
  39.   
  40. //****﹚设计一个窗口类,类似填空题,使用窗口结构体*************************  
  41. ATOM MyRegisterClass(HINSTANCE hInstance)  
  42. {  
  43.     WNDCLASSEX wcex;  
  44.   
  45.     wcex.cbSize = sizeof(WNDCLASSEX);   
  46.     wcex.style          = CS_HREDRAW | CS_VREDRAW;  
  47.     wcex.lpfnWndProc    = (WNDPROC)WndProc;  
  48.     wcex.cbClsExtra     = 0;  
  49.     wcex.cbWndExtra     = 0;  
  50.     wcex.hInstance      = hInstance;  
  51.     wcex.hIcon          = NULL;  
  52.     wcex.hCursor        = NULL;  
  53.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);  
  54.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);  
  55.     wcex.lpszMenuName   = NULL;  
  56.     wcex.lpszClassName  = "canvas";  
  57.     wcex.hIconSm        = NULL;  
  58.   
  59.     return RegisterClassEx(&wcex);  
  60. }  
  61.   
  62. //****初始化函数*************************************  
  63. // 1.建立与窗口DC兼容的内存DC  
  64. // 2.从文件加载位图并存至内存DC中  
  65. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)  
  66. {  
  67.     HWND hWnd;  
  68.     HDC hdc;  
  69.   
  70.     hInst = hInstance;  
  71.   
  72.     hWnd = CreateWindow("canvas""绘图窗口" , WS_OVERLAPPEDWINDOW,  
  73.         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);  
  74.   
  75.     if (!hWnd)  
  76.     {  
  77.         return FALSE;  
  78.     }  
  79.   
  80.     MoveWindow(hWnd,10,10,800,600,true);  
  81.     ShowWindow(hWnd, nCmdShow);  
  82.     UpdateWindow(hWnd);  
  83.   
  84.     hdc = GetDC(hWnd);  
  85.     mdc = CreateCompatibleDC(hdc);  
  86.   
  87.     hbmp = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);   
  88.     SelectObject(mdc,hbmp);  
  89.   
  90.     MyPaint(hdc);  
  91.     ReleaseDC(hWnd,hdc);  
  92.   
  93.     return TRUE;  
  94. }  
  95.   
  96. //****自定义绘图函数*********************************  
  97. void MyPaint(HDC hdc)  
  98. {  
  99.     BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY);    //采用BitBlt函数贴图  
  100. }  
  101.   
  102. //****消息处理函数**********************************  
  103. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
  104. {  
  105.     PAINTSTRUCT ps;  
  106.     HDC hdc;  
  107.   
  108.     switch (message)  
  109.     {  
  110.         case WM_PAINT:                      //窗口重绘消息  
  111.             hdc = BeginPaint(hWnd, &ps);  
  112.             MyPaint(hdc);  
  113.             EndPaint(hWnd, &ps);  
  114.             break;  
  115.         case WM_DESTROY:                    //窗口结束消息  
  116.             DeleteDC(mdc);  
  117.             DeleteObject(hbmp);  
  118.             PostQuitMessage(0);  
  119.             break;  
  120.         default:                            //其他消息  
  121.             return DefWindowProc(hWnd, message, wParam, lParam);  
  122.    }  
  123.    return 0;  
  124. }  


将bg.bmp图片放到该工程根目录下,然后进行编译并运行,就可以得到如下窗口:





 


 

笔记五到这里就结束了。


本节源代码请点击这里下载:【Visual C++】Code_Note_5


请大家继续关注【Visual C++】游戏开发笔记系列。

非常希望能与大家一起交流,共同学习和进步。

最后,谢谢大家一直的支持~~~

 

The end

 原文地址:http://blog.csdn.net/zhmxy555/article/details/7335103

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Visual C++游戏开发经典案例详解MP3 MP3是一种常见的音频格式,使用Visual C++开发MP3音乐播放器是一种经典案例。下面将详细介绍这个案例的具体开发过程。 首先,我们需要创建一个MP3音乐播放器的界面。使用Visual C++的MFC(Microsoft Foundation Class)库可以快速构建界面。可以添加按钮来实现播放,暂停,停止和切换歌曲等功能。还可以添加一个列表框来显示当前播放的歌曲列表。 接下来,我们需要添加MP3解码和播放功能。我们可以使用第三方库,如Bass或FFmpeg等来实现音频解码和播放。这些库可以支持各种音频格式,并提供了丰富的API来实现播放器的各种功能。在代码中,我们需要调用相应的函数进行初始化和控制音乐播放。 此外,为了实现更好的用户体验,我们可以添加一些额外的功能。例如,可以添加音乐的进度条来显示当前播放进度,并允许用户拖动进度条设置播放位置。还可以添加音量控制条来调整音量大小。还可以实现快进,快退和循环播放等功能。 为了提高软件的性能和用户体验,我们还可以进行一些优化。例如,可以使用多线程来实现音乐的解码和播放。这样可以避免界面卡顿,同时还能提高整个播放系统的响应速度。还可以使用缓冲技术来减少音频的延迟,让用户感受到更流畅的播放效果。 综上所述,使用Visual C++开发MP3音乐播放器是一个经典的游戏开发案例。通过创建界面,添加音频解码和播放功能,以及优化性能和用户体验,我们可以开发出功能强大,稳定可靠的MP3音乐播放器。这个案例不仅有助于提高编程能力,还能让我们更好地理解音频处理和多媒体应用程序的原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值