mfc重绘有关问题
mfc重绘问题
我要做的是点击按钮出现坐标图,是一个对话框程序,在刚打开程序时,出现的是一个空的坐标图,然后点击按钮,想让出现一副图像,绘图都在OnPaint里面写了,为了让点击按钮出现不同于初始的图,我设置了一个变量m_draw,初始值为0,点击按钮,值设为1,读取文件,设置坐标图轴下标值,调用OnPaint,出现曲线图,想法是这样的,现在不出曲线,求大神啊,网上有一些关于重绘的,看的不是太明白。
------解决方案--------------------
OnPaint不是你去调用的,是窗口刷新产生了WM_PAINT消息后去调用的,所以其实每次刷新的时候m_draw都是0。
你可以在OnOK里面读取好数据,Invalidate窗口,在OnPaint里面判断有数据就根据数据绘图。
另外更好的方式是在OnOK里面读取好数据,绘制到后台一个位图中,在OnPaint中直接将这个位图绘制出来,这样效率高,无刷新,但是如果要有放大缩小移动等需要额外处理。
------解决方案--------------------
double max_xa,max_xb;
void CAaDlg::OnInitDialog()
{
m_draw=0;
// 設定初值
max_xa=-9;
max_xb=9;
}
void CAaDlg::OnButton1Clicked()
{
CFileDialog fileopendlg(true);
fstream file2;
if (fileopendlg.DoModal() == IDCANCEL)// OK才執行
return;
filename = fileopendlg.GetPathName();
m_draw=1;
//取得 max_xa,max_xb
file2.open(filename);
file2>>t>>x;
max_xa=x;
max_xb=x;
while(1)
{
if (file2.eof())
{
break;
}
file2>>t>>x;
max_t=t;
if (max_xa<x)
{
max_xa=x;
}
if (max_xb>x)
{
max_xb=x;
}
}
file2.Clolsed();
//改變m_draw及max_ma,max_mb,OnPaint時不需重複開黨讀檔,
Invalidate();//呼叫OnPaint();
}
void CAaDlg::OnPaint()
{
double t,x,y,z;
double max_t;
double xstep,ystep;
CPaintDC dc(this);
fstream file1;
CPen* pPenBlue = new CPen; //创建画笔对象
pPenBlue->CreatePen(PS_SOLID, 2, RGB(0,0,255)); //蓝色画笔
我要做的是点击按钮出现坐标图,是一个对话框程序,在刚打开程序时,出现的是一个空的坐标图,然后点击按钮,想让出现一副图像,绘图都在OnPaint里面写了,为了让点击按钮出现不同于初始的图,我设置了一个变量m_draw,初始值为0,点击按钮,值设为1,读取文件,设置坐标图轴下标值,调用OnPaint,出现曲线图,想法是这样的,现在不出曲线,求大神啊,网上有一些关于重绘的,看的不是太明白。
------解决方案--------------------
OnPaint不是你去调用的,是窗口刷新产生了WM_PAINT消息后去调用的,所以其实每次刷新的时候m_draw都是0。
你可以在OnOK里面读取好数据,Invalidate窗口,在OnPaint里面判断有数据就根据数据绘图。
另外更好的方式是在OnOK里面读取好数据,绘制到后台一个位图中,在OnPaint中直接将这个位图绘制出来,这样效率高,无刷新,但是如果要有放大缩小移动等需要额外处理。
------解决方案--------------------
double max_xa,max_xb;
void CAaDlg::OnInitDialog()
{
m_draw=0;
// 設定初值
max_xa=-9;
max_xb=9;
}
void CAaDlg::OnButton1Clicked()
{
CFileDialog fileopendlg(true);
fstream file2;
if (fileopendlg.DoModal() == IDCANCEL)// OK才執行
return;
filename = fileopendlg.GetPathName();
m_draw=1;
//取得 max_xa,max_xb
file2.open(filename);
file2>>t>>x;
max_xa=x;
max_xb=x;
while(1)
{
if (file2.eof())
{
break;
}
file2>>t>>x;
max_t=t;
if (max_xa<x)
{
max_xa=x;
}
if (max_xb>x)
{
max_xb=x;
}
}
file2.Clolsed();
//改變m_draw及max_ma,max_mb,OnPaint時不需重複開黨讀檔,
Invalidate();//呼叫OnPaint();
}
void CAaDlg::OnPaint()
{
double t,x,y,z;
double max_t;
double xstep,ystep;
CPaintDC dc(this);
fstream file1;
CPen* pPenBlue = new CPen; //创建画笔对象
pPenBlue->CreatePen(PS_SOLID, 2, RGB(0,0,255)); //蓝色画笔