007--VS2013 C++ 显示位图半透明化
以后所有图片都放在根目录下:
如有另放,会特别注明
//全局变量
HBITMAP bg,girl;
HDC mdc;
//起始坐标
const int xstart = 50;
const int ystart = 20;
//--------------------------------------------InitInstance() 函数----------------------------------------------
//加载资源
//-------------------------------------------------------------------------------------------------------------
BOOL InitInstance(HINSTANCE hInstance, int nShowCmd)
{
HWND hwnd;
HDC hdc;
//创建窗口第三步:正式创建窗口
//创建窗口函数
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);//将窗口绘制于显示设备上
hdc = GetDC(hwnd);
mdc = CreateCompatibleDC(hdc);
BITMAP bm1, bm2;
unsigned char *px1, *px2;
//处理背景图
bg = (HBITMAP)LoadImage(NULL, "bg.bmp", IMAGE_BITMAP, 800, 600, LR_LOADFROMFILE);
GetObject(bg, sizeof(BITMAP), &bm1);
if (bm1.bmBitsPixel != 32 && bm1.bmBitsPixel != 24)
{
MessageBox(NULL, "此程序只能在 32 bit或 24 bit显示模式中运行", "警告", 0);
return FALSE;
}
px1 = new unsigned char[bm1.bmHeight * bm1.bmWidthBytes];
GetBitmapBits(bg, bm1.bmHeight * bm1.bmWidthBytes, px1);
//处理前景图
girl = (HBITMAP)LoadImage(NULL, "girl.bmp", IMAGE_BITMAP, 300, 350, LR_LOADFROMFILE);
GetObject(girl, sizeof(BITMAP), &bm2);
px2 = new unsigned char[bm2.bmHeight * bm2.bmWidthBytes];
GetBitmapBits(girl, bm2.bmHeight * bm2.bmWidthBytes, px2);
int xend, yend;
int x, y, i; //循环变量
int rgb_b;
int PxBytes = bm1.bmBitsPixel / 8;
xend = xstart + 300;
yend = ystart + 350;
//处理背景图像像素颜色
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及内存DC
ReleaseDC(hwnd, hdc);
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, 300, 350, mdc, 0, 0, SRCCOPY);
}
//--------------------------------------------Game_CleanUp() 函数----------------------------------------------
//资源清理函数,在此函数中进行退出前的资源的清理工作
//-------------------------------------------------------------------------------------------------------------
BOOL Game_CleanUp(HWND hwnd)
{
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(girl);
return TRUE;
}
如需整体运行框架,请点击: 游戏框架
游戏开发的梦想
梦开始的地方
007--VS2013 C++ 显示位图半透明化的更多相关文章
- 009--VS2013 C++ 显示位图部分透明化
其实这个更简单,只是把上一编文章的半透明化的代码去掉就可以啦 还是原来那张图片: //全局变量HBITMAP bg, girl;HDC mdc;//起始坐标const int xstart = 50; ...
- 008--VS2013 C++ 位图半透明化(另一种显示)
注:主要变化是在下面这张位图上的操作 //全局变量HBITMAP bg, girl;HDC mdc;//起始坐标const int xstart = 50;const int ystart = 20; ...
- 【Android Developers Training】 55. 序言:高效显示位图
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- emwin之BUTTON控件显示位图和流位图出现卡顿延迟的情况
@2019-05-16 [问题] 参照Armfly的emwin教程第46章 BUTTON-按钮控件显示位图和流位图,实际使用时导致界面切换卡顿延迟较大的情况 [环境] F429IGT6 + W9825 ...
- CImage显示位图与CDC双缓冲冲突,使用路径层解决.
2010年04月29日 星期四 20:35 位图闪的问题困扰我很久了,因为程序的需要,我显示位图的方式是CImage类. 如果从CImage转到CBitmap,之后使用Attach到是可以,但我发现这 ...
- 006--VS2013 C++ 加载其他格式图片,并显示半透明化
//--------------------------------------------MyPaint() 函数------------------------------------------ ...
- 【Android Developers Training】 60. 在你的UI中显示位图
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- VS2013只显示会附加到进程,无法启动调试
今天在使用VS2013的时候,打开突然发现,只显示附加到进程,无法进行调试,调试位置显示灰色,到网上各处寻求答案,本以为是个大问题,没想到只是个小问题.主要原因只是后台开太多东西了,导致VS2013运 ...
- VS2013 Qt5显示中文字符
VS2013上建立的Qt5project中显示中文字符的两种方式: 1. QStringLiteral("開始") 2. QString::fromLocal8Bit(" ...
随机推荐
- 初识Ruby
以下为看<七周七语言>的第一课,找到答案,参考资料来源于http://book.douban.com/annotation/27705657/ Ruby API文档在这里http://ru ...
- html5 搖一搖
<script> // 首先在页面上要监听运动传感事件 function init(){ if (window.DeviceMotionEvent) { // 移动浏览器支持运动传感事件 ...
- docker学习(二)
1 镜像 docker使用联合加载技术,一次同时加载多个文件系统,在外面只能看到一个文件系统 docker使用写时复制,每个只读镜像层都是只读的,也永远不会发生变化,建立一个新容器,会构建一个镜像栈, ...
- vs2012 快捷键修改
打开:工具-->选项 搜索:剪切行 移除原有的 Crtl+L 命令 改为:Ctrl+D
- 基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译
刚刚移植了sqlite3迫切想测试一些,结果将原来在ubuntu系统下写好且测试通过的程序,重新编译就报错,无法找到已定义的函数 这是由于没有使用库或者使用了错误的就.库造成的结果. 正确做法为: a ...
- DOS终端不能使用JAVA命令
DOS 终端 java 命令OK javac 命令OK java version 命令OK 写了小程序HelloWorld 测试 ,文件名HelloWorld.java public class H ...
- CSS代码使纯英文数字自动换行
当一个定义了宽度的块状元素中填充的全部为纯英文或者纯数字的时候,在IE和FF中都会撑大容器,不会自动换行并且当数字或者英文中带有汉字时,会从汉字处换行,而纯汉字却可以自动换行.这个问题如何解决?先来认 ...
- Linux shell实现Mysql异地备份数据库
#--------------------------Mysqldump异地备份-----------------# #!/bin/bash #start mysqldump back /usr/bi ...
- Sql Server 常用的查询
基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 selec ...
- luigi学习4-构建工作流
luigi提供了两个基本单元来构造一个工作流,这两个基本单元分别是Task和Target.这两个单元都是抽象类,我们实现他们中的某些方法就可以了.除了这两个基本单元,还有一个重要的概念是Pramete ...