BITMAPINFOHEADER 的问题

x21iaomi 2012-12-20 02:39:56
单文档MFC页面上放置picture控件,动态加入图片,自动适应图片控件大小,初始化函数如下
BOOL pic::OnInitDialog() 
{
CDialog::OnInitDialog();
if( m_bmp.m_hObject != NULL )
m_bmp.DeleteObject();
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"c://12.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if( hbmp == NULL )
return FALSE;
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_PICTURE)->GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left,rect.top,cx,cy,true);
return TRUE; // return TRUE unless you set the focus to a control
}
,运行时,提示错误
error C2228: left of '.biWidth' must have class/struct/union type
error C2228: left of '.biHeight' must have class/struct/union type
什么问题啊,怎样解决啊??
...全文
336 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
问题解决,以下两句就可以实现
	HBITMAP hbmp=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
	m_Picture.SetBitmap(hbmp); 
谢谢楼上各位!!
快乐鹦鹉 2012-12-20
  • 打赏
  • 举报
回复
你不会调试程序?
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
引用 11 楼 happyparrot 的回复:
你这样写后,看看hBmp是不是空的?
怎样看?运行时窗口上picture控件的地方什么都不显示
快乐鹦鹉 2012-12-20
  • 打赏
  • 举报
回复
你这样写后,看看hBmp是不是空的?
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
引用 6 楼 happyparrot 的回复:
看你的代码,改成这样也行: int cx= bminfo.biWidth; int cy= bminfo.biHeight;
大哥,帮人帮到底吧,代码中的这句
	HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"12.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
需要把12.bmp图片放到程序的文件夹中,我想使用LoatBitmap,直接从程序资源中加载位图。把上句改成
HBITMAP hbmp = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
	m_Picture.SetBitmap(hbmp); 
m_Picture是CStatic型的picture控件,type类型bitmap。为什么图片显示不出来呢?
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
引用 7 楼 tiger9991 的回复:
你这代码是抄来的吧?? 怎么会出现双引号呢? 去掉双引号就可以了
嗯,程序中要用到,自己建个demo试验下。
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
引用 6 楼 happyparrot 的回复:
看你的代码,改成这样也行: int cx= bminfo.biWidth; int cy= bminfo.biHeight;
刚试了一下,去掉双引号就行了。int cy= ds.dsBm.bmHeight;这样的写法也行……
傻X 2012-12-20
  • 打赏
  • 举报
回复
你这代码是抄来的吧?? 怎么会出现双引号呢? 去掉双引号就可以了
快乐鹦鹉 2012-12-20
  • 打赏
  • 举报
回复
看你的代码,改成这样也行: int cx= bminfo.biWidth; int cy= bminfo.biHeight;
快乐鹦鹉 2012-12-20
  • 打赏
  • 举报
回复
兄弟,看清楚一点,我写的是bmWidth,不是biWidth。唉。
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
引用 3 楼 happyparrot 的回复:
int cx= ds.dsBm.bmWidth; int cy= ds.dsBm.bmHeight;
error C2039: 'biWidth' : is not a member of 'tagBITMAP'
biHight也是类似的错误
快乐鹦鹉 2012-12-20
  • 打赏
  • 举报
回复
int cx= ds.dsBm.bmWidth; int cy= ds.dsBm.bmHeight;
x21iaomi 2012-12-20
  • 打赏
  • 举报
回复
引用 1 楼 happyparrot 的回复:
m_bmp.GetObject( sizeof(ds), &ds ); int cx= "bminfo".biWidth; int cy= "bminfo".biHeight; 改为: m_bmp.GetObject( sizeof(ds), &ds ); int cx= d……
error C2039: 'biWidth' : is not a member of 'tagDIBSECTION'
error C2039: 'biHeight' : is not a member of 'tagDIBSECTION'
改后提示如上错误
快乐鹦鹉 2012-12-20
  • 打赏
  • 举报
回复
m_bmp.GetObject( sizeof(ds), &ds ); int cx= "bminfo".biWidth; int cy= "bminfo".biHeight; 改为: m_bmp.GetObject( sizeof(ds), &ds ); int cx= ds.biWidth; int cy= ds.biHeight; 怎么会用"bminfo"呢???
查看位图的信息(右键查看): 1.文件头 2.信息头 3.RGB掩码(如果有的话) 显示出来的形式如下: BITMAPFILEHEADER* = 0x02800048 BITMAPFILEHEADER .bfType = 0x4D42 .bfSize = 552158 .bfReserved1 = 0 .bfReserved2 = 0 .bfOffBits = 66 BITMAPINFOHEADER .biSize = 40 .biWidth = 353 .biHeight = 391 .biPlanes = 1 .biBitCount = 32 .biCompression = BI_BITFIELDS .biSizeImage = 552092 .biXPelsPerMeter = 0 .biYPelsPerMeter = 0 .biClrUsed = 0 .biClrImportant = 0 Red Mask = 00FF0000 Green Mask = 0000FF00 Blue Mask = 000000FF 说明: 1.第一行为内存中malloc出来的地址,由于是虚拟内存,不看也罢 2.该程序不止可以查看BITMAPINFOHEADER类型的位图, 其余三种类型也可查看,分别为: BITMAPCOREHEADERBITMAPV4HEADERBITMAPV5HEADER 3.最后三行的RGB Mask是颜色掩码,对于BITMAPINFOHEADER类型来说,不一定有。 4.右键功能是查看信息,左键是左右镜像操作,由于是底层数据直接每行左右互换, 而对于1、4位深的这两种位图,底层数据操作涉及位操作,而我还在写这个位图类, 故暂不支持,只支持8位以上的水平镜像操作。 5.支持剪切板操作,并且是以CF_DIB或CF_DIBV5呼叫GetClipboardData函数的, 复制时,也是以该参数呼叫SetClipboardData函数的。 你可以复制其他地方的图片过来,以查看图片属性。 6.程序中运行中保存在内存中的图片是BITMAPFILEHEADER*指针,不是HBITMAP, 呼叫的显示函数是SetDIBitsToDevice函数。 7.鼠标在图片上移动是,右边填充鼠标点的颜色,标题栏也有相关显示。 下边显示鼠标点附近11*11像素范围的放大图像,正中间用十字叉线画出。 取色是直接在底层取数据解析。 8.改程序在《windows程序设计》上的一个例子改编而来,并且正在完善该位图类中, 以加入更多丰富的底层操作功能。 改试验程序主要供想研究位图结构的人查看用。 9.windows搞出了4种位图种类,真作孽~~ 另,16、24、32位深的位图也可以有颜色表的,该程序已考虑在内。 10.下面四种压缩格式暂不支持: BI_RLE8、BI_RLE4、BI_JPEG、BI_PNG 11.随带的附件中,有几张不同格式的位图,你可以试验打开查看。 有问题联系:hastings1986@163.com
void CExample10View::OnSave555BiBitfields() { // TODO: Add your command handler code here if(lpBmpDataBuf==NULL) { MessageBox("当前没有打开的位图"); return; } BYTE r,g,b; LPBYTE lpDest,lpSrc; int i,j; int nheapSize; CFileDialog filesavebox(FALSE,"bmp","BI_BITFIELDS.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"files(*.bmp)|*.bmp|",NULL); CFile file; CString strPathname; if(m_bmi.biBitCount!=24) { MessageBox("当前打开的位图不是24位位图"); return; } memcpy(&m_newbmf,&m_bmf,sizeof(BITMAPFILEHEADER)); memcpy(&m_newbmi,&m_bmi,sizeof(BITMAPINFOHEADER)); m_newbmi.biBitCount=16; m_newbmi.biCompression=BI_BITFIELDS;//即3 m_newbmi.biSizeImage=WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3; nheapSize=sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; if(lpnewBmpDataBuf!=NULL) { delete []lpnewBmpDataBuf; lpnewBmpDataBuf=NULL; } lpnewBmpDataBuf=new BYTE[nheapSize]; memcpy(lpnewBmpDataBuf,&m_newbmi,sizeof(BITMAPINFOHEADER)); DWORD* lp=(DWORD*)(lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)); *lp++=0x00007c00; *lp++=0x000003e0; *lp =0x0000001f; for(i=0;iBITMAPINFOHEADER) +WIDTHBYTES(m_bmi.biWidth,m_bmi.biBitCount)*(m_bmi.biHeight-1-i) +j*3; lpDest=lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*(m_newbmi.biHeight-1-i) +j*2; b=*lpSrc++; b&=0xf8; g=*lpSrc++; g&=0xf8; r=*lpSrc++; r&=0xf8; WORD* lp=(WORD*)lpDest; *lp=0; *lp=r<<7; *lp+=(g<>3); } } if(filesavebox.DoModal()!=IDOK) return; strPath

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧