透明dialog上图片移动、dialog透明,图片不透明

本文介绍了一种在对话框上实现图片加载、拉伸显示及移动的技术方案,特别针对gif格式的支持,并通过设置对话框透明度使图片保持可见。

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

1、下面代码实现了dialog上图片移动,图片可以使bmp、gif等;

2、本代码解决了两个难题:

       (1)曾经试过很多方法在dialog上加载图片,但是大多数都是bmp格式,不支持gif格式,并且图片还不能拉伸;

       (2)在dialog上加载图片,图片和dialog会产生重叠的效果;

3、首先得添加PictureEx.h和PictureEx.cpp两个文件,其中CPictureEx类支持gif格式,并且能拉伸图片;

       CPictureEx m_gif;//m_gif为picture control控件的变量,类型为CPictureEx;

4、下面这两行代码实现了使dialog透明,其上面的图片不透明,

       SetWindowLong(this->m_hWnd, GWL_EXSTYLE, GetWindowLong(this->m_hWnd, GWL_EXSTYLE) ^ 0x80000);
       SetLayeredWindowAttributes(GetSysColor(COLOR_BTNFACE), 0, 1);

5、加载图片

       CRect rect;
       GetDlgItem(IDC_STATIC_PICTURE)->GetClientRect(rect);
       if (m_gif.Load(_T("1.gif")))
      {
          m_gif.SetPaintRect(&rect);
          m_gif.GetPaintRect(&rect);
           m_gif.Draw();
      }
      SetTimer(1, 20, NULL);

6、定时器里实现图片移动

int upstep = 0;//左右移动
int rigthstep = 0;//上下移动
void DialogStar::OnTimer(UINT_PTR nIDEvent)
{
	CRect crect;//图片移动后新的rect
	CRect rect;//图片的rect
	CRect prect;//dialog的rect
	// TODO: Add your message handler code here and/or call default
	switch (nIDEvent)
	{
	case 1:
		upstep += 2;
		rigthstep += 3;
		GetDlgItem(IDC_STATIC_PICTURE)->GetClientRect(rect);
		GetDlgItem(IDC_STATIC_PICTURE)->GetParent()->GetClientRect(prect);
		crect.top = prect.bottom - rect.bottom - upstep;
		crect.bottom = crect.top + rect.bottom;
		crect.left = rigthstep;
		crect.right = crect.left + rect.right;
		GetDlgItem(IDC_STATIC_PICTURE)->MoveWindow(crect);
		if (crect.top <= 0 || (crect.left > prect.right - rect.right))
		{
			KillTimer(1);
			GetDlgItem(IDC_STATIC_PICTURE)->CloseWindow();
			upstep = 0;
			rigthstep = 0;
			CDialogEx::OnCancel();
		}

		break;
	default:
		break;
	}
	CDialogEx::OnTimer(nIDEvent);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值