资源描述:
《用MFC对话框做无闪烁图片重绘》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用MFC对话框做无闪烁图片重绘用应用程序向导生成一个基于对话框的应用程序把对话框Styles里的Border设置为Resizing,并把Minimizebox跟Maximizebox复选按钮都勾上现在我们为资源导入一张位图然后我们为程序添加四个私有变量private:intheight;intwidth;CBitmapmyBitmap;BITMAPbm;然后用类向导添加WMSIZE消息输入下列代码:width=cx;height=cy;Invalidate();然后在添加WM_PAINT消息在函数里添加以下代码:CDC
2、*pDC=newCDC;CPaintDCdc(this);//CClientDCdc(NULL);pDC->CreateCompatibleDC(&dc);pDC->SelectObject(myBitmap);//将图片伸缩成我们设定的大小。dc.StretchBlt(0,0,width,height,pDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//如果不准备进行缩放可以用BITBLT。//dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,pDC,0,0,S
3、RCCOPY);deletepDC;然后做最后一步在程序初始化时候导入我们的图片并让对话大小跟图片一样在OnInitDialog函数最里添加如下代码://TODO:AddextrainitializationheremyBitmap.LoadBitmap(IDB_BITMAP1);myBitmap.GetObject(sizeof(BITMAP),&bm);好了我们现在就做了一个可以显示图片的对话框并且对话改变大小的时候图片大小也会改变,不过这个程序有一个缺点,就是重绘的时候有闪烁,性能不怎么好,现在我们按上面的步骤在
4、做一个对话框,导入位图,添加以下变量:public:CSizem_sizeBuffer;CBitmapm_bmpBackBuffer;CBitmap*m_pbmpPattern;在OnInitDialog函数里添加以下代码m_pbmpPattern=CBitmap::FromHandle((HBITMAP)::LoadImage(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BACKGROUND),IMAGE_BITMAP,0,0,LR_SHARED));重写OnPaint函数i
5、f(IsIconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);//CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.W
6、idth()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//Drawtheicondc.DrawIcon(x,y,m_hIcon);}else{CPaintDCdc(this);CDCdcBackBuffer;dcBackBuffer.CreateCompatibleDC(&dc);//重新计算区域面积CRectrectClient;GetClientRect(rectClient);if(m_sizeBuffer!=rectClient.Size()){m_sizeBuf
7、fer=rectClient.Size();if(m_bmpBackBuffer.GetSafeHandle()!=NULL)m_bmpBackBuffer.DeleteObject();m_bmpBackBuffer.CreateCompatibleBitmap(&dc,m_sizeBuffer.cx,m_sizeBuffer.cy);}CBitmap*pOldBmp=dcBackBuffer.SelectObject(&m_bmpBackBuffer);//画背景if(NULL==m_pbmpPattern){dc
8、BackBuffer.FillSolidRect(rectClient,RGB(255,0,255));}else{CDCdcPat;dcPat.CreateCompatibleDC(&dcBackBuffer);CBitmap*pbmpOld=dcPat.SelectObject(m_pbmpPattern);BITMAPbit