• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            EVC中的圖片背景透明處理

            在EVC或VC8.0中,有關圖片處理的資料并不多,SDK中的例子只是告訴你如何加載圖片,下面的代碼可以用在VC的任何編譯器上,它的原理是采用的雙緩沖技術,用為運算來完成此項功能。
            void TransparentBlt2( HDC hdcDest,      // 目標DC
                  int nXOriginDest,   // 目標X偏移
                  int nYOriginDest,   // 目標Y偏移
                  int nWidthDest,     // 目標寬度
                  int nHeightDest,    // 目標高度
                  HDC hdcSrc,         // 源DC
                  int nXOriginSrc,    // 源X起點
                  int nYOriginSrc,    // 源Y起點
                  int nWidthSrc,      // 源寬度
                  int nHeightSrc,     // 源高度
                  UINT crTransparent  // 透明色,COLORREF類型
                  )
            {
             HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 創建兼容位圖
             HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);   // 創建單色掩碼位圖
             HDC  hImageDC = CreateCompatibleDC(hdcDest);
             HDC  hMaskDC = CreateCompatibleDC(hdcDest);
             hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
             hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

             // 將源DC中的位圖拷貝到臨時DC中
             if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
              BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
             else
              StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
              hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

             // 設置透明色
             SetBkColor(hImageDC, crTransparent);

             // 生成透明區域為白色,其它區域為黑色的掩碼位圖
             BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

             // 生成透明區域為黑色,其它區域保持不變的位圖
             SetBkColor(hImageDC, RGB(0,0,0));
             SetTextColor(hImageDC, RGB(255,255,255));
             BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

             // 透明部分保持屏幕不變,其它部分變成黑色
             SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
             SetTextColor(hdcDest,RGB(0,0,0));
             BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

             // "或"運算,生成最終效果
             BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

             SelectObject(hImageDC, hOldImageBMP);
             DeleteDC(hImageDC);
             SelectObject(hMaskDC, hOldMaskBMP);
             DeleteDC(hMaskDC);
             DeleteObject(hImageBMP);
             DeleteObject(hMaskBMP);

            }

            這個函數的調用一般在WM_PAINT消息處理函數,在WIN32工程中,可參照下面的代碼來做:
            RECT rc;
            GetClientRect(hwnd,&rc);
             HDC dc = GetDC(hwnd);//客戶區的HDC
            void LoadImg(HDC dc,LPCTSTR FilePath)//HDC是客戶區的HDC,FilePath是文件路徑,
            {

             COLORREF crMask = RGB(255,0,255);
             HBITMAP m_hSrcBmp = SHLoadDIBitmap(FilePath);/此函數僅限于WM5.0等PPC,
             BITMAPINFO BitInfo;
             GetObject(m_hSrcBmp, sizeof(BITMAPINFO), &BitInfo);


             int nWidth = BitInfo.bmiHeader.biWidth;
             int nHeight = BitInfo.bmiHeader.biHeight;

             HDC ImageDC = CreateCompatibleDC(dc);

             HBITMAP pOldImageBMP = NULL;
             HDC OldDC = CreateCompatibleDC(dc);

             SelectObject(ImageDC,pOldImageBMP);
             SelectObject(ImageDC,m_hSrcBmp);


              TransparentBlt2(dc,24,0,nWidth,nHeight,ImageDC,0,0,nWidth,nHeight,crMask);

             
             SelectObject(ImageDC,pOldImageBMP);
            }
            MFC的工程的調用相對簡單,在OnPaint中調用
            {
            CRect rect;
             ::GetWindowRect (GetDlgItem(IDC_COMBO1)->m_hWnd, rect);
             ScreenToClient (rect);

             //加載位圖
             CBitmap m_bitmap;//注意這個變量不能是全局變量或類的成員變量,否則不能更新
              wchar_t FilePath1[128] = {0};
             
             m_bitmap.Attach(SHLoadImageFile(FilePath));
             

             COLORREF crMask = RGB(255,0,255);//要過濾顏色的RGB的值
             BITMAP bm;

             m_bitmap.GetBitmap(&bm);
              int nWidth1 = bm.bmWidth;
             int nHeight1 = bm.bmHeight;
             

             CDC ImageDC;
             ImageDC.CreateCompatibleDC(&dc);
             CBitmap *pOldImageBMP = ImageDC.SelectObject(&m_bitmap);
             TransparentBlt2(dc.m_hDC,0,rect.bottom,nWidth1,nHeight1,ImageDC.m_hDC,0,0,nWidth1,nHeight1,crMask);
             ImageDC.SelectObject(pOldImageBMP);
            }

            posted on 2008-11-09 22:48 Benjamin 閱讀(2020) 評論(0)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            欧美激情精品久久久久久久| 久久久久久国产精品美女| 久久久久久久国产免费看| 亚洲中文久久精品无码ww16| 深夜久久AAAAA级毛片免费看 | 亚洲va久久久久| 久久久久国产一区二区| 久久这里只精品国产99热| av无码久久久久不卡免费网站| 久久丫精品国产亚洲av| 亚洲国产欧美国产综合久久| 久久精品国产亚洲αv忘忧草 | 97精品依人久久久大香线蕉97| 青青热久久国产久精品 | 国内精品伊人久久久久网站| 久久国产乱子精品免费女| 久久99精品久久久久久| 久久国产精品久久国产精品| 青青草国产精品久久久久| 久久97精品久久久久久久不卡| 97久久精品无码一区二区天美| 久久青青草原亚洲av无码app| 亚洲AV无一区二区三区久久| 久久国产精品无码一区二区三区| 99久久久精品| 久久精品国产99久久久香蕉 | 久久噜噜久久久精品66| 久久久久女教师免费一区| 综合久久精品色| 人妻少妇久久中文字幕| 996久久国产精品线观看| 久久本道久久综合伊人| 久久精品国产久精国产果冻传媒| 蜜臀av性久久久久蜜臀aⅴ | 欧美伊人久久大香线蕉综合69| 亚洲伊人久久综合影院| 人妻无码中文久久久久专区| 26uuu久久五月天| 亚洲七七久久精品中文国产| 久久久久久夜精品精品免费啦| 国产精品无码久久综合网|