GDI+ - 使用PNG图片打造不规则窗口

本文介绍了如何利用GDI+库,结合PNG图片来创建具有不规则形状的窗口。主要步骤包括:加载PNG图片,设置窗口的WS_EX_LAYERED属性,然后在窗口上绘制图片,通过UpdateLayeredWindow实现透明效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.创建一个Image指针并赋值(前提是初始化过GDI+环境)
Image* m_pImage;			//dlg头文件里面添加
m_pImage = Image::FromFile(L"bk.png");	//OnInitDialog里面添加

2.将主窗口大小设置的和图片一样大,并且给主窗口设置WS_EX_LAYERED(层属性)
	DWORD dwExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
	if((dwExStyle&WS_EX_LAYERED) != WS_EX_LAYERED)
	{
		::SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle^WS_EX_LAYERED);
	}

3.将图片绘制到主窗口上(直接创建一个成员函数)
void CdrawdemoDlg::DrawLayeredWindow()
{
	CRect rcClient;
	GetClientRect(rcClient);	//取得【客户区】大小,坐标是客户区坐标

	HDC hDC = ::GetDC(m_hWnd);

	//创建内存DC和BMP
	HDC hMemoryDC = ::CreateCompatibleDC(hDC);
	HBITMAP hMemoryBmp = (HBITMAP)::CreateCompatibleBitmap(hDC, rcClient.Width(), rcClient.Height());
	::SelectObject(hMemoryDC, hMemoryBmp);

	Graphics graphis(hMemoryDC);

	//绘制背景图片
	graphis.DrawImage(m_pImage, 0, 0, rcClient.Width(), rcClient.Height());

	//将内存DC上的内容绘制到窗口上
	CRect rcWindow;
	GetWindowRect(rcWindow);	//取得【整个窗口】大小,坐标是屏幕坐标

	POINT ptWinPos = {rcWindow.left, rcWindow.top};
	SIZE szWindow = {rcClient.Width(), rcClient.Height()};
	POINT ptSrc = {0, 0};

	BLENDFUNCTION bf;
	bf.BlendOp = AC_SRC_OVER;
	bf.BlendFlags = 0;
	bf.SourceConstantAlpha = 255;	//0-255 0-全透明 255-不透明
	bf.AlphaFormat = AC_SRC_ALPHA;

	::UpdateLayeredWindow(m_hWnd, hDC, &ptWinPos, &szWindow, hMemoryDC, &ptSrc, 0, &bf, ULW_ALPHA);

	//释放资源
	if(hMemoryDC){::DeleteDC(hMemoryDC);hMemoryDC=NULL;}
	if(hMemoryBmp){::DeleteObject(hMemoryBmp);hMemoryBmp=NULL;}
	::ReleaseDC(m_hWnd, hDC);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值