CWinApp
ULONG_PTR m_pGdiToken;
CMFCTestApp::CMFCTestApp()
{
//初始化GDI+环境
Gdiplus::GdiplusStartupInput input;
Gdiplus::GdiplusStartup(&m_pGdiToken, &input, NULL);
}
CMFCTestApp::~CMFCTestApp()
{
//释放掉GDI+环境
Gdiplus::GdiplusShutdown(m_pGdiToken);
m_pGdiToken = NULL;
}
MFCTestDlg
private:
Image* m_pImage;
void DrawLayerWindow();
public:
afx_msg LRESULT OnNcHitTest(CPoint point);
BOOL CMFCTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化代码
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
m_pImage = Image::FromFile(TEXT("bk.png"));
ASSERT(m_pImage);
if (m_pImage==NULL)return false;
MoveWindow(0, 0, m_pImage->GetWidth(), m_pImage->GetHeight());
//增加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);
}
DrawLayerWindow();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCTestDlg::DrawLayerWindow()
{
//取出了客户区的大小
CRect rcClient;
this->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 graphics(hMemoryDC);
//绘制背景图片
graphics.DrawImage(m_pImage
, 0, 0
, rcClient.Width(), rcClient.Height());
//特殊的,属于层窗口的绘制处理
RECT rcWindow;
::GetWindowRect(m_hWnd, &rcWindow);
//已窗口基于屏幕的x/y坐标赋值
POINT ptWinPos = {rcWindow.left, rcWindow.top};
SIZE szWindow = {rcClient.Width(), rcClient.Height()};
//
POINT ptSrc = {0, 0}; //这里一定固定为0,0
BLENDFUNCTION bf;
::ZeroMemory(&bf, sizeof(bf));
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 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);
}
LRESULT CMFCTestDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return HTCAPTION;;
return CDialog::OnNcHitTest(point);
}