小小小幸运 发表于 2024-11-13 04:12:14

MFC中Picture Control控件显示照片的几种方式

目前使用CImage和CBitmap两个类,还有是将CImage转CBitmap显示。
MFC界面拖拽一个button按钮和一个Picture Control控件。
1.CImage显示。这种方式显示图片会有颜色不对的情况
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码

        CImage image;
        HRESULT hResult = image.Load("D:\\jpeg.bmp");
        if (!SUCCEEDED(hResult)) {
                AfxMessageBox("imread error");
        }
        //获取picture control 句柄
        CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
       
        //获取控件大小
        CRect rect;
        pStatic->GetClientRect(&rect);
        int controlWidth = rect.Width();
        int controlHeight = rect.Height();

        //获取图片原始尺寸
        int imageWidth = image.GetWidth();
        int imageHeight = image.GetHeight();

        //创建兼容的DC
        CDC *pDC = pStatic->GetDC();
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);

        //创建兼容的位图,并选入内存DC
        CBitmap bmp;
        bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);
        CBitmap* pOldbmp = memDC.SelectObject(&bmp);

        BITMAP bmpInfo;
        bmp.GetBitmap(&bmpInfo); // 获取位图信息

        //清空背景
        memDC.FillSolidRect(&rect, pDC->GetBkColor());

        //使用CImage绘制倒内存DC, 这里使用缩放
        image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);

        //将内存DC绘制到控件上
        pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);

        //清理
        memDC.SelectObject(pOldbmp);
        ReleaseDC(pDC);
}
2.CBitmap显示
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码

        //需要再资源视图中增加资源,资源类型为Bitmap
        CBitmap img;
        if (!img.LoadBitmap(IDB_BITMAP2)) {
                AfxMessageBox("imread error");
        }

        // 获取Picture Control的设备上下文
        CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
        CDC *pDC = pStatic->GetDC();

        // 获取对话框和图片的尺寸
        CRect rect;
        pStatic->GetClientRect(&rect);
        BITMAP bmpInfo;
        img.GetBitmap(&bmpInfo);

        // 创建兼容的内存设备上下文
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        CBitmap* pOldBitmap = memDC.SelectObject(&img);

        // 绘制缩放后的图片
        int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
        pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
        pDC->SetStretchBltMode(iStretchMode);

        // 清理
        memDC.SelectObject(pOldBitmap);
        ReleaseDC(pDC);
}
3.将CImage转CBitmap显示。有两种方式
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码

        CImage image;
        HRESULT hResult = image.Load("D:\\jpeg.bmp");
        if (!SUCCEEDED(hResult)) {
                AfxMessageBox("imread error");
        }
        HBITMAP hBitmap = image.Detach();
        CBitmap img;
        img.DeleteObject();
        img.Attach(hBitmap);

        // 获取Picture Control的设备上下文
        CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
        CDC *pDC = pStatic->GetDC();

        // 获取对话框和图片的尺寸
        CRect rect;
        pStatic->GetClientRect(&rect);
        BITMAP bmpInfo;
        img.GetBitmap(&bmpInfo);

        // 创建兼容的内存设备上下文
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        CBitmap* pOldBitmap = memDC.SelectObject(&img);

        // 绘制缩放后的图片
        int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
        pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
        pDC->SetStretchBltMode(iStretchMode);

        // 清理
        memDC.SelectObject(pOldBitmap);
        ReleaseDC(pDC);

}
void Cpicture_test_controlDlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码

        CImage image;
        HRESULT hResult = image.Load("D:\\jpeg.bmp");
        if (!SUCCEEDED(hResult)) {
                AfxMessageBox("imread error");
        }
        HBITMAP hBitmap = image.Detach();
        CBitmap *img = CBitmap::FromHandle(hBitmap);

        // 获取Picture Control的设备上下文
        CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
        CDC *pDC = pStatic->GetDC();

        // 获取对话框和图片的尺寸
        CRect rect;
        pStatic->GetClientRect(&rect);
        BITMAP bmpInfo;
        img->GetBitmap(&bmpInfo);

        // 创建兼容的内存设备上下文
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        CBitmap* pOldBitmap = memDC.SelectObject(img);

        // 绘制缩放后的图片
        int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
        pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
        pDC->SetStretchBltMode(iStretchMode);

        // 清理
        memDC.SelectObject(pOldBitmap);
        ReleaseDC(pDC);

}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MFC中Picture Control控件显示照片的几种方式