• <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国产电影网| 亚洲αv久久久噜噜噜噜噜| 四虎亚洲国产成人久久精品| 久久天天躁狠狠躁夜夜av浪潮| 国产成人久久精品二区三区| 国产香蕉97碰碰久久人人| 国产激情久久久久影院老熟女| 精品久久久久久无码人妻蜜桃| 久久精品国产一区二区三区| 无码8090精品久久一区| 欧美日韩精品久久久免费观看| 午夜不卡久久精品无码免费| 99国产欧美精品久久久蜜芽| 岛国搬运www久久| 久久久久久久女国产乱让韩| 久久久久女人精品毛片| 大美女久久久久久j久久| 超级碰碰碰碰97久久久久| 无码AV中文字幕久久专区| 91亚洲国产成人久久精品网址| 亚洲午夜无码AV毛片久久| 久久人爽人人爽人人片AV| 国产精品欧美久久久久天天影视| 亚洲国产天堂久久久久久| 久久天天躁狠狠躁夜夜网站| 国产成人久久精品麻豆一区 | 久久精品九九亚洲精品| 久久99国产精品久久| 亚洲国产一成久久精品国产成人综合| 无码人妻久久一区二区三区免费| 国产欧美久久一区二区| 欧美亚洲国产精品久久久久| 日韩欧美亚洲综合久久影院d3| 一本久道久久综合狠狠躁AV| 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品中文无码资源站| 精品国产福利久久久| 2020久久精品亚洲热综合一本|