vcpicture控件动态载入图片方法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Vc的picture控件动态载入图片方法(注意:以基于对话框的程序描述的)Chensq1.首先在CTestDlg类中声明一个变量:CBitmapm_bmp;2.然后我们在对话框中加入一个picture标签,名为IDC_STATIC13.编写函数LoadBmpFile()boolCMyDlg::LoadBmpFile(){if(m_bmp.m_hObject!=NULL)//判断m_bmp.DeleteObject();//载入图片HBITMAPhbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),tmp.bmp,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);if(hbmp==NULL)returnFALSE;//该段程序用来取得加载的BMP的信息m_bmp.Attach(hbmp);DIBSECTIONds;BITMAPINFOHEADER&bminfo=ds.dsBmih;m_bmp.GetObject(sizeof(ds),&ds);intcx=bminfo.biWidth;//得到图像宽度intcy=bminfo.biHeight;//得到图像高度//得到了图像的宽度和高度后,我们就可以对图像大小进行适应,//即调整控件的大小,让它正好显示一张图片.CRectrect;GetDlgItem(IDC_STATIC1)-GetWindowRect(&rect);ScreenToClient(&rect);GetDlgItem(IDC_STATIC1)-MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小returnTRUE;}4.重写OnPaint()函数voidCMyDlg::OnPaint(){/*if(IsIconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.DrawIcon(x,y,m_hIcon);}else{CDialog::OnPaint();}*///重写了OnPaint()函数////////////////////////////////////////////////////////////////////////////////////以下三种情况任选一种会是不同效果(只能一种存在)////1.//CPaintDCdc(this);//若用此句,得到的是对话框的DC,图片将被绘制在对话框上.//2.CPaintDCdc(GetDlgItem(IDC_STATIC1));//用此句,得到picture控件的DC,图像将被绘制在控件上//3.//CDCdc;//dc.m_hDC=::GetDC(NULL);//若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上./////////////////////////////////////////////////////////////////////////////////CRectrcclient;GetDlgItem(IDC_STATIC1)-GetClientRect(&rcclient);CDCmemdc;memdc.CreateCompatibleDC(&dc);CBitmapbitmap;bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclient.Height());memdc.SelectObject(&bitmap);CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_hDC,0);CDCmaskdc;maskdc.CreateCompatibleDC(&dc);CBitmapmaskbitmap;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);CBrushbrush;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();return;}二、显示图片的方法--在需要显示的地方调用以下语句:LoadBmpFile();//载入bmp图片/*这里还想说一下Invalidate和UpdateWindow的区别:Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。如果你调用Invalidate(TRUE)之后想马上更新屏幕,那就加上UpdateWindow()这条语句*/Invalidate(TRUE);UpdateWindow();=====================================================================OK!可以了。

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功