在对话框中选择图片

来源:互联网 发布:成立私募 知乎 编辑:程序博客网 时间:2024/04/26 07:26

在对话框中选择图片(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);

}

 

 

 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机一天接到多个陌生电话怎么办 阳光惠生活登录密码忘了怎么办 一个身份证注册了两个支付宝怎么办 买手办拆了发现坏了怎么办 六个月宝宝喝贝因美过敏怎么办 超市盘点少的货扣员工工资怎么办 孩子东西在学校被偷了怎么办 想退出却不舍的感情不知怎么办? 我被老板摸全身失眠有阴影怎么办 不知道绑定支付宝的微博账号怎么办 银行卡丢了补办后支付宝账户怎么办 未激活的银行卡被锁定了怎么办 手机网银上的钱被盗走了怎么办 支付宝支付失败银行卡扣了钱怎么办 小程序的二次验证码丢失怎么办 苹果手机不小心购买游戏币怎么办 在淘宝买的洗衣粉是假的怎么办 京东快递电话填错了怎么办 新买的手机卡被注册过支付宝怎么办 手机卡掉了别人登陆支付宝怎么办 手机卡注销了支付宝欠的钱怎么办 手机丢了支付宝和微信里的钱怎么办 新办的手机号已被注册支付宝怎么办 新办的移动卡不能注册支付宝怎么办 新办的宝卡支付宝注册过怎么办 办支付宝后银行卡被盗刷怎么办 微信扫二维码送平衡群发了怎么办车 拼多多没收到货点了确认收货怎么办 拼多多收货地址填错了怎么办 京东订单申请退款已发货怎么办 手机播放声音的地方进水了怎么办 手机出声音的地方进水了怎么办 手机听声音的地方进水了怎么办 装修公司我只要基装她不肯怎么办 雄迈未来家庭忘记账号和密码怎么办 地方文件和国家政策有冲突怎么办? 网上贷款放款成功没有到账怎么办 我来贷放款中不到账怎么办 手持身份证被别人网贷了怎么办 身份证被别人做了网贷怎么办 身份证丢了被别人网贷了怎么办