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(" ...
随机推荐
- java基础回顾(二)——内部类
一.常规内部类 public class Outer { int count; void say(){ count++; System.out.println("我是外部类"); ...
- WebLogic集群案例分析
WebLogic集群案例分析 2012年8月,某证券交易系统(采用Weblogic中间件),由于基金业务火爆,使系统压力太大,后台服务器频繁死机时,这时工程师们紧急调试系统及恢复操作,等完成这些操作花 ...
- python线程使用场景 多线程下载
http://blog.xiayf.cn/2015/09/11/parallelism-in-one-line http://python.jobbole.com/84327/ http://www. ...
- IIS7下,flush无效,解决方案
打开文件 C:\Windows\System32\inetsrv\config\applicationHost.config ,注意如果你的是64位系统,这个文件就必须用64位的编辑软件打开,32位的 ...
- c# 字符串(含有汉字)转化为16进制编码(转)
public static string Str2Hex(string s) { string result = string.Empty; byte[] arrByte = System.Text. ...
- sorcketlog
正在运行的API有bug,不能var_dump进行调试,因为会影响client的调用. 将日志写到文件,查看也不方便,特别是带调用栈或大数据结构的文件日志,查看日志十分困难. 这时候用SocketLo ...
- virtual box 中两个虚拟机 、宿主机 三机互通并且能上外网设置
virtual box 中两个虚拟机 .宿主机 三机互通并且能上外网设置 1:背景:因为需要学习linux,所以需要在虚拟机里装linux系统,测试要么宿主机与虚拟机linux网络实验测试:要么另一台 ...
- JavaScript空判断
if(backInfo != "" && backInfo != null && typeof(backInfo)!="undefined ...
- Distant Supervision for relation extraction without labeled data
Distant Supervision for relation extraction without labeled data 远程监督:使用未标注语料做关系抽取 1. 背景: 关系抽取(某个人是否 ...
- 通过Migration在EF6中用多个DbContext
通过Migration在EF6中用多个DbContext EF EF6 C# Migration 通过Migration在EF6中用多个DbContext 前言 实现目标 设置多数据上下文 更新数据脚 ...