视图更新的问题 在视图上画了一层作为背景(在OnPaint上画,然后bkgnd返回真),再画一层作为新建的一个区域去画图,如果InvalidateRect,这个区域就闪一下不见,如果不InvalidateRect,那没问题,但是如果新建的时候原来有区域,要怎么才可以把原来的擦掉画新建的?还有我新建好的区域只要滚动条一动他就没了!这要怎么解决!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在MFC基于对话的程序中在主对话框中用静态控件划了一个区域作为视图区域,按照网上的方法在对话框初始化中实现了,然后我用双缓冲贴图的方法定义了个画网格及背景颜色的函数DrawGrid(),在OnPaint()调用他,在OnEraseBkgnd()里返回真。这个画出来没多大问题。然后我又在主对话框中建了几个按钮(新建、打开、保存、有需要的话还可以添加),新建的按钮我又关联了一个新的对话框,新的对话框中输入2个值去划分新建区域的大小(宽高各包含多少网格),我就在新对话框的确定的消息响应函数中再次用DrawGrid()画了一个区域,我没有用InvalidateRect(),这个区域可以显示,问题是如果在我已经新建一个区域的情况下再新建一个区域这个区域必须比原来的大才可以,我想大概是背景没擦除的原因,于是我在画好区域以后用InvalidateRect(),新建的区域有画但是他只闪一下,我的目的就是如果我新建一个区域比已经新建的区域小的画也可以显示出来,而不是重叠什么的,这要怎么解决? bool CMyView::DrawGrid(CRect rc,COLORREF BKColor,COLORREF LineColor,int Width){ GetClientRect(&rect); int nWidth; int nHeight; nWidth=rc.Width(); nHeight=rc.Height(); CDC MemDC; CBitmap MemBitmap; MemDC.CreateCompatibleDC (NULL); MemBitmap.CreateCompatibleBitmap(GetDC(),nWidth,nHeight); CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); MemDC.FillSolidRect(0,0,nWidth,nHeight,BKColor); CPen aPen; aPen.CreatePen(PS_SOLID,1,LineColor); //创建画笔(白色的) CPen* pOldPen=MemDC.SelectObject(&aPen); for(int i=rect.left;i<=rc.right;i+=Width) { for(int j=rect.top;j<=rc.bottom;j+=Width) { MemDC.MoveTo(rect.left,j); MemDC.LineTo(i,j); MemDC.MoveTo(i,rect.top); MemDC.LineTo(i,j); } } GetDC()->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBit); MemDC.SelectObject(pOldPen); MemBitmap.DeleteObject(); MemDC.DeleteDC(); return true;}上面的画网格及背景色的函数void CMyView::OnPaint(){ CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CScrollView::OnPaint() GetClientRect(&rect); DrawGrid(rect,RGB(128,128,128),RGB(192,192,192),Width);}BOOL CMyView::OnEraseBkgnd(CDC* pDC){ // TODO: 在此添加消息处理程序代码和/或调用默认值 return true;}以上画背景void CTestDlg::OnBnClickedButton1(){ // TODO: 在此添加控件通知处理程序代码 CNewDlg dlg; if(dlg.DoModal()==IDOK) { m_pView->m_rectWidthCount=dlg.m_widthEdit; m_pView->m_rectHeightCount=dlg.m_heightEdit; m_pView->OnBnClickedOk(); }}以上把新对话框的2个值传递到视图最后void CMyView::OnBnClickedOk(){ // TODO: 在此添加控件通知处理程序代码 CClientDC aDC(this); OnPrepareDC(&aDC); GetClientRect(&rect); Custom.left=rect.left; Custom.top=rect.top; Custom.right=Custom.left+m_rectWidthCount*Width; Custom.bottom=Custom.top+m_rectHeightCount*Width; DrawGrid(Custom,RGB(255,255,255),RGB(192,192,192),Width); aDC.LPtoDP(Custom);} VS2008中使用工业仪表控件Iocomp的问题!!!!! 多层窗口间切换,窗口上的控件闪烁(按钮...)的问题? 如何半透明填充一个多边形区域 如何拦截用户的网络打印请求? 急求最小二乘法算法程序 找源代码 大家谁知道哪里有支持VC for Athlon64的最新编译器下载 在ocx中如何使用一个ActiveX,不算使用IMPORT,还有没有别的方法呢?(大送100分) ATL编写的Dll文件如何打包成EXE安装包,求高手指点明路 <请教>关于内存中的BMP在C++中的显示 基于对话框的应用程序 这里的“对话框”是模态还是非模态的? SetFocus的问题
然后我又在主对话框中建了几个按钮(新建、打开、保存、有需要的话还可以添加),新建的按钮我又关联了一个新的对话框,新的对话框中输入2个值去划分新建区域的大小(宽高各包含多少网格),我就在新对话框的确定的消息响应函数中再次用DrawGrid()画了一个区域,我没有用InvalidateRect(),这个区域可以显示,问题是如果在我已经新建一个区域的情况下再新建一个区域这个区域必须比原来的大才可以,我想大概是背景没擦除的原因,于是我在画好区域以后用InvalidateRect(),新建的区域有画但是他只闪一下,我的目的就是如果我新建一个区域比已经新建的区域小的画也可以显示出来,而不是重叠什么的,这要怎么解决?
bool CMyView::DrawGrid(CRect rc,COLORREF BKColor,COLORREF LineColor,int Width)
{
GetClientRect(&rect);
int nWidth;
int nHeight;
nWidth=rc.Width();
nHeight=rc.Height();
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC (NULL);
MemBitmap.CreateCompatibleBitmap(GetDC(),nWidth,nHeight);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,nWidth,nHeight,BKColor);
CPen aPen;
aPen.CreatePen(PS_SOLID,1,LineColor); //创建画笔(白色的)
CPen* pOldPen=MemDC.SelectObject(&aPen);
for(int i=rect.left;i<=rc.right;i+=Width)
{
for(int j=rect.top;j<=rc.bottom;j+=Width)
{
MemDC.MoveTo(rect.left,j);
MemDC.LineTo(i,j);
MemDC.MoveTo(i,rect.top);
MemDC.LineTo(i,j);
}
}
GetDC()->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
MemDC.SelectObject(pOldPen);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
return true;
}上面的画网格及背景色的函数void CMyView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CScrollView::OnPaint()
GetClientRect(&rect);
DrawGrid(rect,RGB(128,128,128),RGB(192,192,192),Width);
}
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return true;
}以上画背景void CTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CNewDlg dlg;
if(dlg.DoModal()==IDOK)
{
m_pView->m_rectWidthCount=dlg.m_widthEdit;
m_pView->m_rectHeightCount=dlg.m_heightEdit;
m_pView->OnBnClickedOk();
}
}以上把新对话框的2个值传递到视图
最后
void CMyView::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CClientDC aDC(this);
OnPrepareDC(&aDC);
GetClientRect(&rect);
Custom.left=rect.left;
Custom.top=rect.top;
Custom.right=Custom.left+m_rectWidthCount*Width;
Custom.bottom=Custom.top+m_rectHeightCount*Width;
DrawGrid(Custom,RGB(255,255,255),RGB(192,192,192),Width);
aDC.LPtoDP(Custom);
}