<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    子窗口的透明

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    由于項目中要實現子窗口的透明的功能,在網上找到了這一段提示:

    子窗口的透明和主窗口完全不同,   主窗口是通過layeredwindow實現的,   而子窗口則必須自己實現,   尤其是半透明,   必須自己對獲取的透明背景圖進行操作。   要實現子窗口的透明需要做到下面幾步: 

    1.   windows的ExStyle中需要包含WS_EX_TRANSPARENT屬性 
    2.   windows的Style中要去掉WS_CLIPSIBLING屬性 
    3.   對繼承自windows標準控件的子窗口(   比如edit,   scrollbar等等   ),   需要截獲WM_CTLCOLORxxx消息并返回一個style為BS_HOLLOW的brush的handle(即一個透明畫刷的handle) 
    4.   需要截獲WM_ERASEBKGND消息并不要清除背景(如果做到了3,   則這一步可以省略) 
    5.   最關鍵的一點(也是很多人沒有想到或不知道的),   必須將parent窗口style中的WS_CLIPCHILDREN標志去掉,   否則PARENT窗口重畫時不會重畫被子窗口覆蓋的部分. 
    6.   做到以上各步后,   在子窗口收到WM_PAINT消息時就可以獲得完整的背景圖了,   接下去對這背景進行處理就可以實現半透明效果. 

        另外一點,   最好同時截獲parent窗的WM_PAINT消息,   在parent窗重畫前調用InvalidateRect讓本子窗口顯示實效,   這樣子窗口才能同樣也收到一個WM_PAINT消息(   這樣做是為了保險,   因為我不是很確定主窗口重畫系統是否會自動給具有WS_EX_TRANSPARENT屬性的子窗口同樣發WM_PAINT   ).

     

     

    如果誰更好的實現方法,請告訴我

     

    實現過程中,我沒處理第二和第五提示。

    我的部分代碼如下:

    void CWndTool::AlphaCompositeBmp(const HBITMAP& bmpFront,const HBITMAP& bmpBKGround, HBITMAP& bmpDest, int nAlpha)
    {
     ASSERT(bmpFront);
     ASSERT(bmpBKGround);

     CBitmap* pBmpFront = CBitmap::FromHandle(bmpFront);
     CBitmap* pBmpBkGround = CBitmap::FromHandle(bmpBKGround);

     
     CDC memDcFront;
     CDC memDcBkGround;
     CDC memDcDest;
     
     BITMAP bmFront;

     CDC* pDc = GetDC();

     memDcFront.CreateCompatibleDC(pDc);
     memDcDest.CreateCompatibleDC(pDc);
     memDcBkGround.CreateCompatibleDC(pDc);

     CBitmap* pOldBmpFront = memDcFront.SelectObject(pBmpFront);
     pBmpFront->GetBitmap(&bmFront);
     
     CBitmap* pOldBmpBkGround = memDcBkGround.SelectObject(pBmpBkGround);

     if (m_pTmpDest)
     {
      delete m_pTmpDest;
      m_pTmpDest = NULL;
     }
     m_pTmpDest = new CBitmap();
     m_pTmpDest->CreateCompatibleBitmap(pDc, bmFront.bmWidth, bmFront.bmHeight);
     CBitmap* pBmpDest = memDcDest.SelectObject(m_pTmpDest);

     
     for (int i=0; i<bmFront.bmHeight; i++)
      for (int j=0; j<bmFront.bmWidth; j++)
      {
       int rFront,gFront,bFront;
       int rBkGround,gBkGround,bBkGround;
       int rDest,gDest,bDest;

       COLORREF crFront = memDcFront.GetPixel(j, i);
       COLORREF bkRgb = memDcBkGround.GetPixel(j, i);

       rFront = GetRValue(crFront);
       gFront = GetGValue(crFront);
       bFront = GetBValue(crFront);

       rBkGround = GetRValue(bkRgb);
       gBkGround = GetGValue(bkRgb);
       bBkGround = GetBValue(bkRgb);

       rDest = (rBkGround*nAlpha+rFront*(256-nAlpha))/256;
       gDest = (gBkGround*nAlpha+gFront*(256-nAlpha))/256;
       bDest = (bBkGround*nAlpha+bFront*(256-nAlpha))/256;

       COLORREF crDest = RGB(rDest, gDest, bDest);
       COLORREF crRet = memDcDest.SetPixel(j, i, crDest); 
      }

     memDcFront.SelectObject(pOldBmpFront);
     memDcBkGround.SelectObject(pOldBmpBkGround);
     memDcDest.SelectObject(pBmpDest);

     bmpDest = (HBITMAP)(m_pTmpDest->m_hObject);
    }

     

    void CWndTool::OnPaint()
    {
     CPaintDC dc(this); // device context for painting
     // TODO: Add your message handler code here
     // Do not call CUIWnd::OnPaint() for painting messages

      CRect rt;
      GetClientRect(&rt);
     
      CDC memDc;
      memDc.CreateCompatibleDC(&dc);
      CBitmap* pBmp = memDc.SelectObject(CBitmap::FromHandle(m_bmpDest));
      dc.BitBlt(0, 0, rt.Width(), rt.Height(), &memDc, 0, 0, SRCCOPY);
      memDc.SelectObject(pBmp);
    }

     

    void CWndTool::OnMouseMove(UINT nFlags, CPoint point)
    {
     if (m_isOverWnd == FALSE)
     {
      TRACKMOUSEEVENT tme;
      tme.cbSize = sizeof(tme);
      tme.hwndTrack = m_hWnd;
      tme.dwFlags = TME_HOVER|TME_LEAVE;
      tme.dwHoverTime = 1;
      _TrackMouseEvent(&tme);
      m_isOverWnd = TRUE;
     }
     CUIWnd::OnMouseMove(nFlags, point);
    }

    void CWndShowHeaderTool::OnTimer(UINT_PTR id)
    {
     if (id == TIMER_OVER_TOOLWND)
     {
      if (m_nTransparent < 55)
      {
       KillTimer(TIMER_OVER_TOOLWND);
       return;
      }

      if (m_bmpDest)
      {
       DeleteObject(m_bmpDest);
       m_bmpDest = NULL;
      }

      AlphaCompositeBmp(m_bmpFront, m_bmpBKGround, m_bmpDest, m_nTransparent);
      Invalidate(FALSE);
      UpdateWindow();
      m_nTransparent -= 50;
     }
     if (id == TIMER_LEAVE_TOOLWND)
     {
      if (m_nTransparent > 255)
      {
       KillTimer(TIMER_LEAVE_TOOLWND);
       return;
      }

      AlphaCompositeBmp(m_bmpFront, m_bmpBKGround, m_bmpDest, m_nTransparent);
      Invalidate(FALSE);
      UpdateWindow();
      m_nTransparent += 50;
     }
    }
    int CWndTool::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CUIWnd::OnCreate(lpCreateStruct) == -1)
      return -1;

     // TODO:  Add your specialized creation code here
     DWORD dwExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
     dwExStyle |= WS_EX_TRANSPARENT;
     SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle);

     m_bmpFront = LoadBITMAPOBJ(CUIMgr::GetUIPathWithoutTitle()+_T("IDB_CHATWND_TOOL.bmp"));
     m_bmpBKGround = LoadBITMAPOBJ(CUIMgr::GetUIPathWithoutTitle()+_T("IDW_CHAT_RIGHT_SHOW_HEADER.bmp"));

     AlphaCompositeBmp(m_bmpFront, m_bmpBKGround, m_bmpDest, m_nTransparent);

     return 0;
    }

    LRESULT CWndTool::OnMouseHover( WPARAM wParam, LPARAM lParam )
    {
     TRACE(_T("CWndShowHeaderTool::OnMouseHover %d/n"), IsMouseOver()?1:0);
     if (m_bHaveOverTimer == TRUE)
     {
      return 0;
     }

     m_isOverWnd   = true;
     m_bHaveOverTimer = TRUE;
     m_nTransparent  = 255;
     
     KillTimer(TIMER_LEAVE_TOOLWND);
     SetTimer(TIMER_OVER_TOOLWND, 50, NULL);

     return 0;
    }

    LRESULT CWndTool::OnMouseLeave( WPARAM wParam, LPARAM lParam )
    {
     TRACE(_T("CWndShowHeaderTool::OnMouseLeave %d/n"), IsMouseOver()?1:0);

     KillTimer(TIMER_OVER_TOOLWND);
     SetTimer(TIMER_LEAVE_TOOLWND, 50, NULL);

     m_isOverWnd   = false;
     m_bHaveOverTimer = FALSE;
     m_nTransparent  = 55;

     return 0;
    }

     

    from:http://blog.csdn.net/zhuzhubin/article/details/4418653
     

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全