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

            麻豆精品久久久一区二区| 久久久久久久尹人综合网亚洲| 久久精品国产99久久丝袜| 亚洲中文字幕无码久久综合网| 亚洲伊人久久综合中文成人网| 中文字幕人妻色偷偷久久| 国产精品久久久天天影视| 久久国产精品免费| 久久久国产视频| 99久久久精品| 久久99热这里只频精品6| 99久久国语露脸精品国产| 人妻中文久久久久| 精品久久一区二区三区| 亚州日韩精品专区久久久| .精品久久久麻豆国产精品| 一极黄色视频久久网站| 久久精品免费观看| 亚洲国产精品18久久久久久| 久久久久九国产精品| 久久国产精品99久久久久久老狼 | 亚洲欧洲久久av| 99久久夜色精品国产网站| 久久九九兔免费精品6| 久久久国产亚洲精品| 久久久久亚洲av毛片大| 亚洲综合婷婷久久| 国产精品美女久久久久网| 久久综合香蕉国产蜜臀AV| 东方aⅴ免费观看久久av| 久久久久综合国产欧美一区二区 | 热久久国产精品| 999久久久无码国产精品| 久久AV高清无码| 国产精品美女久久久m| 激情伊人五月天久久综合| 久久香蕉国产线看观看精品yw | 9999国产精品欧美久久久久久| 99久久人妻无码精品系列蜜桃| 久久久精品人妻一区二区三区蜜桃 | 亚洲国产精品成人久久|