MFC对话框,已经将整个对话框设置为半透明,在picture控件中插入了一张位图,想把位图的背景也农行称透明。

#define LWA_COLORKEY 0x00000002 //方式
#define WS_EX_LAYERED 0x00080000
typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;
//设置成边缘透明
COLORREF maskColor=RGB(0,0,0);
HMODULE hUser32 = GetModuleHandle("user32.dll"); //加载动态链接库
SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,"SetLayeredWindowAttributes");
//取得SetLayeredWindowAttributes函数指针
//为窗口加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);
//调用SetLayeredWinowAttributes函数
SetLayeredWindowAttributes(this->GetSafeHwnd(), maskColor, 50, LWA_COLORKEY);
FreeLibrary(hUser32); //释放动态链接库

对话框透明使用上面的代码,
在onpaint中也修改了对话框的背景颜色
CRect rc;
GetClientRect( &rc );// 获取客户区
CPaintDC dc(this);
dc.FillSolidRect(&rc, RGB(0,0,0)); // 填充客户区颜色
下面是OnCtlColor函数
HBRUSH CMy3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired
if(nCtlColor== CTLCOLOR_STATIC){

//pDC->SetBkMode(OPAQUE); //不透明
pDC->SetBkMode(TRANSPARENT); //透明
pDC->SetTextColor(m_color);
return (HBRUSH)m_brush.GetSafeHandle(); //返回的是m_brush的颜色
}
if(nCtlColor== IDC_IMAGE){

pDC->SetBkColor(RGB(0,0,0));

但是插入的图片的背景色还是原来的样子,请问怎么将其变为透明
return m_brush;
}

return hbr;
}

效果图大概就是这样,就是右边的图片的背景弄成透明。

第1个回答  2012-09-03
把picture控件设置成frame样式的试下
第2个回答  2012-09-06
SetLayeredWindowAttributes不是可以指定要透明的颜色吗,如果指定的参数正确,却不能透明,说明图片的颜色值和要透明的颜色不一样,虽然看上去是一个颜色

...Control)而另一个控件(Picture control)上边的图片会改变_百度知 ...
我不知道怎么读取图片,所以我的方法是,先在对话框建若干Picture Control ,每个Picture Control 里面放一张图,在Spin Control前面先建一个EDIT CONTROL,然后建Spin Control与之绑定,在EDIT CONTROL的响应函数里根据EDIT CONTROL中的整数值选择该显示的图片进行显示 ...

MFC在对话框上画图,怎么实现对话框背景透明,但画的图不透明。
本身来说,对话框背景透明是在OnEreaseBackgroud或者对应消息截取中实现的,而普通的绘图,是在OnPaint或者对应消息中实现的,两者并不冲突,背景透明不会影响绘图。你所说的,应该是这样一个话题吧:怎样根据对话框背景图片设置异形窗口。这个话题比较经典,核心是SetWindowRgn等函数的使用,实现方法,可以用现...

...读取外部的位图文件,让它显示在图片控件(Picture Control)中?_百度...
1.在你的对话框添一个按钮和一个图片控件(Picture Control).2.添加一个类,我这里上传不了,只能将.h和.cpp复制过来,你再将拷贝到txt里,改一下扩展名就可以了。这是Picture.h#if !defined(AFX_PICTURE_H__COPYFREE_BY_YOVAV_GAD__SOURCES_AT_SUPERMAIN_DOT_COM__INCLUDED_)#define AFX_PICTURE_H__COPY...

MFC picture 控件上画图。
你已经做好了大部分的工作了,只差在控件上显示了。只需要再加句UpData(FALSE)就可以了。备注:UpData(true);把控件内容装入控件变量.即是说:当用户对控件作了操作,控件内容发生了改变,可以通过该函数加true参数实现同步。UpData(false);用控件变量的值更新控件。即是说:当程序中变量由于执行流程...

在MFC对话框中载入位图,之后发现图片变模糊,知道的请进
图像显示模式。比如默认可以配置的操作系统桌面使用 24位色,还是32位色,还是16位色。如果你的位图是24位色,而你的应用程序默认使用的是16位色,那么显示的时候系统会强制将24位压缩成16位,就会出现你的情况。而反过来如果你的位图是16位,而应用程序的颜色模式是32位色,也是这种结果 首先确保你的...

怎么给MFC的对话框加背景图片
1、新建MFC应用程序。2、在应用程序中,选择基于对话框,其他保持默认即可。3、右击项目,选择添加-资源。4、在添加资源对话框中,点击导入,选择要作为背景的图片。5、在工具箱找到Picture控件,托到界面中。6、在界面上点击选中Picture控件,然后在属性的Type下拉框中,选择Bitmap。7、再在Picture控件的...

MFC中怎么样让对话框开始就全屏显示?并且让里面的picture控件也...
首先获得屏幕分辨率,然后用setwindowpos设置窗口大小,以上操作在初始化函数中添加。picture控件如果使对话框的话可以用对齐来放到想放的位置,文档的话计算一下坐标吧,用图片控件类里的相关函数来设置位置

MFC对话框画线的问题紧急求教!!
你好,用控件来显示位图时是会遮盖对话框上绘画的线条的,好像可以通过设置图片控件的属性来实现,可以去研究一下;实在不行用先用GDI函数把位图显示在对话框上,然后画线条,线条就不会被覆盖了,后面的方法肯定可以的。

MFC如何使picture控件的图片随着对话框的大小改变而改变
1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);3、在WM_SIZE的响应函数OnSize()中加入以下代码:CWnd *pWnd;pWnd = GetDlgItem(IDC_LIST); \/\/获取控件句柄 if(pWnd)\/\/判断是否...

MFC怎么为不同的对话框设置不同的背景
MFC设置背景,采用添加Bitmap的方法,首先把你想要设置为背景的图片转换成bmp格式,然后再引入到工程里面,再在每个对话框中添加控件,再选择。具体见图:1、首先在工程添加bitmap,右击工程名,添加。2、右击bitmap,选择引入。3、在下面的弹出的窗口中,选择文件类型,再找到你的bmp文件 4、引入成功后...

相似回答