#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 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, 192, LWA_COLORKEY);
FreeLibrary(hUser32); //释放动态链接库
以上代码加入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);
m_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()
//}}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);
}
else
{
pDC->SetBkColor(RGB(255,255,255));
}
pDC->SetTextColor(RGB(0,0,255)); //设置字体颜色白色
hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);
}
return hbr;
}