对话框画图重绘问题,求助各位大神

AgentNeo 2012-08-08 03:20:59
一个实时监测坐标数据画直线的问题,当窗口最小化,或有东西遮挡时,就发生窗口重绘,我把图画在picture中了,现在需要保存以前的实时画图轨迹,请教各位大神,该怎么办?
...全文
229 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
AgentNeo 2012-08-15
  • 打赏
  • 举报
回复
木有人啊
AgentNeo 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

偶QQ上给楼主聊了很多了,楼主还没结贴啊?
[/Quote]

你跟我说的环形存储区我不会用啊,有没有代码发给我啊
AgentNeo 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

其实吧,你的问题想解决除非换一种编程思路。
首先:笔画的存储问题,你应该自己新建一个类,然后每次换线将笔画存入这个类中。
其次:笔画的存储问题,建议使用链表一类的方法。
最后:如果希望永久存储,需要进行序列化存储的考虑。

注:你的希望不能实现,是框架的问题,不是程序的问题。
[/Quote]

你的意思是用个环形存储区么?
这个我不会用啊
傻X 2012-08-10
  • 打赏
  • 举报
回复
偶QQ上给楼主聊了很多了,楼主还没结贴啊?
笨笨D幸福 2012-08-10
  • 打赏
  • 举报
回复
其实吧,你的问题想解决除非换一种编程思路。
首先:笔画的存储问题,你应该自己新建一个类,然后每次换线将笔画存入这个类中。
其次:笔画的存储问题,建议使用链表一类的方法。
最后:如果希望永久存储,需要进行序列化存储的考虑。

注:你的希望不能实现,是框架的问题,不是程序的问题。
AgentNeo 2012-08-10
  • 打赏
  • 举报
回复
有人知道么
jiayangang 2012-08-09
  • 打赏
  • 举报
回复
如果要刷新所画的图,不要使用定时器。系统会自动刷新的。
除非你画图的数据改变了,这时候在某个地方调用InvalidateRect即可。
jiayangang 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

定时器中画图的那部分封装成函数放到OnPaint里面不就可以了啊

不行啊,对话框直接崩了,我的画图是在打开对话框执行按钮命令才可以响应的,请教改如何防在onpaint里
[/Quote]
你定义一个变量m_bInitial,初始赋值为m_bInitial = false。在OnInitDialog()的最后把他改为true。
然后在OnPaint()中检查m_bInitial,如果是true,则绘图。

if (IsIconic())
{
}
else
{
if(m_bInitial)
{
//CDialog::OnPaint();
CPaintDC dc(this);
Draw(&dc);
}
}
AgentNeo 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

如果要刷新所画的图,不要使用定时器。系统会自动刷新的。
除非你画图的数据改变了,这时候在某个地方调用InvalidateRect即可。
[/Quote]

我的图是实时获取的,不用定时器怎么不断获取,画的直线坐标有几千个,要全部保留,在onpaint里也只能保留上一条直线吧,有啥其他的办法么,如果保留几千个点重绘要很久才能恢复图像啊。我用的是基于对话框的,我在考虑能否保存图像到CDocument类中,然后恢复,不知能否实现,或者有其他办法
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

在OnPaint中将数据取出绘制 在定时器中定时刷新即可
[/Quote]

我的画图坐标数据时不断用定时器来获取的,如何“在OnPaint中将数据取出绘制 在定时器中定时刷新”
  • 打赏
  • 举报
回复
在OnPaint中将数据取出绘制 在定时器中定时刷新即可
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

我觉得应该放下面啊else啊

上面代码是初始化的时候调的
[/Quote]
if 中,else中,if前,else后都不行啊
傻X 2012-08-08
  • 打赏
  • 举报
回复
我觉得应该放下面啊else啊

上面代码是初始化的时候调的
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你自己打个标识符呀,啥时候应该重绘,啥时候不用
[/Quote]
不行啊,还是不能保存以前的直线
void CTestDlg::OnPaint()
{



if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);

timer2(); //画图
}
else
{
CDialog::OnPaint();
}


}

是这样加么
傻X 2012-08-08
  • 打赏
  • 举报
回复
你自己打个标识符呀,啥时候应该重绘,啥时候不用
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

定时器中画图的那部分封装成函数放到OnPaint里面不就可以了啊
[/Quote]
不行啊,对话框直接崩了,我的画图是在打开对话框执行按钮命令才可以响应的,请教改如何防在onpaint里
傻X 2012-08-08
  • 打赏
  • 举报
回复
定时器中画图的那部分封装成函数放到OnPaint里面不就可以了啊
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
在线等
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

把图画在OnPaint中,不要使用双缓存做图
[/Quote]

我的画图是用定时器来画的,没法放onpaint里,我的是基于对话框的,我没有用双缓存啊,就是直接在ontimer中画直线,
AgentNeo 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

OnSize的的时候自动调用OnDraw(OnPaint)的

所以在上面两个中处理即可
[/Quote]

我的画图是用定时器来画的,没法放onpaint里,我的是基于对话框的,没有ondraw类,菜鸟求助啊
加载更多回复(2)

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧