MFC中创建透明窗口

第一种 全透明
1.设置窗口透明

  //Set WS_EX_LAYERED on this window
  ::SetWindowLong(GetSafeHwnd(),
        GWL_EXSTYLE,
       ::GetWindowLongPtr(GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);

  //Make this window 70% alpha transparent
  this->SetLayeredWindowAttributes(0,(255*70)/100,LWA_ALPHA);

2.去除窗口透明

   //Remove WS_EX_LAYERED from window style
   ::SetWindowLong(GetSafeHwnd(),
      GWL_EXSTYLE,
    ::GetWindowLongPtr(GetSafeHwnd(),GWL_EXSTYLE)&~WS_EX_LAYERED);
  //Repaint
  this->RedrawWindow();

3.实际运行效果
这里写图片描述
这里写图片描述
第二种 让指定的部分为透明色彩

OnInitialDialog中

 COLORREF maskColor = RGB(255,255,255);

 SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
 HINSTANCE hInst=LoadLibrary(_T("User32.DLL"));
 if(hInst)
 {
 typedef BOOL (WINAPI * MYFUNC)(HWND , COLORREF,BYTE,DWORD);
 MYFUNC fun=NULL;
 fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");
 if(fun)fun(this->GetSafeHwnd(),maskColor,255,1);
 FreeLibrary(hInst);
 }

在Opaint函数的 else函数中

else
 {
 CRect rect;
 CPaintDC dc(this);
 GetClientRect(rect);
 dc.FillSolidRect(rect,RGB(255,255,255));
 //dc.FillSolidRect(rect,RGB(108,108,108));

 CBitmap bmp1,bmp2;
 //bmp1.LoadBitmap(IDB_B_1);
 bmp1.LoadBitmap(IDB_BITMAP6);
 bmp2.LoadBitmap(IDB_BITMAP7);

 //bmp2.LoadBitmap(IDB_B_2);
 //CPaintDC dc(this); // device context for painting
 CDC memDC;
 memDC.CreateCompatibleDC(&dc);
 CBitmap* pbmpOld;

 pbmpOld = memDC.SelectObject(&bmp1);
 dc.BitBlt(0, 0, 2000, 1500, &memDC, 0, 0, SRCPAINT);  // 注意最后一个参数

 memDC.SelectObject(&bmp2);
 dc.BitBlt(0, 0, 2000, 1500, &memDC, 0, 0, SRCAND);  // 注意最后一个参数

 memDC.SelectObject(pbmpOld);
 memDC.DeleteDC();



 CDialog::OnPaint();
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值