admin管理员组文章数量:1537358
2024年6月12日发(作者:)
vc学习,Invalidate(true),Invalidate(false)2008-08-27 08:13在学一个位图显示程
序时,发现了图像显示能不能重绘的问题,当时看了msdn,也在网上看了不少回复。总
感觉不是很理解。后来仔细试了一下,有点心得,特写出来,以鼓励自己。顺便也为那些
和我一样刚开始学习vc的人提供些许帮助。
程序很简单,如下:在文档类中定义变量
下面是我在Doc类下面的变量:::
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
RGBQUAD* quad;
BYTE* lpBuf;
BITMAPINFO*pbi;
int flag;
int numQuad;
在Doc类下面添加了命令处理函数打开文件:
void CMySeeView::OnFileOpen()
{
// TODO: Add your command handler code here
LPCTSTR lpszFilter= "BMPFiles(*.bmp)|*.bmp ";
CFileDialog
dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilt
er,NULL);
CString filename;
CFile file;
if(l()==IDOK)
{
filename=hName();
if((filename,CFile::modeRead|CFile::shareDenyNone,NULL)==1)
{
(&bf,sizeof(bf));
}
(&bi,sizeof(bi));
numQuad=0;
if(ount <24)
{
numQuad=1 < } pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADE R)+numQuad*sizeof(RGBQUAD)); memcpy(pbi,&bi,sizeof(bi)); quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER)); (quad,sizeof(RGBQUAD)*numQuad); Image=its; lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,Image); (lpBuf,Image); (); } flag==1 } 然后绘图:画图:: void CMySeeView::OnDraw(CDC* pDC) { CMySeeDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(pDoc->flag==1) { SetDIBitsToDevice(pDC->m_hDC,0,0,pDoc->h,pDoc->ht,0,0 ,0,pDoc->ht,pDoc->lpBuf,pDoc->pbi,DIB_RGB_COLORS); } Invalidate(false);/////////////////////////这个地方用Invalidate(true)和不用的情况 下出现的结果写在下面。 } 现象如下: (1)Invalidate(false)正常 (2)Invalidate(true)出现刷屏 (3)如果不用, 那么每次打开文件将不能自动显示,可以手动更改窗口大小,那么就可以正常显示了。 分析如下:当参数为false时,客户区无效,引起重绘,但不擦除背景,所以我们可 以看到我们的图像。当参数为true时,也引起重绘,我们可以看到自己的图像,但由于擦 除背景以后才发生重绘,所以看到刷屏的现象。而不用的话就会一直显示背景,除非认为 改变窗口或其他方式引发窗口重绘,显示图像。
版权声明:本文标题:Invalidate()用法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1718200087a652873.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论