不规则透明窗口

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);
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值