MFC畫圖

HRESULT ShowPic(CDC *pDC,CString lpstrFile,int x,int y, int nScrWidth, int nScrHeight)//對指定路徑文件縮放處理
{
    IPicture  *pPic;  
    IStream   *pStm;  
    BOOL      bResult;  


    HANDLE    hFile=NULL;  
    DWORD     dwFileSize,dwByteRead;  


    //打開硬盤中的圖形文件  
    hFile=CreateFile(lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
    if (hFile!=INVALID_HANDLE_VALUE)  
    {  
        dwFileSize=GetFileSize(hFile,NULL);//獲取文件字節數  
        if(dwFileSize==0xFFFFFFFF)  
        {
            CloseHandle(hFile);
            return E_FAIL;  
        }
    }  
    else  
    {  
        return E_FAIL;  
    }  




    //分配全局存儲空間  
    HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);  
    if(hGlobal==NULL)  
        return E_FAIL;  


    LPVOID  pvData =GlobalLock(hGlobal);  


    if(pvData==NULL)//鎖定分配內存塊  
    {
        GlobalFree(hGlobal);
        return E_FAIL;  
    }
    ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件讀入內存緩衝區  
    CloseHandle(hFile);//關閉打開的文件  


    GlobalUnlock(hGlobal);  


    CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);  


    //裝入圖形文件  
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);  
    GlobalFree(hGlobal);


    if(FAILED(bResult))  
        return E_FAIL;  


    long   hmWidth;//圖片的真實寬度  
    long   hmHeight;//圖片的真實高度  
    pPic->get_Width(&hmWidth);  
    pPic->get_Height(&hmHeight);  




    //將圖形輸出到屏幕上(有點像BitBlt)  
    bResult=pPic->Render(pDC->m_hDC,x,y,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL);  


    pPic->Release();  


    if(SUCCEEDED(bResult))  
    {  
        return   S_OK;  
    }  
    else  
    {  
        return   E_FAIL;  
    } 
}


總結知識點:
1.MFC顯示圖片 (Qt是創建了一個QPixmap對象進行的畫QPixmap,來進行實現的)




//****************顯示BMP格式圖片****************//
void CDrawMapTest8_23View::ShowBitmap(CDC *pDC, CString BmpName,CRect rect)
{
CImage img;
HRESULT ret=img.Load(BmpName);
HBITMAP m_hBitmap=img.Detach();


if( m_bitmap.m_hObject )
{
m_bitmap.Detach();           //切斷CWnd和窗口聯繫
}
m_bitmap.Attach(m_hBitmap);      //將句柄HBITMAP m_hBitmap與CBitmap m_bitmap關聯
/*
//邊界
CRect rect;
GetClientRect(&rect);


//圖片顯示(x,y)起始座標
int m_showX=0;
int m_showY=0;
int m_nWindowWidth = rect.right - rect.left;   //計算客戶區寬度
int m_nWindowHeight = rect.bottom - rect.top;  //計算客戶區高度
*/
//定義並創建一個內存設備環境DC
CDC dcBmp;
if( !dcBmp.CreateCompatibleDC(pDC) )   //創建兼容性的DC
return;

BITMAP m_bmp;                          //臨時bmp圖片變量
m_bitmap.GetBitmap(&m_bmp);            //將圖片載入位圖中

CBitmap *pbmpOld = NULL;      
dcBmp.SelectObject(&m_bitmap);         //將位圖選入臨時內存設備環境

//圖片顯示調用函數stretchBlt
pDC->StretchBlt(0,0,m_bmp.bmWidth,m_bmp.bmHeight,&dcBmp,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SRCCOPY);

dcBmp.SelectObject(pbmpOld);           //恢復臨時DC的位圖
DeleteObject(&m_bitmap);               //刪除內存中的位圖
dcBmp.DeleteDC();                      //刪除CreateCompatibleDC得到的圖片DC
}



發佈了42 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章