MFC OnCtlColor()用法、MFC对话框设置透明

#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;

}

 

你可能感兴趣的:(MFC OnCtlColor()用法、MFC对话框设置透明)