cstatic 如何能 显示指定的图片文件
cbitmap 只能读取资源
而 cstatic 只能 setbitmap ,弄的我不知道怎么从文件中读取图片来显示了
请赐教
问题点数:20、回复次数:18Top
1 楼ydfivy(我就是一送外卖的)回复于 2006-04-05 11:41:33 得分 0
LoadBitmapTop
2 楼xjb2001(便衣超人)回复于 2006-04-05 11:46:11 得分 0
SetEnhMetaFile 可以好像可以实现增强位元图形显示 ,可是 HENHMETAFILE 不知道是什么
找不到定义的地方,不知道怎么用Top
3 楼xjb2001(便衣超人)回复于 2006-04-05 11:47:39 得分 0
LoadBitmap 只能从资源中读取,我要从文件中读取Top
4 楼xjb2001(便衣超人)回复于 2006-04-05 11:53:09 得分 0
LoadCursorFromFile 这种函数都有
NND
怎么就 LoadBitmapFromFile 靠,郁闷死了Top
5 楼wangk(倒之)回复于 2006-04-05 11:57:17 得分 0
用GDI+中有从文件读取的函数Bitmap::FromFileTop
6 楼palmax(用上VS2005了)回复于 2006-04-05 12:01:53 得分 0
网上搜一下CPictureTop
7 楼tufaqing()回复于 2006-04-05 12:03:36 得分 20
CFile file( _T("D:\\Bitmap\\11_24.bmp"), CFile::modeRead );
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
file.Read( &bmfh, sizeof(bmfh) );
file.Read( &bmih, sizeof(bmih) );
int nWidth = bmih.biWidth;
int nHeight = bmih.biHeight;
int nPixelBits = bmih.biBitCount;
DWORD nSize = bmih.biSizeImage;
BYTE *lpBits = new BYTE[nSize];
file.Read( lpBits, nSize );
CBitmap bitmap;
CDC dcTemp;
dcTemp.CreateCompatibleDC( pDC );
HBITMAP hbm = CreateDIBitmap( pDC->GetSafeHdc(), &bmih, CBM_INIT, lpTemp, (LPBITMAPINFO)&bmih, DIB_RGB_COLORS );
bitmap.Attach(hbm);
dcTemp.SelectObject( &bitmap );
pDC->BitBlt( 0, 0, nWidth, nHeight, &dcTemp, 0, 0, SRCCOPY );Top
8 楼tufaqing()回复于 2006-04-05 12:34:56 得分 0
写错了lpTemp为lpBits,最后没有回收内存和关闭文件,你自己写吧。Top
9 楼xjb2001(便衣超人)回复于 2006-04-05 13:54:52 得分 0
多谢多谢,研究一下,一会回来Top
10 楼xjb2001(便衣超人)回复于 2006-04-05 14:26:07 得分 0
TRY
{
CFile file( _T("c:\\edu_look.bmp"), CFile::modeRead );
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
file.Read( &bmfh, sizeof(bmfh) );
file.Read( &bmih, sizeof(bmih) );
int nWidth = bmih.biWidth;
int nHeight = bmih.biHeight;
int nPixelBits = bmih.biBitCount;
DWORD nSize = bmih.biSizeImage;
BYTE *lpBits = new BYTE[nSize];
file.Read( lpBits, nSize );
CBitmap bitmap;
CDC pDC;
CDC dcTemp;
dcTemp.CreateCompatibleDC( &pDC );
HBITMAP hbm = CreateDIBitmap( pDC.GetSafeHdc(), &bmih, CBM_INIT, lpBits, (LPBITMAPINFO)&bmih, DIB_RGB_COLORS );
bitmap.Attach(hbm);
dcTemp.SelectObject( &bitmap );
pDC.BitBlt( 0, 0, nWidth, nHeight, &dcTemp, 0, 0, SRCCOPY );
m_logo. SetBitmap(hbm);
delete lpBits;
dcTemp.DeleteDC();
file.Close();
}
CATCH( CFileException, e )
{
return ;
}
END_CATCH
这段代码看的有点晕,而且 关于 pDC 这个变量的作用没看懂
程序执行到 pDC.BitBlt 处就非法指针错误了;Top
11 楼xjb2001(便衣超人)回复于 2006-04-05 14:38:40 得分 0
TRY
{
CFile file( _T("c:\\edu_look.bmp"), CFile::modeRead );
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
file.Read( &bmfh, sizeof(bmfh) );
file.Read( &bmih, sizeof(bmih) );
int nWidth = bmih.biWidth;
int nHeight = bmih.biHeight;
int nPixelBits = bmih.biBitCount;
DWORD nSize = bmih.biSizeImage;
BYTE *lpBits = new BYTE[nSize];
file.Read( lpBits, nSize );
CBitmap bitmap;
CDC pDC;
CDC dcTemp;
pDC.CreateCompatibleDC(NULL);
dcTemp.CreateCompatibleDC( &pDC );
HBITMAP hbm = CreateDIBitmap( pDC.GetSafeHdc(), &bmih, CBM_INIT, lpBits, (LPBITMAPINFO)&bmih, DIB_RGB_COLORS );
bitmap.Attach(hbm);
dcTemp.SelectObject( &bitmap );
pDC.BitBlt( 0, 0, nWidth, nHeight, &dcTemp, 0, 0, SRCCOPY );
m_logo. SetBitmap(hbm);
delete lpBits;
dcTemp.DeleteDC();
pDC.DeleteDC();
file.Close();
}
CATCH( CFileException, e )
{
return ;
}
END_CATCH
现在代码是不报错了,可是 cstatic 中,还是没有东西Top
12 楼tufaqing()回复于 2006-04-06 10:34:06 得分 0
哦,原来你不是要Bitblt,而要SetBitmap,那就在OnInitDialog()这样写(测试已通过):
CFile file( _T("D:\\Bitmap\\1.bmp"), CFile::modeRead );
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
file.Read( &bmfh, sizeof(bmfh) );
file.Read( &bmih, sizeof(bmih) );
int nWidth = bmih.biWidth;
int nHeight = bmih.biHeight;
int nPixelBits = bmih.biBitCount;
DWORD nSize = bmih.biSizeImage;
BYTE *lpBits = new BYTE[nSize];
file.Read( lpBits, nSize );
CDC *pDC = GetDlgItem(IDC_STATIC1)->GetDC(); // 不要用默认的IDC_STATIC,换个ID
HBITMAP hbm = CreateDIBitmap( pDC->GetSafeHdc(), &bmih, CBM_INIT, lpBits, (LPBITMAPINFO)&bmih, DIB_RGB_COLORS );
// 要修改属性才能显示
m_static1.ModifyStyle( 0xffffffffL, WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE );
m_static1.SetBitmap(hbm);
delete[] lpBits;
pDC->DeleteDC();
file.Close();
Top
13 楼bingsiu(天之云)回复于 2006-04-06 11:21:26 得分 0
tufaqing,你的代码在读取bmp图像时最好加个判断,看是什么类型的bmp图像。现在你的代码只能读取24位真彩色的bmp图像,读取其它类型的就会出错。Top
14 楼tufaqing()回复于 2006-04-06 11:42:59 得分 0
to bingsiu(天之云) :
哥们儿,你试过吗,没有实践就不要乱说,CreateDIBitmap是创建与设备无关的位图,适用于所有bmp位图,我已经测试过,我的程序对于16、24、32位位图(16位没有调色板的)都能显示,对于有调色板的低于16位的位图,file读写有改改,要把调色板的信息读出来,CreateDIBitmap的一些相应的参数也要改改,DIB_RGB_COLORS换成DIB_PAL_COLORS。Top
15 楼bingsiu(天之云)回复于 2006-04-06 11:46:09 得分 0
呵呵,你自己不也承认对带调色板的位图失效了。Top
16 楼bingsiu(天之云)回复于 2006-04-06 11:50:48 得分 0
我说只适用于24位是图省事。但是像你这样不加判断直接就把信息头后面的数据全都读取算作位图数据也太。。。(呵呵,好歹得加个注释说明一下吧)Top
17 楼xjb2001(便衣超人)回复于 2006-04-19 18:27:17 得分 0
哪里需要那么负责,看好了
CBitmap m_Bitmap;
m_Bitmap.m_hObject = LoadImage(NULL,path,IMAGE_BITMAP,0, 0,LR_LOADFROMFILE);
if (m_Bitmap.m_hObject!=NULL)
m_logo.SetBitmap((HBITMAP)m_Bitmap.Detach());
唉,放分了Top
18 楼gxxx2000(就要50岁了)回复于 2006-09-06 01:01:49 得分 0
这个我需要,做个记号Top




