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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

本系列文章由zhmxy555编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7335103

作者:毛星云    邮箱: happylifemxy@qq.com    欢迎邮件交流编程心得



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

<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  //  贴图方式();

);



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

#include "stdafx.h"#include "stdafx.h"//全局变量声明HINSTANCE hInst;HBITMAP hbmp;HDC  mdc;//全局函数的声明ATOM    MyRegisterClass(HINSTANCE hInstance);BOOL    InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);void    MyPaint(HDC hdc);//****Winmain函数,程序入口点函数**************************************int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){ MSG msg; MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow))  {  return FALSE; } //消息循环 while (GetMessage(&msg, NULL, 0, 0))  {  TranslateMessage(&msg);  DispatchMessage(&msg); }  return msg.wParam;}//****﹚设计一个窗口类,类似填空题,使用窗口结构体*************************ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX);  wcex.style   = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra  = 0; wcex.cbWndExtra  = 0; wcex.hInstance  = hInstance; wcex.hIcon   = NULL; wcex.hCursor  = NULL; wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "canvas"; wcex.hIconSm  = NULLreturn RegisterClassEx(&wcex);}//****初始化函数*************************************// 1.建立与窗口DC兼容的内存DC// 2.从文件加载位图并存至内存DC中BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWnd; HDC hdc; hInst = hInstance; hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,  CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) {  return FALSE; } MoveWindow(hWnd,10,10,800,600,true); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); hbmp = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);  SelectObject(mdc,hbmp); MyPaint(hdc); ReleaseDC(hWnd,hdc); return TRUE;}//****自定义绘图函数*********************************void MyPaint(HDC hdc){ BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY); //采用BitBlt函数贴图}//****消息处理函数**********************************LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch (message) {  case WM_PAINT:      //窗口重绘消息   hdc = BeginPaint(hWnd, &ps);   MyPaint(hdc);   EndPaint(hWnd, &ps);   break;  case WM_DESTROY:     //窗口结束消息   DeleteDC(mdc);   DeleteObject(hbmp);   PostQuitMessage(0);   break;  default:       //其他消息   return DefWindowProc(hWnd, message, wParam, lParam);   }   return 0;}


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





 


 

笔记五到这里就结束了。


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


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

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

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

 

The end

 


 

  1.   
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
 
           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值