对话框中显示图片

方法: 

通过CBitmap,HBITMAP,直接用OnPaint()绘制
首先在CTestDlg类中声明一个变量:   CBitmap  m_bmp;
然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1

然后:
BOOL CDisplayPic::OnInitDialog() 

    CDialog::OnInitDialog(); 


    if( m_bmp.m_hObject != NULL )//判断 
        m_bmp.DeleteObject();


/载入图片 
    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),  
               "c://aaa.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); 
    GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小 

    return TRUE;  // return TRUE unless you set the focus to a control 
                          // EXCEPTION: OCX Property Pages should return FALSE

}

图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息
void CDisplayPic::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);

    CDC memdc; 
    memdc.CreateCompatibleDC(&dc);  

    CBitmap bitmap; 
    bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height()); 
    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(); 

    // Do not call CDialog::OnPaint() for painting messages

}

 只支持BMP。

 

 

 

 

 

 

/

/

/

在WM_PAINT中画图
  这是显示图片最常用的方法,各类窗体、控件要加上背景都基本上是在OnPaint中将图片画上。具体做法如下:

  //从资源中载入图片 ,
  CBitmap bmp;
  bmp.LoadBitmap(IDB_BITMAP1);
  //得到图片信息
  BITMAP bmpInfo;
  bmp.GetBitmap(&bmpInfo);
  //在内存中创建一个位图兼容设备
   CDC dcMemory;
  dcMemory.CreateCompatibleDC(&dc);
   //将图片选入兼容设备
  CBitmap *pOldBmp=dcMemory.SelectObject(&bmp);
  //将兼容设备的内容copy到屏幕设备中,实现真正的Paint
  dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
  //将设备还原
  dcMemory.SelectObject(pOldBmp);

  这样图片便显示在主对话框上。  

  特殊处理:
  是不是经常有人提到某些加快图形显示、减少闪烁?处理什么WM_ERASEBKGND消息?
  确实是这样,应为每个窗体重画时,它先会发WM_ERASEBKGND消息,让窗体用设置好的刷子将窗体需要重画的区域刷一次,然后才会发送 WM_PAINT消息,将需要的再画上去。这样就可以保证不会有残留的图形。但这样就会在短暂的时间内出现灰色背景,如果执行比较慢,就会让人感觉到。因此如果你确定不需要清除原有的背景,那么你就可以在OnEraseBkgnd中直接返回TRUE,或者直接在这里面绘图。
  但一定要注意,不擦除背景时弄不好会带来上些麻烦事,源码中有此演示(由于一开始设置为不擦除背景,所以窗体创建时,没有画图的部分将显示为原来屏幕上的图象)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值