Picture control用法

来源:互联网 发布:网络电视直播不清楚 编辑:程序博客网 时间:2024/05/13 01:26

 

 

把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

 

}

 

源文档 <http://blog.csdn.net/Jiang_Yonghan/archive/2010/05/15/5594445.aspx>

 

原创粉丝点击