MFC在对话框内绘图问题

chenquan1109 2013-10-19 09:23:29
请教一个困扰了很久的问题~~
建了一个MFC基于对话框的工程,在OnPaint函数里添加代码 绘制波形图。因为有很多个波形在界面上显示不全,所以加了水平和垂直滚动条。但发现每次点击滚动条后,不会出现没有显示全的波形,而是本来就有的波形又在原位置显示了一遍。

拉动滚动条后


这个问题要如何处理呢??请各位指导啊~~~
...全文
366 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurryboylqs 2013-10-20
  • 打赏
  • 举报
回复
不会的 ,除非你滚动条没处理好,可以参考这个滚动条逻辑辅助类: http://www.codeproject.com/Articles/10902/Add-Scrolling-to-a-CWnd-or-CDialog-using-a-C-Helpe
chenquan1109 2013-10-20
  • 打赏
  • 举报
回复
引用 4 楼 hurryboylqs 的回复:
MM_TEXT 窗口左上角是0,0 那么再往上就是负数了,所以需要int yPos = -GetScrollPos(m_hWnd,SB_VERT); 得到你第一个图的位置,其实出现滚动条后不用每个图都画一遍,只需根据坐标计算一下 那些图是可见的再绘制即可,直到不可见的然后OnPaint直接返回,这样提高绘图执行效率
谢谢吖~~垂直滚动可以了,但好像对水平滚动用相同的处理方法却没有效果,这是什么原因呢?
chenquan1109 2013-10-20
  • 打赏
  • 举报
回复
引用 8 楼 hurryboylqs 的回复:
int xPos = -GetScrollPos(m_hWnd,SB_HORZ); 不是写好给你了吗
刚发现是我有个地方的参数写错了 谢谢你了~~
hurryboylqs 2013-10-20
  • 打赏
  • 举报
回复
int xPos = -GetScrollPos(m_hWnd,SB_HORZ); 不是写好给你了吗
chenquan1109 2013-10-20
  • 打赏
  • 举报
回复
引用 6 楼 hurryboylqs 的回复:
不会的 ,除非你滚动条没处理好,可以参考这个滚动条逻辑辅助类: http://www.codeproject.com/Articles/10902/Add-Scrolling-to-a-CWnd-or-CDialog-using-a-C-Helpe
滚动条的代码在其他地方用的时候是有用的 我在想是不是如同垂直滚动条的nHeight没有设置对 垂直滚动条的时候这个是指波形的高度 那在水平滚动条的时候是指什么?是半个波形的宽度么还是其他的?
hurryboylqs 2013-10-19
  • 打赏
  • 举报
回复
MM_TEXT 窗口左上角是0,0 那么再往上就是负数了,所以需要int yPos = -GetScrollPos(m_hWnd,SB_VERT); 得到你第一个图的位置,其实出现滚动条后不用每个图都画一遍,只需根据坐标计算一下 那些图是可见的再绘制即可,直到不可见的然后OnPaint直接返回,这样提高绘图执行效率
hurryboylqs 2013-10-19
  • 打赏
  • 举报
回复
如果超出x范围那么x的原始坐标值应该是int xPos = -GetScrollPos(m_hWnd,SB_HORZ);
hurryboylqs 2013-10-19
  • 打赏
  • 举报
回复
出现滚动条后,你用GDI函数传递的都是逻辑坐标,在MM_TEXT模式下逻辑坐标和设备坐标是一样的, 第一个图的y坐标应该是 int yPos = -GetScrollPos(m_hWnd,SB_VERT); int nHeight = 100; //一个波形的高度 for(int i=0;i<N;i++) { DrawItem(yPos);//画第i个波形 yPos += nHeight; }
chenquan1109 2013-10-19
  • 打赏
  • 举报
回复
	CDC* pDC=GetDC();

		CPen cpen,pen;
		pen.CreatePen(PS_SOLID,4,RGB(0,0,0));
		cpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
		pDC->SelectObject(&cpen);
		
		pDC->SetViewportOrg(100,100);
		pDC->SetTextColor(RGB(255,0,0));
		int t=0,z=0,s=0;
		for(int k=0;k<50;k++)
		{
			 for(int n=-1,nTmp=0;nTmp<=1320;n++,nTmp+=60)
			{
				pDC->LineTo(60*n,z*200);
				pDC->MoveTo(60*n,z*200);
			}
			double y,radian;	
			pDC->SelectObject(&pen);
			for(int x=0;x<1000;x++)
			{		
				radian =x/((double)60*2)*PI;
				y=sin(radian)*2*60;
				pDC->MoveTo((int)x,y+z*200);
				pDC->LineTo((int)x,y+z*200);
				
			}
			
			pDC->MoveTo(0,200*(1+z));
			pDC->SelectObject(&cpen);
			z++;
		}
		cpen.DeleteObject();
		pen.DeleteObject();
OnPaint里的代码

15,980

社区成员

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

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