从png, winapi创建透明图像
create transparent image from png, winapi
我创建了一个简单的表单在winapi中进行测试:我在这里上传:http://pastebin.com/7dNjE1Tb
我想把一个简单的png文件到我的hwnd,例如这个图片:http://www.ledavi-network.com/includes/images/bg_shadow_png.png
我知道我应该使用这个:http://msdn.microsoft.com/en-us/library/windows/desktop/dd145141(v=vs.85).aspx但我是winapi的新手,我找不到任何例子如何使用这个transparent - blt函数。
谁能帮我创建一个非常简单的例子?
编辑:但是我想做什么呢?我想创建一个带有阴影的特殊背景按钮。如果有人知道更简单的方法,我会忘记使用TransparentBlt。还有别的办法吗?
这样就可以了。您需要确保为AlphaBlend链接了gdiplus和msimg32库(TransparentBlt假设图像中的单个 rgb颜色将被视为透明的)。也就是说,当使用transparent(完全不透明或完全透明)时,它只是1位透明度。
您将(大概)希望使用AlphaBlend来完成这项工作。
注意-我没有费心添加一个WM_ERASEBKGND到WndProc函数。因此,每次重新绘制图像时,它都会直接绘制在已经存在的图像的顶部(尝试调整窗口大小)。只要在erasebkg中执行FillRect,就可以了。
编辑:代码更新为使用带有NULL hbitmap的displayImage来做背景。
这里‘:
#define WIN32_LEAN_AND_MEAN
#define WINVER 0x0600 // needed for alphablend function..
#include <windows.h>
#include <gdiplus.h>
const char g_szClassName[] = "myWindowClass";
// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
// requires GDIPlus
HBITMAP mLoadImg(WCHAR *szFilename)
{
HBITMAP result=NULL;
Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
bitmap->GetHBITMAP(NULL, &result);
delete bitmap;
return result;
}
//void CStaticImg::displayImage(HBITMAP mBmp, HWND mHwnd)
void displayImage(HBITMAP mBmp, HWND mHwnd)
{
RECT myRect;
BITMAP bm;
HDC screenDC, memDC;
HBITMAP oldBmp;
BLENDFUNCTION bf;
GetObject(mBmp, sizeof(bm), &bm);
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xff;
bf.AlphaFormat = AC_SRC_ALPHA;
screenDC = GetDC(mHwnd);
GetClientRect(mHwnd, &myRect);
if (mBmp == NULL)
FillRect(screenDC, &myRect, WHITE_BRUSH);
else
{
memDC = CreateCompatibleDC(screenDC);
oldBmp = (HBITMAP)SelectObject(memDC, mBmp);
AlphaBlend (screenDC, 0, 0, myRect.right,myRect.bottom, memDC, 0, 0, bm.bmWidth,bm.bmHeight, bf);
SelectObject(memDC, oldBmp);
DeleteDC(memDC);
ReleaseDC(mHwnd, screenDC);
}
}
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP myImage;
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_ERASEBKGND:
displayImage(NULL, hwnd);
break;
case WM_CREATE:
myImage = mLoadImg(L"bg_shadow_png.png");
break;
case WM_PAINT:
//displayImage(HBITMAP mBmp, HWND mHwnd);
displayImage(myImage, hwnd);
ValidateRect(hwnd, NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
static Gdiplus::GdiplusStartupInput gdiplusStartupInput;
static ULONG_PTR gdiplusToken;
// so we can load all the image formats that windows supports natively - (I'm using a transparent PNG on the main dialog)
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
Gdiplus::GdiplusShutdown(gdiplusToken);
return Msg.wParam;
}
相关文章:
- 如何在全屏模式下(在OpenGL中)使背景透明
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- dx11 渲染到纹理仅显示透明颜色
- SDL2 透明背景
- 如何创建透明垫子
- 如何创建子窗口是透明的,父窗口是不透明的?
- 为什么我不能返回带有透明函子的法线映射引用?
- 从静态库使用时隐藏不透明结构的内容
- 在OpenGL中渲染透明块
- 在C++中使用Gdiplus创建透明位图
- 对于指向C++类的不透明C指针,正确的typedef是什么
- 如何使白色透明
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 使用 pybind11 混合类型转换和不透明类型
- 如何让 QTabWidget 透明?
- C++生成器透明位图覆盖画布
- QGraphicsScene - 添加带有少量不透明点的大透明像素图时,应用程序会挂起很长时间
- 如何在Direct2D中创建透明位图
- Direct2D - 模拟彩色键控透明位图
- 当将透明png图像转换为位图时,它不会保留透明度