VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 914|回复: 8

绘图程序解读!

[复制链接]

3

主题

11

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-2-29 18:30:02 | 显示全部楼层 |阅读模式
这是其中的一段代码,望高手给出详细注释,谢谢!
void CSeismicView::OnPrepareDC(CDC* pDC,CPrintInfo* pInfo)
{
        CScrollView::OnPrepareDC(pDC, pInfo);
        CSeismicDoc* pDoc = GetDocument();
        if(!pDoc->IfHaveData(index)) return;
        if(pDC->IsPrinting())
        {
             CSize size;
          size.cx=(int)((float)pDoc->pSeismicData[index]->nMapWidth*zoomfactor);
          size.cy=(int)((float)pDoc->pSeismicData[index]->nMapHeight*zoomfactor);

          CRect rect;
          GetUpdateRect(&rect,FALSE);

          pDC->SetMapMode(MM_LOMETRIC);
          pDC->SetWindowOrg(0,0);
        }
        else
        {

          CSize size(pDoc->pSeismicData[index]->nMapWidthA,pDoc->pSeismicData[index]->nMapHeightA);
          if((size.cx==0)||(size.cy==0)) return;
               
          pDC->SetMapMode(MM_TEXT);
          pDC->SetWindowOrg(0,0);
          SetScrollSizes(MM_TEXT,size);
        }
}

void CSeismicView::OnDraw(CDC* pDC)
{
        //Beep(1000,100);
        CSeismicDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        CView* pView=((CSeismicFrm*)AfxGetMainWnd())->GetActiveView();
        if(pView==this)
        {
                CRect rect;
                GetClientRect(&rect);
                CPoint point(0,0);
                pDC->DPtoLP(&point);
                rect.left+=point.x;
                rect.right+=point.x;
                rect.top+=point.y;
                rect.bottom=rect.top+5;
                CBrush brush(RGB(255,0,0));
//                pDC->FillRect(&rect,&brush);
                brush.DeleteObject();
        }
        if(!pDoc->IfHaveData(index)) return;
        //this->MessageBox("##",NULL,MB_OK);
        pDoc->pSeismicData[index]->Draw(pDC,(CView*)this);
        pDoc->pLayerData[index]->Draw(pDC,(CView*)this);
        pDoc->pFaultData[index]->Draw(pDC,(CView*)this);
        pDoc->pSeismicData[index]->DrawGridAndLabel(pDC,(CView*)this);
}
谢谢!!!!!!!!!!!!!!!!!
回复

使用道具 举报

0

主题

9

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-5-12 01:45:01 | 显示全部楼层
void CSeismicView::OnPrepareDC(CDC* pDC,CPrintInfo* pInfo)
{
        CScrollView::OnPrepareDC(pDC, pInfo);
        CSeismicDoc* pDoc = GetDocument();
        if(!pDoc->IfHaveData(index)) return;
        if(pDC->IsPrinting())===判断CDC是否用于打印
        {
             CSize size;===相对坐标或位置,下边是坐标xy
          size.cx=(int)((float)pDoc->pSeismicData[index]->nMapWidth*zoomfactor);
          size.cy=(int)((float)pDoc->pSeismicData[index]->nMapHeight*zoomfactor);

          CRect rect;
          GetUpdateRect(&rect,FALSE);==获得可刷新区域

          pDC->SetMapMode(MM_LOMETRIC);设置映射模式
          pDC->SetWindowOrg(0,0);设置坐标原点
        }
        else
        {

          CSize size(pDoc->pSeismicData[index]->nMapWidthA,pDoc->pSeismicData[index]->nMapHeightA);
          if((size.cx==0)||(size.cy==0)) return;
               
          pDC->SetMapMode(MM_TEXT);
          pDC->SetWindowOrg(0,0);
          SetScrollSizes(MM_TEXT,size);设置滚动条        }
}

void CSeismicView::OnDraw(CDC* pDC)
{
        //Beep(1000,100);
        CSeismicDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        CView* pView=((CSeismicFrm*)AfxGetMainWnd())->GetActiveView();
        if(pView==this)
        {
                CRect rect;
                GetClientRect(&rect);==取得客户区范围
                CPoint point(0,0);
                pDC->DPtoLP(&point);==转换设备坐标倒逻辑坐标
                rect.left+=point.x;
                rect.right+=point.x;
                rect.top+=point.y;
                rect.bottom=rect.top+5;
                CBrush brush(RGB(255,0,0));==设置画刷
//                pDC->FillRect(&rect,&brush);=用画刷填充
                brush.DeleteObject();==删除
        }
        if(!pDoc->IfHaveData(index)) return;
        //this->MessageBox("##",NULL,MB_OK);
        pDoc->pSeismicData[index]->Draw(pDC,(CView*)this);
        pDoc->pLayerData[index]->Draw(pDC,(CView*)this);
        pDoc->pFaultData[index]->Draw(pDC,(CView*)this);
        pDoc->pSeismicData[index]->DrawGridAndLabel(pDC,(CView*)this);
}
=============
这里边都是一些基本的函数,在view里调用了一些DOC类里的成员函数,所以有听多的pDoc->.
建议楼主应该把mfc基础打好再来研究这些,可以看看 技术内幕 或者 深入浅出MFC 什么东西的,对一些基本函数 MFC框架 文档视有一定了解以后再看这段程序应该很简单
回复

使用道具 举报

3

主题

11

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-5-17 18:30:01 | 显示全部楼层
谢谢!
不好意思!上面的程序是否能够完成很多点的出图?因为想找个程序参考着编!
要是我有几百万个点,需要画几十万条线,能否用这个画呢?
用MoveTo和LineTo的速度是不是很慢呢?
请高手指教!
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-17 11:30:01 | 显示全部楼层
在这个基础上开发你所要的程序
回复

使用道具 举报

3

主题

11

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-7-17 14:00:01 | 显示全部楼层
不好意思!我的基础可能太差了!
能否请楼上给个框架什么的,我自己做起来还是有些吃力!
比如要画几条方向向下的曲线什么的!(这上面可以贴图吗?)
谢谢!!!!!!
回复

使用道具 举报

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-19 10:15:01 | 显示全部楼层
挨个点画没有问题,只是地震数据由于数据量大,建议用线程加缓存的方法来做;就是创建一个线程,先在内存设备画好后,再显示出来。

还有,由于地震数据各点能量差异有可能比较大,如果处理不好,显示出来地震道的图形不是很好看,可以考虑均方根法、最大值法等balance算法来选择显示。


回复

使用道具 举报

3

主题

11

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-7-21 18:30:01 | 显示全部楼层
哇!zrl8668好厉害!
其实,你说的线程什么的我不是很理解,能否给个例子呢?因为初次接触很迷茫!
回复

使用道具 举报

0

主题

57

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-7-27 01:00:01 | 显示全部楼层
数据太庞大的话,还是直接操作位图数据为好
回复

使用道具 举报

3

主题

11

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-8-2 21:00:01 | 显示全部楼层
各位高手能否给个代解释的例子!拜托了!
你们这样说,我不懂!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表