VC实现半透明对话框及控件

时间:2022-09-18 06:04:19

基本原理:将父对话框设置为全透明,再铺一张半透明图片与原对话框混合处理,得到半透明的父对话框。

在子对话框中,将除控件外的区域设置为全透明。再将子对话框作为父对话框的子窗口,以层级样式显示出来。

 

(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));)