VC++使用 GDI+等比例縮放圖片,並且居中顯示 MFC 重繪CButton 支持透明背景的png

轉載:https://www.cnblogs.com/lebronjames/archive/2011/01/27/1946379.html

轉載:https://blog.csdn.net/u014075753/article/details/52941230(CString 轉WCHAR*)

一.初始化GDI+

參考之前文章MFC 重繪CButton 支持透明背景的png

二.在指定矩形區域顯示圖片

1.在對話框中添加Gdiplus的Image 對象指針 ,在構造函數總初始化

private:
    Gdiplus::Image* m_imge;
CXXXDlg::CtestImgPicDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_TESTIMGPIC_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_imge = NULL;
}

2.在Onpain中顯示圖片到指定區域

........


        CPaintDC dc(this);
        // 繪製矩形邊框
        dc.MoveTo(0, 0);
        dc.LineTo(131, 0);
        dc.LineTo(131, 141);
        dc.LineTo(0, 141);
        dc.LineTo(0, 0);
        
        if(m_imge)
        {
            // 獲得控件客戶區矩形大小

            CRect rect(0,0,131,141);
            Gdiplus::Unit unit;
            Gdiplus::RectF Destrc(Gdiplus::REAL(rect.left), Gdiplus::REAL(rect.top), Gdiplus::REAL(rect.Width()), Gdiplus::REAL(rect.Height())),SourceRc;
            m_imge->GetBounds(&SourceRc,&unit);
        
            CSize size(m_imge->GetWidth(), m_imge->GetHeight());
            CRect newRc = RectSizeWithConstantRatio(rect, size);

            Gdiplus::RectF newDestrc(Gdiplus::REAL(newRc.left), Gdiplus::REAL(newRc.top), Gdiplus::REAL(newRc.Width()), Gdiplus::REAL(newRc.Height()));

            Gdiplus::Graphics graphics(m_hWnd);
            graphics.DrawImage(m_imge, newDestrc, 0, 0, m_imge->GetWidth(), m_imge->GetHeight(), Gdiplus::UnitPixel);

        }

...........

3.在選擇按鈕響應函數中切換圖片

void CXXXDlg::OnBnClickedBtnSelect()
{
    // TODO: 在此添加控件通知處理程序代碼

    CString gReadFilePathName;
    CString filter;
    filter = "jpg 文件(*.jpg)|*.jpg|所有文件(*.*)|*.*||";
    CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, NULL);
    if (fileDlg.DoModal() == IDOK)    //彈出對話框  
    {
        gReadFilePathName = fileDlg.GetPathName();//得到完整的文件名和目錄名拓展名  
        
        //CString filename = fileDlg.GetFileName();
     }

    if (m_imge)
    {
        delete m_imge;
        m_imge = NULL;
    }

    m_imge =  Gdiplus::Image::FromFile((WCHAR*)(gReadFilePathName.GetBuffer()));

    Invalidate();
}

4.運行效果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章