那树ppt课件:Picture control用法 - liufei_learning的专栏 - CSDN...

来源:百度文库 编辑:九乡新闻网 时间:2024/05/04 08:42:04
http://blog.csdn.net/liufei_learning/archive/2010/11/01/5979255.aspx把Picture控件的Notify属性改为enable 即可相应鼠标消息
 
方法1.先从最简单的开始,用picture 控件来实现.
 
 
 
步骤:
 
 
 
先在资源里Import一张图片,ID为IDB_BITMAP2
 
 
 
然后在对话框上添加一个picture控件,右键点击打开属性,
 
 
 
将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,
 
 
 
拉开就会看到所有已经载入好的图片,
 
 
 
选择你要的图片.运行程序即可看到.
 
 
 
 
 
 
 
方法2vc picture控件.通过背景图
 
 
 
同样如上,先载入一张图片,ID为IDB_BITMAP2
 
 
 
TestDlg.h中
 
 
 
CBrush m_brBk;//在public中定义  
 
TestDlg.cpp中
 
 
 
在初始化函数OnInitDialog()中加入:
 
 
 
BOOL CTestDlg::OnInitDialog()
 
 
 
{
 
 
 
                CDialog::OnInitDialog();
 
 
 
CBitmap bmp;
 
 
 
bmp.LoadBitmap(IDB_BITMAP2);
 
 
 
m_brBk.CreatePatternBrush(&bmp);
 
 
 
bmp.DeleteObject();
 
 
 
return TRUE;   // return TRUE   unless you set the focus to a control
 
 
 
}
 
 
 
 
 
 
 
在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:
 
 
 
HBRUSH   CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
 
{
 
 
 
                HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
 
 
                if (pWnd == this)
 
 
 
{
 
 
 
     return m_brBk;
 
 
 
}
 
 
 
        return hbr;
 
 
 
}
 
 
 
方法3 vc picture控件通过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
 
 
 
}
 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liufei_learning/archive/2010/11/01/5979255.aspx