基本原理:将父对话框设置为全透明,再铺一张半透明图片与原对话框混合处理,得到半透明的父对话框。
在子对话框中,将除控件外的区域设置为全透明。再将子对话框作为父对话框的子窗口,以层级样式显示出来。
(1)父对话框
在对话框的OnInitDialog中(CWnd窗口的OnCreate中)
(BLENDFUNCTION m_Blend;)
m_Blend.BlendOp=0;
m_Blend.BlendFlags=0;
m_Blend.AlphaFormat=1;
m_Blend.SourceConstantAlpha=255;//原对话框设置为全透明
//窗体样式设为层级窗体
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^WS_EX_LAYERED);
(或用ModifyStyleEx(0, WS_EX_LAYERED);)
(HDC m_hdcMemory;)
//绘制内存位图
HDC hdcTemp=GetDC()->m_hDC;
m_hdcMemory=CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,500,500);
SelectObject(m_hdcMemory,hBitMap);
(CImage m_pBkImg;)//Load 或LoadFromResource 一张半透明png作为欲显示的对话框的效果图
m_pBkImg.Draw(m_hdcMemory,0,0);//此处将半透明的png图片画到内存DC上
//使用UpdateLayerWindow进行窗口透明处理
SIZE sizeWindow={rc.Width(),rc.Height()};
POINT ptWinPos={rc.left, rc.top};
POINT ptSrc={0,0};
UpdateLayeredWindow(CDC::FromHandle(hdcTemp) ,&ptWinPos,&sizeWindow,
CDC::FromHandle(m_hdcMemory),&ptSrc,0,&m_Blend,ULW_ALPHA);
对话框的OnCreate中,创建子对话框
(CChildDlg * pChildWnd;)
pChildWnd = new COnWindow(this);
pChildWnd->Create(this);
pChildWnd->ShowWindow(SW_SHOW);
(2)子对话框
OnInitDialog函数中:
ModifyStyleEx(0, WS_EX_LAYERED); //窗体样式设为层级窗体
SetLayeredWindowAttributes(0xff00ff, 200, LWA_COLORKEY|LWA_ALPHA);
//这里的0xff00ff与下面的RGB(255,0,255)对应。200表示控件的透明度为200。参照SetLayeredWindowAttributes的用法
//载入按钮位图。IDB_OK1,IDB_OK2,IDB_CANCEL1,IDB_CANCEL2,对应于四张图片
(CBitmapButton m_ok, m_cancel;)
m_ok.LoadBitmaps(IDB_OK1,IDB_OK2);
m_cancel.LoadBitmaps(IDB_CANCEL1,IDB_CANCEL2);
//IDOK,IDCANCEL是子对话框上的2个按钮
m_ok.SubclassDlgItem(IDOK, this);
m_cancel.SubclassDlgItem(IDCANCEL, this);
OnCtlColor函数中:
if(nCtlColor==CTLCOLOR_DLG)
{
return m_brush;
}
注:
(CBrush m_brush; //背景画刷
m_brush.CreateSolidBrush(RGB(255,0,255));)