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

            MUILIB

            讓UI設計師的思想自由飛翔

               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
              33 隨筆 :: 0 文章 :: 39 評論 :: 0 Trackbacks
             1、IPicture接口對象的創建
                     方法1:直接通過文件創建
            LPCSTR szFileUrl;
             IPicture 
            *pIPicture;
             OleLoadPicturePath(CComBSTR(szFileUrl), 
               (LPUNKNOWN)NULL, 
               
            0
               
            0
               IID_IPicture,
               (LPVOID
            *)&pIPicture))
                    方法2:通過IStream來創建
             
            // 加載電子地圖
             LPCSTR szFileUrl;
             IStream 
            *pStream = NULL;
             IPicture 
            *pIPicture = NULL;;
             CFileStatus fstatus;
             CFile file;
             LONG lFileSize;
             HGLOBAL hGlobal;
             
            if(file.Open(szFileUrl, CFile::modeRead) && file.GetStatus(szFileUrl, fstatus) 
              
            && ((lFileSize = fstatus.m_size) != -1))
             {
              hGlobal 
            = GlobalAlloc(GMEM_MOVEABLE, lFileSize);// 開辟大內存
              if(hGlobal != NULL)
              {
               LPVOID pvData 
            = NULL;
               pvData 
            = GlobalLock(hGlobal);
               
            if(pvData != NULL)
               { 
                file.ReadHuge(pvData, lFileSize);   
            // 將圖片數據保存在內存中
                GlobalUnlock(hGlobal);
                CreateStreamOnHGlobal(hGlobal, TRUE, 
            &m_pIStream);  // 創建流
                file.Close();
               }
               
            else
               {
                GlobalFree(hGlobal);
                
            return;
               }
              }
              
            else
              {
               file.Close();
               
            return;
              }
             }
             
            else
             {
              
            //打開圖片失敗
              return;
             }
             OleLoadPicture(m_pIStream, fstatus.m_size, TRUE, IID_IPicture, (LPVOID
            *)&m_pIPicture);
             GlobalFree(hGlobal);

            2、通過IPicture來獲取圖片的尺寸
             OLE_XSIZE_HIMETRIC hmPicWidth;       
             OLE_YSIZE_HIMETRIC hmPicHeight;      
             pIPicture
            ->get_Width(&hmPicWidth);   // 獲取圖像寬度
             pIPicture->get_Height(&hmPicHeight); // 獲取圖像高度
             
            // 轉化單位為象素
             nPicWidth = MulDiv(hmPicWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);
             nPicHeight 
            = MulDiv(hmPicHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);


            3、通過IPicture來畫圖
            void ShowPicture(CDC *pDC)
            {
             OLE_XPOS_HIMETRIC xSrc;  
            // 圖片中當前顯示區域的x
             OLE_YPOS_HIMETRIC ySrc;  // 圖片中當前顯示區域的y
             OLE_XSIZE_HIMETRIC cxSrc; // 圖片中當前顯示區域的寬度
             OLE_YSIZE_HIMETRIC cySrc; // 圖片中當前顯示區域的高度
             m_pIPicture->Render(*pDC, 00, m_rcBox.Width(), m_rcBox.Height(), xSrc, ySrc, cxSrc, cySrc, NULL);
            }


            4、將IPicture中的圖片保存起來
            BOOL SaveToFileFromIPicture(LPCSTR szFileName, IPicture 
            *pPic)
            {
             
            // Create ILockBytes Buffer
             ILockBytes *plkbyt = NULL;
             CreateILockBytesOnHGlobal(NULL, TRUE, 
            &plkbyt);

             
            // Create IStorage
             IStorage   *pStorage = NULL;
             HRESULT hr 
            = ::StgCreateDocfileOnILockBytes(plkbyt,
              STGM_SHARE_EXCLUSIVE 
            | STGM_CREATE | STGM_READWRITE, 0&pStorage);
             
            if (FAILED(hr))
             {
              plkbyt
            ->Release();
              plkbyt 
            = NULL;
              
            return FALSE;
             }

             
            // Create IStream
             IStream    *pStream = NULL;
             hr 
            = pStorage->CreateStream(L"PICTURE",
              STGM_SHARE_EXCLUSIVE 
            | STGM_CREATE | STGM_READWRITE, 00&pStream);
             
            if (FAILED(hr))
             {
              pStorage
            ->Release();
              pStorage 
            = NULL;
              plkbyt
            ->Release();
              plkbyt 
            = NULL;
              
            return FALSE;
             }
             
             
            // Copy Data Stream
             long  lSize;
             hr 
            = pPic->SaveAsFile(pStream, TRUE, &lSize); 
             
            if (FAILED(hr))
             {
              pStream
            ->Release();
              pStream 
            = NULL;
              pStorage
            ->Release();
              pStorage 
            = NULL;
              plkbyt
            ->Release();
              plkbyt 
            = NULL;
              
            return FALSE;
             }
             
            // Get Statistics For Final Size Of Byte Array
             STATSTG  statStg;
             hr 
            = plkbyt->Stat(&statStg, STATFLAG_NONAME);
             
            if (FAILED(hr))
             {
              pStream
            ->Release();
              pStream 
            = NULL;
              pStorage
            ->Release();
              pStorage 
            = NULL;
              plkbyt
            ->Release();
              plkbyt 
            = NULL;
              
            return FALSE;
             }

             
            // calculate "Pure" Picture Data, Must Be In a 512 Blocks
             double  dbSkipFloat = (double(lSize) / 512);   
             DWORD  dwPicDataSize 
            = 0;
             
            if(dbSkipFloat > DWORD(dbSkipFloat)) 
             {
              dwPicDataSize 
            = (DWORD)dbSkipFloat + 1;
             }
             
            else 
             {
              dwPicDataSize 
            = (DWORD)dbSkipFloat;
             }
             dwPicDataSize 
            = dwPicDataSize * 512
             
            // Allocate Only The "Pure" Picture Data
             BYTE  *pPicDataBuffer = (BYTE*)malloc(dwPicDataSize);
             
            if (pPicDataBuffer == NULL)
             {
              pStream
            ->Release();
              pStream 
            = NULL;
              plkbyt
            ->Release();
              pStorage
            ->Release();
              pStorage 
            = NULL;
              plkbyt 
            = NULL;
              
            return FALSE;
             }
             
             
            // Read "Pure" Picture Data to Buffer
             _ULARGE_INTEGER ulOffset;
             ulOffset.LowPart 
            = 0;
             ulOffset.HighPart 
            = 0;
             ulOffset.QuadPart 
            = (DWORD)(statStg.cbSize.QuadPart - dwPicDataSize);
             DWORD dwRealDataSize;
             hr 
            = plkbyt->ReadAt(ulOffset, pPicDataBuffer, dwPicDataSize, &dwRealDataSize);
             
            if (FAILED(hr))
             {
              free(pPicDataBuffer);
              pPicDataBuffer 
            = NULL;
              pStream
            ->Release();
              pStream 
            = NULL;
              pStorage
            ->Release();
              pStorage 
            = NULL;
              plkbyt
            ->Release();
              plkbyt 
            = NULL;
              
            return FALSE;
             }
             
             
            // Save "Pure" Picture Data to file
             CFile  fBmp; 
             CFileException e;
             
            if (!fBmp.Open(szFileName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
             {
              free(pPicDataBuffer);
              pPicDataBuffer 
            = NULL;
              pStream
            ->Release();
              pStream 
            = NULL;
              pStorage
            ->Release();
              pStorage 
            = NULL;
              plkbyt
            ->Release();
              plkbyt 
            = NULL;
              
            return FALSE;
             }
             fBmp.Write(pPicDataBuffer, dwRealDataSize);
             fBmp.Close();
             free(pPicDataBuffer);
             pPicDataBuffer 
            = NULL;
             pStream
            ->Release();
             pStream 
            = NULL;
             pStorage
            ->Release();
             pStorage 
            = NULL;
             plkbyt
            ->Release();
             plkbyt 
            = NULL;
             
            return TRUE;
            }


            5、將IPicture中圖片按規定的尺寸保存
            BOOL CIPictureDlg::Save2File(LPCSTR szFileName, IPicture 
            *pPic, int nWidth, int nHeight)
            {
             
            // create a new IPicture
             OLE_HANDLE hPic = NULL;
             
            if (FAILED(pPic->get_Handle(&hPic)))
             {
              
            return FALSE;
             }
             HBITMAP hBmp 
            = (HBITMAP)CopyImage((HANDLE)hPic,
               IMAGE_BITMAP, 
               nWidth, 
               nWidth, 
               LR_CREATEDIBSECTION);
             
            if (hBmp == NULL)
             {
              
            return FALSE;
             }
             PICTDESC picDesc;
             picDesc.cbSizeofstruct 
            = sizeof(PICTDESC);
             picDesc.picType 
            = PICTYPE_BITMAP;
             picDesc.bmp.hbitmap 
            = hBmp;

             IPicture 
            *pNewPic = NULL;
             
            if (SUCCEEDED(OleCreatePictureIndirect(&picDesc, IID_IPicture, FALSE, (LPVOID *)&pNewPic)))
             {
              
            // Save to file
              Save2File(szFileName, pNewPic);
              pNewPic
            ->Release();
              pNewPic 
            = NULL;
              DeleteObject(hBmp);
              hBmp 
            = NULL;
              
            return TRUE;
             }
             DeleteObject(hBmp);
             hBmp 
            = NULL;
             
            return FALSE;
            }
            posted on 2012-11-25 21:47 bukebushuo 閱讀(581) 評論(0)  編輯 收藏 引用
            狠狠久久综合| 久久国产精品一区| 久久久国产乱子伦精品作者| 久久综合给合久久狠狠狠97色69 | 香蕉久久夜色精品国产小说| 99久久精品免费| 国产精品久久久久久久久久影院| 久久亚洲精品成人AV| 色婷婷噜噜久久国产精品12p| 国产毛片欧美毛片久久久| 色综合久久久久网| 久久人与动人物a级毛片| 久久亚洲国产午夜精品理论片| 婷婷久久综合九色综合绿巨人 | 精品久久久久久无码人妻热| 久久妇女高潮几次MBA| 久久精品国产亚洲一区二区三区| 中文字幕日本人妻久久久免费| 国产福利电影一区二区三区,免费久久久久久久精 | 天天做夜夜做久久做狠狠| 国产精品99久久99久久久| 久久国产欧美日韩精品免费| 久久国产精品-久久精品| 欧美牲交A欧牲交aⅴ久久| 亚洲国产精品成人久久蜜臀 | 99久久婷婷国产一区二区| 久久综合狠狠综合久久| 97精品国产97久久久久久免费| 欧美一级久久久久久久大| 久久亚洲色一区二区三区| 久久精品国产亚洲网站| 青青草国产成人久久91网| 久久国产精品-久久精品| 久久国产精品一区二区| 婷婷综合久久狠狠色99h| 嫩草影院久久99| 99久久伊人精品综合观看| 国产亚洲色婷婷久久99精品91| 精品久久久久久99人妻| 久久九色综合九色99伊人| 久久人人爽人人爽人人片AV麻豆 |