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时,也引起重绘,我们可以看到自己的图像,但由于擦

除背景以后才发生重绘,所以看到刷屏的现象。而不用的话就会一直显示背景,除非认为

改变窗口或其他方式引发窗口重绘,显示图像。

本文标签: 重绘显示图像看到