• <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

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 398, 文章 - 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 閱讀(2030) 評論(0)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            久久久久国产一区二区| 亚洲AV无码久久| 久久亚洲av无码精品浪潮| 性做久久久久久免费观看| 欧美大香线蕉线伊人久久| 91久久精品91久久性色| 噜噜噜色噜噜噜久久| 精品久久久久久国产91| 久久精品免费全国观看国产| 国内精品伊人久久久久av一坑| 久久久久久无码国产精品中文字幕| 亚洲狠狠婷婷综合久久蜜芽| 中文字幕亚洲综合久久2| 亚洲精品乱码久久久久久久久久久久 | 久久毛片免费看一区二区三区| 伊人久久综合无码成人网| 国产激情久久久久影院老熟女| 亚洲国产精品无码久久一线| 久久亚洲国产精品五月天婷| 国产精品伊人久久伊人电影| 久久99中文字幕久久| 奇米影视7777久久精品| 日本久久久久久久久久| 9191精品国产免费久久| 精品久久久久久中文字幕人妻最新| 亚洲国产成人精品无码久久久久久综合| 久久亚洲AV成人无码国产| 久久久久久久久久久| 亚洲国产婷婷香蕉久久久久久| 国内精品久久久久久久亚洲| 国产精品熟女福利久久AV| 久久亚洲国产中v天仙www| 久久无码av三级| 国产999精品久久久久久| 国产毛片久久久久久国产毛片| 成人免费网站久久久| 久久这里只精品国产99热| 久久中文娱乐网| 精品久久久久久久久久中文字幕| 色综合久久综合网观看| 狠狠色伊人久久精品综合网|