hur.cn - 华软网

 热门搜索

为什么窗口尺寸发生变化,如最大化、最小化时,图形就会从原点重新绘图呢?

  作者:未知    来源:网络    更新时间:2011/6/1
为什么为什么当窗口尺寸发生变化时,如最大化、最小化时,图形就会从原点重新绘图呢?而不是绘到哪个点,就从那个点继续画下去呢?请高手指教!
程序如下:

// ceshiView.cpp : implementation of the CCeshiView class
//

#include "stdafx.h"
#include "ceshi.h"

#include "ceshiDoc.h"
#include "ceshiView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCeshiView

IMPLEMENT_DYNCREATE(CCeshiView, CView)

BEGIN_MESSAGE_MAP(CCeshiView, CView)
//{{AFX_MSG_MAP(CCeshiView)
ON_WM_TIMER()
ON_COMMAND(IDM_startpicture, Onstartpicture)
ON_COMMAND(IDM_STOP, OnStop)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCeshiView construction/destruction

CCeshiView::CCeshiView()
{
// TODO: add construction code here
start=0;
}

CCeshiView::~CCeshiView()
{
}

BOOL CCeshiView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
//  the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCeshiView drawing

void CCeshiView::OnDraw(CDC* pDC)
{
CCeshiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

    CRect rc;
GetClientRect(rc);
rc.DeflateRect(20,20);
    

valuex=100;//坐标轴上的最大刻度值
valuey=100;

gridx=30;//网格数目
gridy=30;

dx=rc.Width()/gridx;
dy=rc.Height()/gridy;

Xper=rc.Width()/valuex;
Yper=rc.Height()/valuey;
CRect gridRect(rc.left,rc.top,rc.left+(int)Xper*valuex,rc.top+(int)Yper*valuey);

CPen pen,penxi,penge;
penxi.CreatePen(PS_SOLID,2,RGB(0,0,0));
    pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
penge.CreatePen(PS_DOT ,1,RGB(0,0,255));
double x_left=0.0,x_right=0.0,y_top=0.0,y_bottom=0.0;
        x_left=0;
x_right=gridx;
y_bottom=0;
y_top=gridy;
//******************画坐标******************///
CPen*oldPen=pDC->SelectObject(&penxi);
pDC->MoveTo(gridRect.left,gridRect.bottom );
pDC->LineTo(gridRect.right,gridRect.bottom);
pDC->MoveTo(gridRect.left,gridRect.bottom);
pDC->LineTo(gridRect.left,gridRect.top);


 datadx=gridRect.Width()/gridx;
 datady=gridRect.Height()/gridy;


//*********************表刻度*******************************//
oldPen=pDC->SelectObject(&penxi);
CString t;

for(float a=0;a<=valuex;a=a+10)
{
pDC->MoveTo(gridRect.left+a*(int)Xper,gridRect.bottom);
pDC->LineTo(gridRect.left+a*(int)Xper,gridRect.bottom-5);

        t.Format("%.0f",a);
pDC->TextOut(gridRect.left+a*(int)Xper,gridRect.bottom+10,t);//写刻度值
}
    for(float b=0;b<=valuey;b=b+10)
{
pDC->MoveTo(gridRect.left,gridRect.bottom-b*(int)Yper);
pDC->LineTo(gridRect.left+5,gridRect.bottom-b*(int)Yper);

t.Format("%.0f",b);
pDC->TextOut(gridRect.left-20,gridRect.bottom-b*(int)Yper,t);//写刻度值
}

//********************画网格********************************//
oldPen=pDC->SelectObject(&penge);
    for(int k=10;k<=valuex;k=k+10)
{
pDC->MoveTo(gridRect.left+k*(int)Xper,gridRect.bottom);
pDC->LineTo(gridRect.left+k*(int)Xper,gridRect.top);

}
    for(int u=10;u<=valuey;u=u+10) 
{
        pDC->MoveTo(gridRect.left,gridRect.bottom-u*(int)Yper);
pDC->LineTo(gridRect.right,gridRect.bottom-u*(int)Yper);

}
x=0;
y=0;


pFile=fopen("1.txt","w");

SetTimer(1,100,NULL);



}

/////////////////////////////////////////////////////////////////////////////
// CCeshiView printing

BOOL CCeshiView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CCeshiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CCeshiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CCeshiView diagnostics

#ifdef _DEBUG
void CCeshiView::AssertValid() const
{
CView::AssertValid();
}

void CCeshiView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CCeshiDoc* CCeshiView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCeshiDoc)));
return (CCeshiDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCeshiView message handlers

void CCeshiView::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default

 CClientDC DC(this);
  if(start==1)
  {
GetClientRect(rc);
rc.DeflateRect(20,20);
CRect gridRect(rc.left,rc.top,rc.left+(int)Xper*valuex,rc.top+(int)Yper*valuey);
CPen pen,penxi,penge;
    pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen*oldPen=DC.SelectObject(&pen);
oldPen=DC.SelectObject(&pen);
if(y<100)
{

DC.MoveTo(gridRect.left+(x*Xper),gridRect.bottom-y*Yper);
DC.LineTo(gridRect.left+((x+1)*Xper),gridRect.bottom-(y+1)*Yper);
//*****************存储数据**************************//
char ch[5];
itoa(y,ch,10);//直接将整数转换为字符串

ch[3]='\0';//数组的倒数第二个元素为

ch[4]=',';//数组的最后一个元素为换行符
fwrite(ch,1,5,pFile);
fflush(pFile);//不需要关闭文件,直接将缓存区的数据写入磁盘文件

/*float kk;
kk=1;
fwrite(&kk,16,1,pFile);
fflush(pFile);*/

x=x+1;
y=y+1; 
}
  }
CView::OnTimer(nIDEvent);
}





void CCeshiView::Onstartpicture() 
{
// TODO: Add your command handler code here
start=1;
}

void CCeshiView::OnStop() 
{
// TODO: Add your command handler code here
start=0;
}

---华软 网友回答---
自己顶一下
---华软网友回复---
SetTimer不知是不是写在了OnDraw里面了?不管你出于什么想法。它放在那里是肯定不合适的。OnDraw的刷新速度是很快的,而SetTimer是设置一个定时器,就相当于开了一个线程,它只要设置一池或者在必要的时候去设置,如果你让他频繁的设置的话,会出现什么情况哪?……
另外窗口的最大最小化,他都会刷新的,刷新会调用OnDraw,你认为你能很好的控制OnDraw的实现吗?不管你怎么画它都是在窗口的客户区显示,可能把你画全都显示了也可能只显示一部分。在每次画之前它都会把无效区域给刷新掉。你认为它从哪话不从那画重要吗?重要的是你要把你画的东西给呈现出来,你也没有必要考虑onDraw效率的问题,它是很快。
---华软网友回复---
这个和OnDraw的刷新速度没有关系吧
---华软网友回复---
没高手了吗
---华软网友回复---
当你改变窗口尺寸的时候,OnDraw是会重绘整个客户区的,相当于重新执行一次OnDraw里面的所有函数,如果你只让他画后面的,那你就不能把前面绘制好的图像保留在OnDraw里面。
---华软网友回复---
那应该怎么办呢      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。