在对话框中选择图片

    技术2022-05-11  137

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

    默认导入的图片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()

    {

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

        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);

    }

     

     

     


    最新回复(0)