MFC对话框透明设置

更新时间:2023-06-28 18:29:06 阅读: 评论:0

#define LWA_COLORKEY 0x00000001        //方式
#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 hUr32 = GetModuleHandle("ur32.dll"); //加载动态链接库
SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUr32,"SetLayeredWindowAttributes");
//取得SetLayeredWindowAttributes函数指针
容载比
//为窗口加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);
//调用SetLayeredWinowAttributes函数
SetLayeredWindowAttributes(this->GetSafeHwnd(), maskColor, 192, LWA_COLORKEY);
FreeLibrary(hUr32);  //释放动态链接库
以上代码加入OnInitDialog()中,其中SetLayeredWindowAttributes(this->GetSafeHwnd(), maskColor, 192, LWA_COLORKEY); 里,maskColor为将进行透明处理的颜色, 192为透明度, LWA_COLORKEY为透明方式。
若要透明整个对话框,则LWA_COLORKEY=2;
若要对选定颜色透明,则LWA_COLORKEY=1;
1、首先用VC6.0创建一个最简单的对话框。
2、在对话框的视图界面中加入一个静态文本控件,同时在静态文本控件的属性中设置它为透明的。
3、在对话框类的初始化函数中加入以下部分:
胡椒英文view plaincopy to clipboardprint?
微波炉尺寸CStatic *m_Static; 
CFont font; 
m_Static = (CStatic*)GetDlgItem(IDC_STATIC); 
font.CreatePointFont(400 , "宋体"); 
m_Static->SetFont(&font); 
免费申请qqm_Static->UpdateWindow(); 
font.DeleteObject(); 
CStatic *m_Static;
CFont font;
m_Static = (CStatic*)GetDlgItem(IDC_STATIC);
font.CreatePointFont(400 , "宋体");
m_Static->SetFont(&font);
m_Static->UpdateWindow();
font.DeleteObject();
4、右键单击对话框类,增加一个Windwos消息句柄,消息是:WM_CTLCOLOR
在相应的函数OnCtlColor中增加如下代码:
view plaincopy to clipboardprint?
CBrush m_brush(RGB(255 , 255 , 255));//创建画刷 
CRect m_rect; 
GetClientRect(m_rect);//获取对话框的客户区域 
pDC->SelectObject(&m_brush); 
pDC->FillRect(m_rect , &m_brush);//填充背景 
if(nCtlColor == CTLCOLOR_STATIC) 
pDC->SetBkMode(TRANSPARENT); 
// TODO: Return a different brush if the default is not desired 
return m_brush; 
//return hbr; 
CBrush m_brush(RGB(255 , 255 , 255));//创建画刷
CRect m_rect;
GetClientRect(m_rect);//获取对话框的客户区域
pDC->SelectObject(&m_brush);
pDC->FillRect(m_rect , &m_brush);//填充背景
if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
}
// TODO: Return a different brush if the default is not desired
return m_brush;
//return hbr;
出现的结果是控件中的字体没有什么变化,
通过查资料,查到了原因的所在:
font应该声明成成员变量(在对话框的头文件中),不应该是临时的,同时font不应该被删除,删除之后在显示的时候就不起作用了,
初始化函数在窗口显示之前,所以font需要一直存在,不能是临时的,在程序运行中不能删除。
而在对话框的OnPaint方法中可以加入上面在初始化中的代码,同时不需要作任何的改动。
在对话框的OnPaint方法中需要对所有的部分进行重绘,在这里单独的删除font而不是在初始化方法中,控件在绘制的时候找不到font而用默认的,还是达不到相应的效果。
如果OnPaint方法中用以下代码与初始化方法中代码结合还是可以的(初始化方法中的font删除可以去除)
((CStatic*)GetDlgItem(IDC_STATIC))->SetFont(&font);
font.DeleteObject();
这就是说,在OnPaint方法中指明控件的绘制方式,再删除font,这样可以实现同上面的改变字体的目的。
在消息映射下添加如下消息。
BEGIN_MESSAGE_MAP(CGPS_eDogDlg, CDialog)
//{{AFX_MSG_MAP(CGPS_eDogDlg)
ON_WM_CTLCOLOR() index函数的使用方法
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在处理类中添加OnCtlColor()方法。其中IDC_ALARM_TYPE为一个静态文本框,IDC_FLY_T为一个文本编辑框。
HBRUSH CGPS_eDogDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)翻来复去
HBRUSH  hbr  =  CDialog::OnCtlColor(pDC,  pWnd,  nCtlColor); 
if(pWnd->GetDlgCtrlID() == IDC_ALARM_TYPE) 
{
//让静态文本框透明 
pDC->SetBkMode(TRANSPARENT); 
//设置显示字体   
CFont font;主元法
VERIFY(font.CreateFont(
20,                        // nHeight
0,                        // nWidth
0,                        // nEscapement
0,                        // nOrientation
FW_BOLD,//FW_NORMAL,                // nWeight
FALSE,                    // bItalic
FALSE,                    // bUnderline
0,                        // cStrikeOut
ANSI_CHARSET,              // nCharSet
OUT_DEFAULT_PRECIS,        // nOutPrecision
CLIP_DEFAULT_PRECIS,      // nClipPrecision
DEFAULT_QUALITY,          // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体")));                // lpszFacename
pDC->SelectObject(&font);
安全成语font.DeleteObject();
pDC->SetTextColor(RGB(0,0,255));  //设置字体颜色白色 
hbr=(HBRUSH)::GetStockObject(NULL_BRUSH); 
if (pWnd->GetDlgCtrlID() == IDC_FLY_T)
{
{
pDC->SetBkColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
}
el
{
pDC->SetBkColor(RGB(255,255,255));
}
pDC->SetTextColor(RGB(0,0,255));  //设置字体颜色白色 
hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);
}
return hbr;
}

本文发布于:2023-06-28 18:29:06,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1060736.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:控件   对话框   方法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图