• <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)  編輯 收藏 引用
            久久久无码精品亚洲日韩京东传媒 | 精品久久无码中文字幕| 久久久久99这里有精品10| 久久精品一区二区三区AV| 精品蜜臀久久久久99网站| 国内精品久久久久久不卡影院| 久久不见久久见免费影院www日本| 国产精品99久久久精品无码 | 一本久久知道综合久久| 1000部精品久久久久久久久| 久久久国产精品| 亚洲av成人无码久久精品| 欧美亚洲国产精品久久蜜芽| 激情五月综合综合久久69| 99久久99久久精品国产片果冻| 99久久精品费精品国产一区二区 | 777久久精品一区二区三区无码| 久久亚洲av无码精品浪潮| 国产精品久久久久…| 久久精品综合网| 国产91久久综合| 72种姿势欧美久久久久大黄蕉 | 91精品国产高清久久久久久io| 久久精品国产精品亜洲毛片 | 青草国产精品久久久久久| 一本色道久久综合狠狠躁篇| 青青草国产成人久久91网| 婷婷久久久亚洲欧洲日产国码AV| 久久久久久国产精品免费免费| 伊人久久免费视频| 大蕉久久伊人中文字幕| 老司机国内精品久久久久| 国内精品久久人妻互换| 国产成人无码精品久久久性色| 日韩中文久久| 热久久最新网站获取| 久久精品夜色噜噜亚洲A∨| 久久99精品国产麻豆婷婷| 精品久久久久久无码免费| 久久精品国产亚洲Aⅴ蜜臀色欲 | 亚洲精品无码久久不卡|