注:主要变化是在下面这张位图上的操作

//全局变量
HBITMAP bg, girl;
HDC mdc;
//起始坐标
const int xstart = 50;
const int ystart = 20;

//--------------------------------------------InitInstance() 函数----------------------------------------------
//加载资源
//-------------------------------------------------------------------------------------------------------------
BOOL InitInstance(HINSTANCE hInstance, int nShowCmd)
{
HWND hwnd;
HDC hdc, bufdc;
HBITMAP bmp;
BITMAP bm1, bm2;

//创建窗口第三步:正式创建窗口
//创建窗口函数
hwnd = CreateWindow("GameClass", WINDOW_TITLE, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hwnd)
{
return FALSE;
}
//创建窗口第四步:窗口的移动,显示和更新
MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//调整窗口显示时的位置及窗口的大小
ShowWindow(hwnd, nShowCmd);//设定显示窗口时的状态
UpdateWindow(hwnd);//将窗口绘制于显示设备上

//加载图像
bg = (HBITMAP)LoadImage(NULL, "bg.bmp", IMAGE_BITMAP, 600, 450, LR_LOADFROMFILE);
bmp = (HBITMAP)LoadImage(NULL, "girlmask.bmp", IMAGE_BITMAP, 596, 329, LR_LOADFROMFILE);

GetObject(bg, sizeof(BITMAP), &bm1); //取得bg图像信息

if (bm1.bmBitsPixel != 32 && bm1.bmBitsPixel != 24)
{
MessageBox(NULL, "此程序只能在 32 bit或 24 bit显示模式中运行", "警告", 0);
return FALSE;
}

hdc = GetDC(hwnd);//获得窗口DC
//建立与窗口兼容的位图DC
mdc = CreateCompatibleDC(hdc);
bufdc = CreateCompatibleDC(hdc);
girl = CreateCompatibleBitmap(hdc, 298, 329);

SelectObject(mdc, girl);

//在mdc上进行透明处理
SelectObject(bufdc, bg);
BitBlt(mdc, 0, 0, 298, 329, bufdc, xstart, ystart, SRCCOPY);
SelectObject(bufdc, bmp);
BitBlt(mdc, 0, 0, 298, 329, bufdc, 298, 0, SRCAND);
BitBlt(mdc, 0, 0, 298, 329, bufdc, 0, 0, SRCPAINT);

unsigned char *px1, *px2;

//处理背景图
px1 = new unsigned char[bm1.bmHeight * bm1.bmWidthBytes];
GetBitmapBits(bg, bm1.bmHeight * bm1.bmWidthBytes, px1);

//处理前景图
GetObject(girl, sizeof(BITMAP), &bm2);
px2 = new unsigned char[bm2.bmHeight * bm2.bmWidthBytes];
GetBitmapBits(girl, bm2.bmHeight * bm2.bmWidthBytes, px2);

int x, y, xend, yend;
int i;
int rgb_b;
int PxBytes = bm1.bmBitsPixel / 8;

xend = xstart + 298;
yend = ystart + 329;

//处理背景图像像素颜色
for (y = ystart; y < yend; y++)
{
for (x = xstart; x < xend; x++)
{
rgb_b = y * bm1.bmWidthBytes + x * PxBytes;
//RGB 以背景色乘不透明色70%
px1[rgb_b] = px1[rgb_b] * 0.7;
px1[rgb_b + 1] = px1[rgb_b + 1] * 0.7;
px1[rgb_b + 2] = px1[rgb_b + 2] * 0.7;
}
}

//处理前景图像像素颜色
for (y = 0; y < (bm2.bmHeight); y++)
{
for (x = 0; x < bm2.bmWidth; x++)
{
rgb_b = y * bm2.bmWidthBytes + x * PxBytes;
i = (ystart + y) * bm1.bmWidthBytes + (xstart + x) * PxBytes;
//依次将像素的RGB色彩值乘前景图的不透明度 30%,并与处理过的背景色彩值相加,便完成了半透明色彩的合成
px2[rgb_b] = px2[rgb_b] * 0.3 + px1[i];
px2[rgb_b + 1] = px2[rgb_b + 1] * 0.3 + px1[i + 1];
px2[rgb_b + 2] = px2[rgb_b + 2] * 0.3 + px1[i + 2];
}
}

//重设前景图的颜色(完成半透明)
SetBitmapBits(girl, bm2.bmHeight*bm2.bmWidthBytes, px2);

MyPaint(hdc);
//释放DC及内存
ReleaseDC(hwnd, hdc);
DeleteDC(bufdc);
DeleteObject(bmp);
delete[] px1;
delete[] px2;

return TRUE;
}

//--------------------------------------------MyPaint() 函数---------------------------------------------------
//绘制图形
//-------------------------------------------------------------------------------------------------------------
void MyPaint(HDC hdc)
{
//贴上背景图
SelectObject(mdc, bg);
BitBlt(hdc, 0, 0, 800, 600, mdc, 0, 0, SRCCOPY);

//贴上处理过的半透明图
SelectObject(mdc, girl);
BitBlt(hdc, xstart, ystart, 298, 329, mdc, 0, 0, SRCCOPY);
}

//--------------------------------------------Game_CleanUp() 函数----------------------------------------------
//资源清理函数,在此函数中进行退出前的资源的清理工作
//-------------------------------------------------------------------------------------------------------------
BOOL Game_CleanUp(HWND hwnd)
{
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(girl);
return TRUE;
}

如需整体运行框架,请点击: 游戏框架

游戏开发的梦想

梦开始的地方

008--VS2013 C++ 位图半透明化(另一种显示)的更多相关文章

  1. 007--VS2013 C++ 显示位图半透明化

    以后所有图片都放在根目录下: 如有另放,会特别注明 //全局变量HBITMAP bg,girl;HDC mdc; //起始坐标const int xstart = 50;const int ystar ...

  2. 009--VS2013 C++ 显示位图部分透明化

    其实这个更简单,只是把上一编文章的半透明化的代码去掉就可以啦 还是原来那张图片: //全局变量HBITMAP bg, girl;HDC mdc;//起始坐标const int xstart = 50; ...

  3. 006--VS2013 C++ 加载其他格式图片,并显示半透明化

    //--------------------------------------------MyPaint() 函数------------------------------------------ ...

  4. nwjs解决页面透明化,启动时显示白屏的问题

    这些天在弄nwjs还好能访问外网,可以看到官方的文档,要不然真是欲哭无泪了,找不到相关的文档解决不了问题.主要说说怎么页面透明化的时候,出现白屏一闪问题吧.主要工具: AngularJS+node+n ...

  5. VS2013设置护眼背景颜色

    打开VS2013 —> 工具 —> 选项 —> 环境 —> 字体和颜色 —> 选择显示项中的纯文本 —> 项目背景 —> 自定义—> 色调位85.饱和度 ...

  6. CDC的StretchBlt函数载入位图时图片失真问题

    最近遇到加载的bmp图片出现失真问题,查找得知需要用SetStretchBltMode函数设置拉伸模式. 函数原型:int SetSTretchBltMode(HDC hdc, int iStretc ...

  7. 第14章 位图和位块传输_14.4 GDI位图对象(1)

    14.4.1 创建DDB (1)创建 HBITMAP= CreateBitmap(cx,cy,cPlanes,cBitsPixel,lpBits); 参数 说明 cx,cy 指定位图宽度和高度,单位为 ...

  8. 位图文件格式及linux下C语言来操作位图文件

    说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...

  9. AS3游戏中可视对象上限及位图相关的内存消耗实测

    前些天连续做了一些测试,以加深对AS3的掌握和在项目中对 游戏 性能.效率优化方面的一些处理,有很多测试实际意义不大,都不过是证明一些猜想是正确的,除此没有什么. 但前天进行的一系列测试中,有一些对游 ...

随机推荐

  1. spring注解 构造函数问题

    因为类首先被Spring实例化的时候,会调用构造函数.只有实例化后,才会注入.你等于没注入就调用了,所以报错. 把DAO实现类注入到service实现类中,把service的接口(注意不要是servi ...

  2. WF4 持久化 <第四篇>

    一.基础示例 WF4 默认支持SQLServer的持续化,首先要执行目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的脚本: SqlPer ...

  3. 轻松找回Win7桌面“消失”的IE9图标

    打开注册表编辑器(Win+R打开运行窗口,运行regedit命令),依次展开到 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion ...

  4. Multithreading annd Grand Central Dispatch on ios for Beginners Tutorial-多线程和GCD的入门教程

    原文链接:Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial Have you ever written a ...

  5. ios开发之OC基础-ios开发学习路线图

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  6. Magento修改css样式

    Magento研究了第四天才开始搞明白怎么运行. 首先对于前端开发来说要修改样式的话需要运行: grunt less:luma 如果提示: 那就说明grunt配置的路径不对,默认是英文的,如果我们用中 ...

  7. poj1936_All in All

    时间复杂度O(n) #include <stdio.h> #include <string.h> int main(){ int al,bl,i,j; +]; +]; whil ...

  8. Shiro使用总结

    Shiro已经添加到项目中,现阶段管理两个功能: 1.身份验证:(已经能够满足现阶段需求) 2.权限管理: 权限管理,需要在界面中加一些标签,后台角色.资源的管理也需要整理好,然后在前端添加管理. 1 ...

  9. 022 ARM寄存器详解

    R13:堆栈指针寄存器 SP R14:链接寄存器 LR R15:程序计数器 PC指针 CPSR:当前程序状态寄存器 SPSR:备份程序状态寄存器

  10. Web前端代码规范与页面布局

    一.    规范目的: 为提高工作效率,便于后台人员添加功能及前端后期优化维护,输出高质量的文档,在网站建设中,使结构更加清晰,代码简明有序,有一个更好的前端架构,有利于SEO优化.   二.     ...