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);
}
GDI+ - 使用PNG图片打造不规则窗口
最新推荐文章于 2024-10-25 11:44:57 发布