DX笔记之五------游戏画面绘图之绘制位图
本系列文章由zhmxy555编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7335103
共四步
步骤一:加载位图
步骤二:建立与窗口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()函数来实现。
GDI对象有:画笔,画刷,位图,字体,区域及调色板等。
步骤四:贴图
把内存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 <windows.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 = TEXT("canvas");
wcex.hIconSm = NULL; return RegisterClassEx(&wcex);
} //****初始化函数*************************************
// 1.建立与窗口DC兼容的内存DC
// 2.从文件加载位图并存至内存DC中
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HDC hdc; hInst = hInstance; hWnd = CreateWindow(TEXT("canvas"), TEXT("绘图窗口") , 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);//窗口DC
mdc = CreateCompatibleDC(hdc);//与窗口兼容的内存DC hbmp = (HBITMAP)LoadImage(NULL,TEXT("bg.bmp"),IMAGE_BITMAP,800,600,LR_LOADFROMFILE); //Loads an icon, cursor, animated cursor, or bitmap
//加载图标,光标,动画光标,或位图;加载位图 SelectObject(mdc,hbmp);//选用GDI对象,返回先前使用的GDI对象
//选用位图对象; MyPaint(hdc);//贴图 ReleaseDC(hWnd,hdc);//删除GDI对象删除成功返回布尔值“ture”,若失败返回“FALSE” 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;
}
贴一下成果

感觉自己萌萌哒!感谢浅墨,哈哈哈。。。
DX笔记之五------游戏画面绘图之绘制位图的更多相关文章
- DX笔记之六------游戏画面绘图之透明特效的制作方法
原文链接:http://blog.csdn.net/zhmxy555/article/details/7338082 透明效果 由于所有的图文件都是以矩形来储存的,我们也许会需要把一张怪兽图片贴到窗口 ...
- matlab学习笔记之五种常见的图形绘制功能
分类: 离散数据图形绘制 函数图形绘制 网格图形绘制 曲面图形绘制 特殊图形绘制 本文重点介绍matlab五种图形绘制方法的后三种. 一.网格图形绘制 以绘制函数z=f(x,y)三维网格图为例,下面为 ...
- 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...
- 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...
- cocos2d-x学习笔记(18)--游戏打包(windows平台)
cocos2d-x学习笔记(18)--游戏打包(windows平台) 之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ...
- Delphi GDI对象之绘制位图
http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难, ...
- 【Visual C++】游戏编程学习笔记之五:单一背景滚动
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
- 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...
随机推荐
- 如何解析复杂的C语言声明
C语言中有时会出现复杂的声明,比如 char * const * (*next) (); //这是个什么东东? 在讲复杂声明的分析方法前,先来个补充点. C语言变量的声明始终贯彻两点 : ...
- TagHelper
TagHelper是怎么实现的 众所周知,在asp.net core中编写Razor视图的时候,用了一种新的写法--TagHelper 那这个TagHelper是怎么回事呢? 首先来看看TagHe ...
- JavaScript常用
打印日志 console.log 类型判断 第一种方式var type = Object.prototype.toString.call(list);console.log(type);第二种方式ty ...
- C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数
问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代 ...
- Thinking in C++: 第1章 为什么C++会成功
本文内容摘抄自C++经典书籍:<Thinking in C++> 操作概念:OOP程序像什么 我们已经知道,用C 语言编写的过程程序就是一些数据定义和函数调用.要理解这种程序的含义,程 ...
- 学习DNS路上之CloudXNS
使用CloudXNS已经有两年了,趁着他们现在做活动的机会也发表一下这两年来使用感受与CloudXNS的变化,也对我学习使用的一次总结. 简介 CloudXNS是北京快网开发的一套授权DNS系统, 用 ...
- 禁止浏览器发送referer
有时候我们需要把其他网站的链接爬取到自己网站,比如各种信息集成网站. 有些网站会有防盗链的措施,我们无法“引用”他人链接(这种情况暂时不考虑),如果网站没有防盗链措施,那就恭喜了! 但是,为了不让“被 ...
- 解决Qt5.7.0 cannot find -lGL
很久没用Qt了,这次要做一个协议编辑器,在ubuntu 14.04上安装了最新版本的Qt 5.7.0.界面改用扁平化风格,第一感觉还不错.按默认步骤创建了一个gui程序,编译运行,报了一个错:cann ...
- js高级教程第3版笔记(我的理解)陆续更新中
js基础语法'use strict'(严格模式)定义变量var object;只声明未赋值,默认值为undefined;var object1=值;声明并赋值;function fun(a){这样也叫 ...
- java 存储oracle的clob字段
项目中有很长的字符创需要存储,用到了oracle的clob字段,直接很长的字符串插入到clob字段中会报字符过长的异常,于是便寻求解决方案.看到这个博客写的还不错 首先,创建一个含CLOB字段的表: ...