“实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你
在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。”
我在网上看到这样一段话,我现在也正遇到这个问题,就是画两个以上的矩形再改变窗口大小后只会显示最后一个矩形。请问该如何解决这种问题?
在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。”
我在网上看到这样一段话,我现在也正遇到这个问题,就是画两个以上的矩形再改变窗口大小后只会显示最后一个矩形。请问该如何解决这种问题?
在函数内调用Invalidate函数
http://www.vckbase.com/document/viewdoc/?id=9591 在 CDemoView::OnCreate 中创建CMSChart// CDemoView::OnCreate()
CRect rc;
GetClientRect(&rc);
if(!m_Chart.Create("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10))
return -1;2 在 CDemoView::OnSize 中调整 m_Chart 的大小,使之能随窗口大小变化而变化// CDemoView::OnSize
if( m_Chart.GetSafeHwnd() )
m_Chart.MoveWindow( 0, 0, cx, cy ); 3 设置 m_Chartvoid CDemoView::InitChart() //在这里初始化MSChart
{} 4 设置数据void CDemoView::DrawChart() //在这个函数内画图,加载你的数据,画图
{}5 改变显示类型// 折线图
void CDemoView::OnChartLine()
{
m_Chart.SetChartType(3);
DrawChart();
}// 柱状图
void CDemoView::OnChartCombi()
{
m_Chart.SetChartType(1);
DrawChart();
}
// 饼状图
void CDemoView::OnChartPie()
{
m_Chart.SetChartType(14);
DrawChart();
}
//矩形
#define RECTANGLE 4
struct RECTANGLENODE
{
BYTE bType; ////绘图单元的类型
//该记录的状态:bDo>0 显示;bDo<=0 不显示
//0-不显示,1-显示,2-被选择,3-粘贴,5-移动,6-剪切,7-移动被恢复
int bDo;
int Index; //图元索引
PENTYPE pen; //绘制矩形所用的画笔类型
POINT Start,End; //矩形左上角和右下角坐标
RECTANGLENODE() //矩形图元的初始化函数
{
bType=RECTANGLE;
bDo=1;
}
};CPainterView.cpp中相关函数
//初始化函数
CPainterView::CPainterView()
{
// TODO: add construction code here
DrawStep=0; //绘图步骤的记录
DrawType=new BYTE; //绘图类型,初始化为选择
*DrawType=SELECT;
OppIndex=0;
bShiftDown=FALSE;
lineType=0; //线条类型(值由组合框选择)
lineWidth=1; //线条宽度(值由组合框选择)
lineColor=RGB(0,0,0); //线条颜色(值由组合框选择)
}
//响应画矩形的工具栏按钮的函数
void CPainterView::OnDrawRectangle()
{
DrawType=new BYTE;
*DrawType=RECTANGLE;
}void CPainterView::OnLButtonDown(UINT nFlags, CPoint point)
{
switch (*DrawType)
{
case RECTANGLE:
if(!DrawStep)
{
rectanglenode=new RECTANGLENODE; //rectanglenode为头文件中申明的变量
rectanglenode->Start=point;
DrawStep=1;
}
break;
}void CPainterView::OnMouseMove(UINT nFlags, CPoint point)
{
CDC *dc=GetDC();
OldPen=dc->SelectObject(&pen);
int iR;
if(DrawStep==0)
return;
switch(*DrawType)
{
case RECTANGLE:
iR=dc->SetROP2(R2_NOTXORPEN); //设置绘图模式
dc->Rectangle(rectanglenode->Start.x,rectanglenode->Start.y,PrePoint.x,PrePoint.y);
dc->Rectangle(rectanglenode->Start.x,rectanglenode->Start.y,point.x,point.y);
PrePoint=point;
dc->SetROP2(iR);
break;
}void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)
{
CPainterDoc *pDoc=GetDocument();
switch(*DrawType)
{
case RECTANGLE:
DrawStep=0;
rectanglenode->End=rectanglenode->End2=point;
rectanglenode->bDo=1;
OppIndex+=1;
rectanglenode->Index=OppIndex;
rectanglenode->pen.Color=lineColor;
rectanglenode->pen.iStyle=lineType;
rectanglenode->pen.iWidth=lineWidth;
pDoc->RecordList.AddTail(DrawType); //RecordList为保存数据的链表
pDoc->RecordList.AddTail(rectanglenode);
break;
}void CPainterView::OnDraw(CDC* pDC)
{
CPainterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(rect);
HPEN hOldPen,hPen;
POSITION pos=pDoc->RecordList.GetHeadPosition();
while(pos)
{
BYTE * drawtype;
drawtype=(BYTE *)pDoc->RecordList.GetNext(pos);
switch(*drawtype)
{
case RECTANGLE:
RECTANGLENODE * rectangle;
rectangle=(RECTANGLENODE*)pDoc->RecordList.GetNext(pos);
if(rectangle->bDo>0)
{
if(rectangle->bDo!=2)
hPen=CreatePen(rectangle->pen.iStyle,rectangle->pen.iWidth,rectangle->pen.Color);
else
hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0)); //矩形被选中时所用画笔
hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
pDC->Rectangle(rectanglenode->Start.x,rectanglenode->Start.y,rectanglenode->End.x,rectanglenode->End.y);
DeleteObject(SelectObject(pDC->m_hDC,hOldPen));
}
break;
}不知道哪错了所以把有关代码全贴出来了。
请大家帮我找找原因
小生不才,让楼上的大家费心了,真是不好意思。