想给程序添加一个点击函数,触发条件是程序最小化后点击任务栏中的程序图标

pc12138cwp 2021-03-30 08:51:13
写了个MFC对话框程序,程序功能可以给对话框背景更换位图,里面的控件可以移动。以及有个子对话框是设置了某颜色背景转为透明色背景。

扯个这个程序在自己电脑上运行正常,拿到一些比较烂的电脑上,显示就会出问题!

透明色背景显示不正常,本来是透明的,结果显示成黑色了;点击最小化后,再显示时会把电脑的桌面或者其他打开的窗口的背景刷在程序对话框背景上面。

请问各位大佬,这是什么原因啊?有些电脑正常,有些电脑显示不正常。这个有什么解决办法吗???


我想给程序添加一个点击函数,触发条件是程序最小化后点击任务栏中的程序图标,这个该怎么写?写在哪

...全文
350 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pc12138cwp 2021-04-01
  • 打赏
  • 举报
回复
在低配电脑上用的时候,会把其他窗口的画面刷在主程序对话框上面(比如说我点了对话框最小化,然后点任务栏让他重新显示,结果显示出来的对话框背景是电脑桌面,刷新对话框,才恢复正常),这和上面的代码有关吗,什么原因啊
pc12138cwp 2021-04-01
  • 打赏
  • 举报
回复

void CCustomDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{

		CPaintDC  dc(this);
		CRect  rect;
		GetClientRect(&rect); //得到客户端的大小;      
		CBitmap  bmpBackground;

		HANDLE hBitMap;
		hBitMap = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		if (hBitMap == NULL)
		{
			MARGINS mar;                           //透明化
			mar.cxLeftWidth = -1;
			mar.cxRightWidth = -1;
			mar.cyTopHeight = -1;
			mar.cyBottomHeight = -1;
			CRect rectClient;
			GetClientRect(rectClient);
			mar.cyTopHeight = rectClient.Height();
			DwmExtendFrameIntoClientArea(CDialogEx::GetSafeHwnd(), &mar);

			CRect rcGlassArea;
			GetClientRect(&rcGlassArea);
			dc.FillSolidRect(&rcGlassArea, RGB(0, 0, 0));
			return;
		}
		bmpBackground.Attach(hBitMap);
		BITMAP  bitmap;
		bmpBackground.GetObject(sizeof(bitmap), &bitmap);  //得到位图信息

		CDC  dcMem;
		dcMem.CreateCompatibleDC(&dc);//创建内存DC;
		CBitmap* pbmpOld = dcMem.SelectObject(&bmpBackground); //选择位图,将其装入内存设备上下文;

		dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);

		dcMem.SelectObject(pbmpOld);//将原来的位图重新载入
		dcMem.DeleteDC();
		//CDialogEx::OnPaint();
	}
}
pc12138cwp 2021-04-01
  • 打赏
  • 举报
回复
卧槽,还真是DwmExtendFrameIntoClientArea 的问题,我把这句注释后,在自己电脑上也透明不了,也显示黑屏了dc.FillSolidRect(&rcGlassArea, RGB(0, 0, 0)); 这是什么原因,低配电脑 DwmExtendFrameIntoClientArea(CDialogEx::GetSafeHwnd(), &mar);这句代码无效? 有什么替代的函数吗?
schlafenhamster 2021-04-01
  • 打赏
  • 举报
回复
DwmExtendFrameIntoClientArea 的问题 ?
pc12138cwp 2021-03-31
  • 打赏
  • 举报
回复

MARGINS mar;                           //透明化
			mar.cxLeftWidth = -1;
			mar.cxRightWidth = -1;
			mar.cyTopHeight = -1;
			mar.cyBottomHeight = -1;
			CRect rectClient;
			GetClientRect(rectClient);
			mar.cyTopHeight = rectClient.Height();
			DwmExtendFrameIntoClientArea(CDialogEx::GetSafeHwnd(), &mar);

			CRect rcGlassArea;
			GetClientRect(&rcGlassArea);
			dc.FillSolidRect(&rcGlassArea, RGB(0, 0, 0));
这段代码实现对话框透明化,在低配电脑上,透明色变成了黑色
pc12138cwp 2021-03-31
  • 打赏
  • 举报
回复
重装个好的系统就可以是吗? 这个和硬件、和显卡有关系吗
GKatHere 2021-03-31
  • 打赏
  • 举报
回复
我记得好像是由于系统原因,高级功能会转化为低级功能使用。 好久以前吧,windows高级版本中的窗口圆角化,在低级版本中,是不起作用的。
pc12138cwp 2021-03-30
  • 打赏
  • 举报
回复
透明的我会弄了,就是很奇怪,程序拿到一些比较差的电脑上,透明色会显示成黑色
zgl7903 2021-03-30
  • 打赏
  • 举报
回复
参考我的 实现对话框在位图作为背景时的控件透明 最小化后点击图标 会收到 WM_SYSCOMMAND, SC_RESTORE 消息

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧