早期时候就网上找代码实现了VC++对话框的picture control静态/动态加载BMP图片,然而并没用真正的理解到其中的实质,以至于再次使用时总出错。故写此博客方便后续的查看,也希望对需要的人有所帮助:
Picture control控件、Text Control等都属于静态文本控件,所属类都是CStatic类
一. picture control静态加载BMP图片
(1)新建一个MFC对话框,并添加picture控件.
(2)准备一张Bitmap图片,名称设为“test.bmp”,放到工程的res文件夹中.
(3)在“资源视图”中添加Bitmap资源,并将该bmp图加载到其中,ID名为:IDB_BITMAP1
(4)修改picture 控件的Type属性为Bitmap
(5)在图片控件的Image属性的下拉列表中选择3)中导入的位图IDB_BITMAP1
(
6)编译报错“error RC2108: expected numerical dialog constant”,双击错误,找到位置,在错误位置添加:“Static”, SS_BITMAP
(7)编译运行
二.静态控件动态加载BMP图片
要想在VC中动态显示位图,有两种比较简单的方法:
方法1.显示已添加为为工程资源的位图
case1:picture control和Text Control等Static控件
(1)新建一个MFC对话框
(2)把图片加为工程的资源,设其句柄名为IDB_BITMAP1;
(3)然后放一个静态控件或者图片控件到对话框上,将其句柄名设为IDC_STATIC_PICTURE1;
(4)具体代码:在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码:
CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_STATIC_PICTURE1的指针,并将其强制转换为CStatic*类型,并赋值给p
HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));//从工程资源处获得IDB_BITMAP1的位图句柄,并将其赋值给hBitmap变量
p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE); //设置该静态控件(p指向的静态控件),使其用于显示位图,并且是在控件中央显示 //(若无此步无法显示,因为没有说明静态对话框要显示的类型是什么)
p->SetBitmap(hBitmap); //将需要显示的位图设置为bBitmap,即资源IDB_BITMAP1的句柄
case2:Button Control控件
//添加ICON图片
void CVRHuiyanDlg::DrewAreaBmp(CWnd *pwnd, int x)
{
CPaintDC dc(pwnd);
CRect myrect;
pwnd->GetClientRect(&myrect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(x); //IDB_BITMAP_TOOL是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld = dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0, 0, myrect.Width(), myrect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
}
方法2.通过位图所在路径显示位图(此方法无需事先将位图文件添加为该工程的资源)
(1)新建一个MFC对话框
(2)在对话框上放一个静态控件(一定是静态控件,若图片控件则无法显示) 将其重命名为IDC_STATIC_PICTURE1,然后再通过类向导为该控件添加一个变量,命名为m_image.
(3)在按钮函数或OnInitDialog()或OnPaint()等函数里面加入如下代码:
this->m_image.ModifyStyle(0,SS_BITMAP | SS_CENTERIMAGE); //和上面的作用一样,将该静态控件设置为是用来显示位图的,只不过这里是通过该静态对话框的变量来进行modifystyle操作的
HBITMAP hBmp = (HBITMAP)::LoadImage(0, "xx//text.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //从bmp文件所在的路径直接读取该bmp图象的句柄,并将其转换为HBITMAP类型
//注:其中的"xx//test.bmp"是相对路径,即在和可执行文件的同一目录,下有一个名为path的文件夹,里面有一个名为test.bmp的位图文件.
this->m_image.SetBitmap(hBmp); //通过变量m_image来设置该静态框所显示的位图文件.
//转载请说明文章出处!
原文:http://www.cnblogs.com/zsr-programmer/p/5268350.html