分享

MFC中创建透明窗口

 水中麒麟 2013-09-06
第一种  全透明 

1.设置窗口透明

  1: //Set WS_EX_LAYERED on this window
  2: ::SetWindowLong(GetSafeHwnd(),
  3:         GWL_EXSTYLE,
  4: 	   ::GetWindowLongPtr(GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);
  5: 
  6: //Make this window 70% alpha transparent
  7: this->SetLayeredWindowAttributes(0,(255*70)/100,LWA_ALPHA);

2.去除窗口透明

  1: //Remove WS_EX_LAYERED from window style
  2: ::SetWindowLong(GetSafeHwnd(),
  3:     GWL_EXSTYLE,
  4: 	::GetWindowLongPtr(GetSafeHwnd(),GWL_EXSTYLE)&~WS_EX_LAYERED);
  5: //Repaint
  6: this->RedrawWindow();

3.实际运行效果

ScreenShot00074

ScreenShot00075

---------------------------------------------------------------------------

第二种    让指定的部分为透明色彩

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多