使用Gdiplus描画透明图遇到问题。

yj090403 2012-11-13 09:19:33
本来想使用一个半透明的图片做边框的,但是画出来之后透明是透明了,但是无论窗体的后面怎么改变半透明边框不会更新,请问该怎么解决。大神们请看图,边框透明部分应该是CSND论坛才对的,但是无论怎么样还是显示VS里面的画面。
...全文
313 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxl4751 2013-11-11
  • 打赏
  • 举报
回复
楼主解决没啊?
hotpos 2012-11-13
  • 打赏
  • 举报
回复
SetLayeredWindowAttribute 只能实现某种颜色的全透明 或者 整个窗口同一个幅度的半透. 美工基本上不会同意. UpdateLayeredWindow 可以实现alpha通道的半透明, 即不同的地方透明度可以不一样. 可以绘制png图片, 美工的最爱. 缺点是没有WM_PAINT消息. 这俩是冲突的, 不能同时使用.
sumos 2012-11-13
  • 打赏
  • 举报
回复
引用 7 楼 beautyangus 的回复:
四楼正解,您必须使用CreateWindowEx,并使用WS_EX_LAYERED风格创建窗口。 不过,您再也无法收到“必要”的WM_PAINT消息了,换句话说,使用WS_EX_LAYERED创建的窗口不在遵循常规的窗口更新机制,必须使用UpdateLayeredWindow这个函数来更新窗口,其实习惯也就好了。 另外,如果您是要(部分)半透明的窗口,请UpdateL……
WS_EX_LAYERED风格加上之后不会收到WM_PAINT,必须使用UpdateLayeredWindow? 我加上WS_EX_LAYERED风格后,并使用SetLayeredWindowAttribute函数设置透明度,为什么控件还是可见的?窗口的WM_PAINT消息还是有的?而且我没用UpdateLayeredWindow。即使我用SetLayeredWindowAttribute过滤特定色,我的窗口还是能收到WM_PAINT。很不解,求解
yj090403 2012-11-13
  • 打赏
  • 举报
回复
引用 8 楼 beautyangus 的回复:
SetWindowRgn仅仅用来创建不规则窗口,无法完成半透明的。而且边缘化严重。
那请问如何实现窗口圆角比较好呢?
beautyangus 2012-11-13
  • 打赏
  • 举报
回复
SetWindowRgn仅仅用来创建不规则窗口,无法完成半透明的。而且边缘化严重。
beautyangus 2012-11-13
  • 打赏
  • 举报
回复
四楼正解,您必须使用CreateWindowEx,并使用WS_EX_LAYERED风格创建窗口。 不过,您再也无法收到“必要”的WM_PAINT消息了,换句话说,使用WS_EX_LAYERED创建的窗口不在遵循常规的窗口更新机制,必须使用UpdateLayeredWindow这个函数来更新窗口,其实习惯也就好了。 另外,如果您是要(部分)半透明的窗口,请UpdateLayeredWindow的时候指定一个已经SeletObject一个32位颜色的颜色的HBITMAP,然后想怎么透明就怎么透明。
yj090403 2012-11-13
  • 打赏
  • 举报
回复
引用 5 楼 hotpos 的回复:
顺便提一句 整个窗口没有WM_PAINT消息 结果就是窗口上面的控件都看不到
请问有这方面的例子么,具体是怎么实现呢?
hotpos 2012-11-13
  • 打赏
  • 举报
回复
顺便提一句 整个窗口没有WM_PAINT消息 结果就是窗口上面的控件都看不到
hotpos 2012-11-13
  • 打赏
  • 举报
回复
要Layered窗口才会动态变. 并且要手动调用 UpdateLayeredWindow. 代价就是 整个窗口没有WM_PAINT消息.
sumos 2012-11-13
  • 打赏
  • 举报
回复
我以前也遇到过,但是不知道怎么解决。 +关注,求高手,+解释
yj090403 2012-11-13
  • 打赏
  • 举报
回复
引用 1 楼 q79424066 的回复:
贴上代码才好看啊
int SMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	// TODO:  在此添加您专用的创建代码
	SetWindowText(_T("蓝调分享小平台"));
	CRect cClientRect;
	GetClientRect(&cClientRect);
	cClientRect.right = 800;
	cClientRect.bottom = 500;
	MoveWindow(&cClientRect);
	CenterWindow(GetParent());
	
	// 将主窗口变为圆角窗口
	CRgn hRgnClient;
	hRgnClient.CreateRoundRectRgn(0,0,800,500,5,5); 
	CRgn hRgnButton;
	hRgnButton.CreateRoundRectRgn(19,0,120+1,40+1,3,3); 
	hRgnClient.CombineRgn(&hRgnButton,&hRgnClient,RGN_OR);
	SetWindowRgn(hRgnClient,FALSE);
	return 0;
}

void SMainWnd::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	//dc.CreateCompatibleDC()
	dc.SelectStockObject(NULL_PEN);
	Graphics graphics(dc.m_hDC);
	Image image(L"background.bmp");
	Image iguan(L"1.png");
	RectF rect(0,iguan.GetHeight(),image.GetWidth(),image.GetHeight());
	RectF guanRect(0,0,iguan.GetWidth(),iguan.GetHeight());
	graphics.DrawImage(&image,rect,0,0,image.GetWidth(),image.GetHeight(),UnitPixel);
	graphics.DrawImage(&iguan,guanRect,0,0,iguan.GetWidth(),iguan.GetHeight(),UnitPixel);
	//UpdateWindow();
	// 不为绘图消息调用 CWnd::OnPaint()
}
leson123 2012-11-13
  • 打赏
  • 举报
回复
贴上代码才好看啊

15,979

社区成员

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

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