在对话框中选择图片(VC7.1)

本文介绍如何在MFC对话框中实现图片加载和显示功能,包括使用CDIB类进行位图文件的读取和显示,以及通过按钮控件触发图片选择对话框来更新显示的图片。

默认导入的图片ID:  IDB_BITMAP1

PICTURE空件ID: IDC_BNBMP

EDIT控件ID: IDC_PHOTO 添加OnEnChangePhoto()消息处理(可将这个属性设为隐藏)

BUTTON控件ID: IDC_SELECT 处理消息:OnBnClickedSeclect()

 

定义两个变量:CDIB m_Dib, CString m_strFileName;

 

 

//初始化函数
BOOL CSelectDlg::OnInitDialog()

{

    ………………….;

    //  执行此操作

    SetIcon(m_hIcon, TRUE);         // 设置大图标

    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

 

    SetDlgItemText(IDC_PHOTO,"1.bmp");//设置默认导入图片的标题

    return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE

}

 

 

//

void CSelectDlg::OnBnClickedSelect()

{

    // 默认导入的格式为BMP的过滤器

    static char szFilter[]="BMP 文件(*.bmp)|*.bmp|";

 

    CFileDialog dlg(TRUE,"bmp",NULL,

        OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);

 

    if(dlg.DoModal()==IDOK)

    {

        m_strFileName =dlg.GetFileName();

 

        SetDlgItemText(IDC_PHOTO,m_strFileName);//设置标题

    }

 

}


 //
void CSelectDlg::OnEnChangePhoto()

{

    // TODO:  如果该控件是 RICHEDIT 控件,则它将不会

    // 发送该通知,除非重写 CDialog::OnInitDialog()

    // 函数并调用 CRichEditCtrl().SetEventMask(),

    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。


 
    // TODO:  在此添加控件通知处理程序代码

    GetDlgItemText(IDC_PHOTO,m_strFileName);

    if(m_strFileName.IsEmpty())

    {

        //m_Dib.LoadFromFile("1.bmp");

        CWnd *pWnd=GetDlgItem(IDC_BNBMP);

        CDC *pDC=pWnd->GetDC();

        CRect rect;

        pWnd->GetClientRect(&rect);

        m_Dib.ShowDIB(pDC,0,0,rect.Width(),rect.Height());

        return;

    }

    if(!m_Dib.LoadFromFile(m_strFileName))

        return;

    CWnd *pWnd=GetDlgItem(IDC_BNBMP);

    CDC *pDC=pWnd->GetDC();

    CRect rect;

    pWnd->GetClientRect(&rect);

    m_Dib.ShowDIB(pDC,0,0,rect.Width(),rect.Height());

}


 
// Dib.h

#pragma once


 
class CDIB : public CObject

{

public:

       CDIB();

       ~CDIB();

    BITMAPINFO* m_pBMI;//BITMAPINFO结构指针

    BYTE* m_pDIBData;//DIB图像数据指针

    BOOL LoadFromFile(LPCTSTR lpszFileName);//装入位图文件

    //显示位图

      void ShowDIB(CDC* pDC,int nLeft,int nTop,int nWidth,int nHeight);

};


 
// DIB.cpp : CDIB类实现文件

#include "stdafx.h"

#include "DIB.h"


 
CDIB::CDIB()

{

    m_pBMI=NULL;

    m_pDIBData=NULL;

}


 
CDIB::~CDIB()

{

    if(m_pBMI!=NULL)

        delete m_pBMI;

    if(m_pDIBData!=NULL)

        delete m_pDIBData;

}

// CDIB 成员函数

BOOL CDIB::LoadFromFile(LPCTSTR lpszFileName)

{

    CFile file;

    if(!file.Open(lpszFileName,CFile::modeRead | CFile::typeBinary))

    {

        return FALSE;

    }

    BITMAPFILEHEADER bfh;

    if(file.Read(&bfh,sizeof(bfh))!=sizeof(bfh))

    {

        AfxMessageBox("读位图文件头出现错误!");

        return FALSE;

    }

    if(bfh.bfType!=0x4d42)

    {

        AfxMessageBox("不是位图文件!");

        return FALSE;

    }

    BITMAPINFOHEADER bih;

    if(file.Read(&bih,sizeof(bih))!=sizeof(bih))

    {

        AfxMessageBox("读取位图信息出现错误!");

        return FALSE;

    }

    if(bih.biBitCount!=24)

    {

        AfxMessageBox("不是真24色位图,程序暂不支持!");

        return FALSE;

    }

    m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];

    if(!m_pBMI)

    {

        AfxMessageBox("内存分配错误!");

        return FALSE;

    }

    memcpy(m_pBMI,&bih,sizeof(BITMAPINFOHEADER));

    DWORD dataBytes=bfh.bfSize-bfh.bfOffBits;

    m_pDIBData=(BYTE*)new char[dataBytes];

    if(!m_pDIBData)

    {

        AfxMessageBox("内存分配错误!");

        delete m_pBMI;

        return FALSE;

    }

    if(file.Read(m_pDIBData,dataBytes)!=dataBytes)

    {

        AfxMessageBox("读位图数据错误!");

        delete m_pBMI;

        delete m_pDIBData;

        return  FALSE;

    }

    file.Close();

    return TRUE;

}

void CDIB::ShowDIB(CDC *pDC,int nLeft,int nTop,int nWidth,int nHeight)

{

    pDC->SetStretchBltMode(COLORONCOLOR);

    StretchDIBits(pDC->GetSafeHdc(),

        nLeft,

        nTop,

        nWidth,

        nHeight,

        0,

        0,

        m_pBMI->bmiHeader.biWidth,

        m_pBMI->bmiHeader.biHeight,

        m_pDIBData,

        m_pBMI,

        DIB_RGB_COLORS,

        SRCCOPY);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值