介绍一下MFC对话框工程读取BMP文件并显示的例子

来源:互联网 发布:完美者解码mac 编辑:程序博客网 时间:2024/05/21 22:39

1、首先创建一个基于对话框的MFC Project
2、定义一个全局的CBitmap对象
3、在合适的地方将BMP图片装入,并使用CBitmap的Attach方法
4、在窗口的OnPaint方法中,进行以下处理
    a、创建一个设备内存区(CDC 对象的 CreateCompatibleDC 方法),再利用 CBitmap 的CreateCompatibleBitmap方法初始化一个位图。执行设备的 SelectObject 方法为设备内存选择对象。
    b、DefWindowProc 调用窗口 WM_PAINT 过程,发送消息。
    c、再创建一个 CDC 对象,分别调用 CreateCompatibleDC 和 CreateBitmap 方法装入位图,执行设备的
SelectObject 方法为设备内存选择对象。
    d、调用 c 步骤的 CDC 对象的 BitBlt 方法做图像显示预处理。
    e、创建一个画刷,执行设备的 BitBlt 方法将图显示出来。



代码如下
-----------------------------------------
定义全局变量
-----------------------------------------------------------------------
CBitmap m_bmp;



装入图片部分
------------------------------------------------------------------------
    if( m_bmp.m_hObject != NULL )//判断
        m_bmp.DeleteObject();

   
    /////////载入图片

    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
                                        _T("1.bmp"),
                                        IMAGE_BITMAP,
                                        0,
                                        0,
                                        LR_CREATEDIBSECTION|LR_LOADFROMFILE);
    //if( hbmp == NULL )
    //    return FALSE;

///////////////////////该断程序用来取得加载的BMP的信息////////////////////////

    m_bmp.Attach( hbmp );
    DIBSECTION ds;
    BITMAPINFOHEADER &bminfo = ds.dsBmih;
    m_bmp.GetObject( sizeof(ds), &ds );
    int cx=bminfo.biWidth; //得到图像宽度
    int cy=bminfo.biHeight; //得到图像高度

/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////

    CRect rect;
    GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
    ScreenToClient(&rect);
    CBMPTestDlg::MoveWindow(rect.left,rect.top,cx+100,cy+300,true);
    GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小




OnPaint 函数部分
------------------------------------------------------------------------
        //CDialog::OnPaint();

        //////////////以下三种情况任选一种会是不同效果(只能一种存在)///////////
    //CPaintDC dc(this);      //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.
    CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上
      //CDC dc;
      //dc.m_hDC=::GetDC(NULL); //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///////////////////////////////////////////////////////
    CRect rcclient;
    GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient); //获取控件的大小

    //////////////////////////////////////////////////////
    //以下 5 行创建一个位图
    CDC memdc;
    memdc.CreateCompatibleDC(&dc);                //创建一个设备内存区
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclient.Height());//初始化一个位图,于设备(本例中为 PictureBox)具有相同的调色板和分辨率
    memdc.SelectObject( &bitmap );


    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
    CDC maskdc;
    maskdc.CreateCompatibleDC(&dc);
    CBitmap maskbitmap;
    maskbitmap.CreateBitmap(rcclient.Width(),
                            rcclient.Height(),
                            1,
                            1,
                            NULL);
    maskdc.SelectObject( &maskbitmap );
    maskdc.BitBlt(0,
                0,
                rcclient.Width(),
                rcclient.Height(),
                &memdc,
                rcclient.left,
                rcclient.top,
                SRCCOPY);

    CBrush brush;
    brush.CreatePatternBrush(&m_bmp);
    dc.FillRect(rcclient, &brush);
    dc.BitBlt(rcclient.left,
            rcclient.top,
            rcclient.Width(),
            rcclient.Height(),
            &memdc,
            rcclient.left,
            rcclient.top,
            SRCPAINT);
    brush.DeleteObject();

 

来自: http://hi.baidu.com/qizlee/blog/item/093738d7366cbadca144df04.html

原创粉丝点击