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

            精品久久亚洲中文无码| 国产成人无码精品久久久性色| 国内精品免费久久影院| 老男人久久青草av高清| 国产日韩久久久精品影院首页| 伊人久久大香线焦AV综合影院| 久久天天躁夜夜躁狠狠躁2022| 免费一级做a爰片久久毛片潮| 久久精品成人| 久久国产高清一区二区三区| 狠狠色综合网站久久久久久久 | 久久精品国产2020| 精品久久久无码21p发布| 精品国产乱码久久久久久人妻| 亚洲欧美日韩久久精品第一区| 亚洲伊人久久精品影院| 精品人妻久久久久久888| 99精品久久久久中文字幕| a高清免费毛片久久| 久久国产一片免费观看| 久久99热这里只有精品66| 亚洲综合伊人久久大杳蕉| 无码人妻久久一区二区三区| 2021久久精品国产99国产精品| 国产亚洲欧美精品久久久| 色综合合久久天天综合绕视看| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产精品久久久久天天影视| 久久亚洲国产精品123区| 久久国产热精品波多野结衣AV| 久久精品国产亚洲av麻豆小说| 精品久久久久久国产| 久久久久一本毛久久久| 2021最新久久久视精品爱 | 精品久久久久香蕉网| 国产精品青草久久久久福利99| 欧美伊人久久大香线蕉综合69| 精品久久久无码人妻中文字幕| 精品国产91久久久久久久| 亚洲精品综合久久| 亚洲狠狠综合久久|