学习笔记一(一个关于TextOut和Invalidate的问题)
来源:互联网 发布:淘宝售后怎么样的 编辑:程序博客网 时间:2024/05/16 09:32
新建一个MFC工程文件,然后想显示一幅图片,统计图片的黑白像素个数,
设置在文件打开菜单中打开一幅图像,在自己建的菜单中统计个数,如下:
打开菜单对应函数
- void CTestDoc::OnFileOpen()
- {
- // TODO: Add your command handler code here
- LPCTSTR lpszFilter= "BMPFiles(*.bmp)|*.bmp|所有文件|*.*||";
- CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);
- CString filename;
- CFile file;
- if(dlg1.DoModal()==IDOK)
- {
- filename=dlg1.GetPathName();
- if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==1)
- {
- file.Read(&bf,sizeof(bf));
- }
- file.Read(&bi,sizeof(bi));
- numQuad=0;
- if(bi.biBitCount<24)
- {
- numQuad=1<<bi.biBitCount;
- }
- pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
- memcpy(pbi,&bi,sizeof(bi));
- quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));
- file.Read(quad,sizeof(RGBQUAD)*numQuad);
- bi.biSizeImage=bf.bfSize-bf.bfOffBits;
- lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
- lpDIBBits=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
- lpNewDIBBits=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
- file.Read(lpBuf,bi.biSizeImage);
- memcpy(lpDIBBits,lpBuf,bi.biSizeImage);
- file.Close();
- }
- flag=1 ;
- }
- Ondraw函数如下:
- void CTestView::OnDraw(CDC* pDC)
- {
- CTestDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // TODO: add draw code for native data here
- if(pDoc->flag==1)
- {
- SetDIBitsToDevice(pDC->m_hDC,0,0,pDoc->bi.biWidth,pDoc->bi.biHeight,0,0,0,pDoc->bi.biHeight,pDoc->lpBuf,pDoc->pbi,DIB_RGB_COLORS);
- SetDIBitsToDevice(pDC->m_hDC,pDoc->bi.biWidth,0,pDoc->bi.biWidth,pDoc->bi.biHeight,0,0,0,pDoc->bi.biHeight,pDoc->lpDIBBits,pDoc->pbi,DIB_RGB_COLORS);
- }
- Invalidate(FALSE);
- }
- //统计函数
- void CTestView::OnCount()
- {
- // TODO: Add your command handler code here
- // TODO: Add your command handler code here
- CTestDoc* pDoc=GetDocument();
- int count,count2;
- count=0;count2=0;
- for(int i=0;i<pDoc->bi.biHeight;i++)
- {
- for(int j=0;j<pDoc->bi.biWidth;j++)
- {
- if(pDoc->lpDIBBits[pDoc->bi.biWidth*3*i+3*j]==255)
- {
- count=count+1;
- }
- else
- count2=count2+1;
- }
- }
- mcount=count;
- str.Format("白色像素个数: %5d",count);
- str1.Format("黑色像素个数为: %5d",count2);
- //lpszPathName.Format("E://desktop//temp//test//SNV%d.bmp",j);
- CClientDC dc(this);
- dc.TextOut(0,490,str);
- dc.TextOut(0,510,str1);
- }
结果并没有出现我想要的TextOut的统计数字,在视图窗口上没有显示。后来发现如下面这样就可以了。
- void CTestDoc::OnFileOpen()
- {
- // TODO: Add your command handler code here
- LPCTSTR lpszFilter= "BMPFiles(*.bmp)|*.bmp|所有文件|*.*||";
- CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);
- CString filename;
- CFile file;
- if(dlg1.DoModal()==IDOK)
- {
- filename=dlg1.GetPathName();
- if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==1)
- {
- file.Read(&bf,sizeof(bf));
- }
- file.Read(&bi,sizeof(bi));
- numQuad=0;
- if(bi.biBitCount<24)
- {
- numQuad=1<<bi.biBitCount;
- }
- pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
- memcpy(pbi,&bi,sizeof(bi));
- quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));
- file.Read(quad,sizeof(RGBQUAD)*numQuad);
- bi.biSizeImage=bf.bfSize-bf.bfOffBits;
- lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
- lpDIBBits=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
- lpNewDIBBits=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
- file.Read(lpBuf,bi.biSizeImage);
- memcpy(lpDIBBits,lpBuf,bi.biSizeImage);
- file.Close();
- }
- flag=1 ;
- this->GetRoutingView()->Invalidate(FALSE);
- }
- void CTestView::OnDraw(CDC* pDC)
- {
- CTestDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // TODO: add draw code for native data here
- if(pDoc->flag==1)
- {
- SetDIBitsToDevice(pDC->m_hDC,0,0,pDoc->bi.biWidth,pDoc->bi.biHeight,0,0,0,pDoc->bi.biHeight,pDoc->lpBuf,pDoc->pbi,DIB_RGB_COLORS);
- SetDIBitsToDevice(pDC->m_hDC,pDoc->bi.biWidth,0,pDoc->bi.biWidth,pDoc->bi.biHeight,0,0,0,pDoc->bi.biHeight,pDoc->lpDIBBits,pDoc->pbi,DIB_RGB_COLORS);
- }
- }
发现又是Invalidate的问题,一般在显示一幅图片时,最好不要把Invalidate放在Ondraw里面,这样很容易重绘,却也容易出现一些不想要的图像。在这个例子中,因为在OnDraw里加入了Invalidate(),导致窗口重绘,而Ondraw函数中没有相应的TextOut代码,所以程序运行时就看不到想要显示的字符。可以如上这样修改,程序就可以出现结果了。但当窗口发生变化时,文字消失,要重点统计菜单。还有一种修改方式,就是把text Out语句放到Ondraw里面,这样,就可以一直显示了。
- 学习笔记一(一个关于TextOut和Invalidate的问题)
- Invalidate()学习(一)
- 关于TextOut输出的字符串透明的问题
- CDC textout函数关于CString对象的输出问题
- JS学习笔记(一):关于{}和[]的使用
- TextOut和DrawText的比较
- 前端学习笔记一:关于一个新页面的开发
- 自定义View学习笔记(3)->invalidate
- 关于invalidate()和invalidaterect()总结
- 关于Invalidate、InvalidateRect和UpdateWindow(转载)
- 关于Invalidate和UpdateWindow
- 关于Metasploit的学习笔记(一)
- 关于在Windows 7中在桌面使用TextOut函数的一些问题
- canvas学习笔记(一)——关于css设置canvas画布大小的问题
- SetCaretPos和TextOut调用的顺序
- Invalidate(TRUE)的闪屏问题
- vue学习笔记(一)关于事件冒泡和键盘事件 以及与Angular的区别
- 关于Invalidate、InvalidateRect和UpdateWindow
- Posix线程编程指南(5)——杂项
- 一个讲述ceshell的博客
- Xsd文件
- 10月杂记
- "无法在Web服务器上启动调试。基础连接已经关闭:接收时发生错误"
- 学习笔记一(一个关于TextOut和Invalidate的问题)
- 在Ubuntu7.10上编译android
- COM与.NET(三)调用DCOM组件
- 今天开始备站SCJP
- SAP软件实施之实施策略
- 各大搜索引擎网站域名收录登录入口
- 一个非常不错的PowerShell的教学网站(英文)
- Android 更新SDK
- -