其实VC中的Pictrue控件和静态框控件都是一样的,只不过它们的属性不同罢了。
如果在静态框里面显示图像呢?
静态框,CStatic有一个函数SetBitmap,可以使用这个函数设置静态框中的图像,详见MSDN
但是静态框显示图像是有条件的,不用作深入的介绍,简单的说一下用法。
//假设一个静态框和一个变量m_picture关联(当然要修改ID号)
可以在对话框初始化函数中修改静态框的属性,使其支持图像的显示:
m_picture.ModifyStyle(0, SS_BITMAP, 0);
这样就可以在其它地方使用SetBitmap函数修改与静态框关联的图像了
HBITMAP hBmp = GetBitmap();//GetBitmap自己写的返回图像句柄的函数,等会儿说
HBITMAP hOldBmp = m_picture.SetBitmap(hBmp);//我没有验证hBmp的有效性,当然如果hBmp为NULL的话,也不会出错,
//静态框会取消与原来图像的关联,什么图像都不画。
if (NULL != hOldBmp)
{
::DeleteObject(hOldBmp);//hOldBmp是SetBitmap函数返回的原来与静态框关联的图像句柄
}
在销毁对话框的函数(OnDestroy)中加上:
HBITMAP hBmp = m_picture.GetBitmap();
if (NULL != hBmp)
{
::DeleteObject(hBmp);
}
已经结束了,就这么多!
现在说说那个GetBitmap函数怎么写:
载入图像的方法很多,可以用LoadBitmap或者LoadImage函数
这两个函数在MSDN上面解释的都很详细,我想说说不用SDK API,用大家常用的一个开源图像库CxImage
CxImage在网上介绍的也很多,不说用法,就说说怎么做一个等价于GetBigmap的函数(其实网上也有)
CxImage img;
CString strPhotoPath = "Your image path";
if (false == img.Load(strPhotoPath))
{
MessageBox("无法载入源图像", "Error", MB_OK);
}
else
{
CDC *pDC = m_picture.GetDC();
HBITMAP hPhoto = img.MakeBitmap(pDC->GetSafeHdc());//这就是那个相当于GetBitmap的函数
if (NULL != hPhoto)
{
m_picture.SetBitmap(hPhoto);
}
m_picture.ReleaseDC(pDC);
}
基本上没有问题了,但是实际使用时有时还是会有莫名其妙的问题,今天就遇到了,我的控件被其他人改成了Center属性,结果怎么调就是不显示图像,
最后改成Left对齐,图像成功显示,让人很郁闷。
还有最后一个问题,就是这个:m_picture.ModifyStyle(0, SS_BITMAP, 0);
修改属性时,第二个参数有两个可选:一个是SS_BITMAP,另一个就是SS_CENTERIMAGE
两个能同时用,SS_BITMAP | SS_CENTERIMAGE,
这是MSDN上的解释:
SS_BITMAP Use this style always for bitmaps.很短,就不用解释了
SS_CENTERIMAGE Use to center in the static control. If the image is larger than the static control,
it will be clipped. If it is smaller than the static control, the empty space around the image will be
filled by the color of the pixel in the upper left corner of the bitmap.
简单的说一下,不知道准确不准确:这个属性用来在静态控件中居中显示。如果图像比静态控件大,就会被剪切。如果比静态控件小,
图像周围的空白部分会使用位图左上角的颜色填充。
结束!