鼠标滚轮实现单文档视图的放大与缩小

鼠标滚轮实现单文档视图的放大与缩小

其主要原理是利用SetWindowExt和SetViewportExt函数来动态调节窗口区和视口区的比例,设窗口区与视口区之间的比例系数为m_delta,鼠标滚轮每滚动一次,在视图View类的响应函数OnPrepareDC中就改变一次m_delta,然后调用OnPaint函数重新绘图,这样看起来就实现了视图的放大与缩小。

其主要步骤如下:

1. 建立单文档视图工程,比如SingleDoc.proj;

2. 在CSingleDocView类中添加float型成员变量m_delta,在该类构造函数中初始化m_delta = 1.0,m_delta即为比例系数,初始化其为1表示窗口与视口大小相同;

3. 向CSingleDocView类中添加消息响应函数OnPrepareDC,向其中添加如下代码:
 

<span style="font-size:18px;">	// TODO: 在此添加专用代码和/或调用基类
	CView::OnPrepareDC(pDC, pInfo);
 
	CRect rectClient;
        GetClientRect(rectClient);               // 得到客户区大小
	pDC->SetMapMode(MM_ANISOTROPIC);         // 设置绘图模式
 
	pDC->SetWindowExt(rectClient.right*m_delta,rectClient.bottom*m_delta);  // 设置整个客户区的大小,窗口大小
	pDC->SetViewportExt(rectClient.right,rectClient.bottom);                // 视口大
<pre name="code" class="cpp">        pDC->SetViewportOrg(0,0);     

4. OnPaint函数中的代码如下:

<span style="font-size:18px;">    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CView::OnPaint()
    OnPrepareDC(&dc);
    OnDraw(&dc);</span>
5. 在CSingleDocView类中为鼠标滚轮添加响应函数:OnMouseWheel,其中代码如下:
<span style="font-size:18px;">    BOOL CShapeView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        float alfa = 0.05;
        //short ceshi = zDelta;
        if (zDelta == 120)
        {
            m_delta = m_delta * (1 - alfa);
            Invalidate();
        }
        else
        {
            m_delta = m_delta * (1 + alfa);
            Invalidate();      
        }
 
        Invalidate();
 
        return CView::OnMouseWheel(nFlags, zDelta, pt);
    }</span>
    上述代码中alfa为滚轮每滚动一次, m_delta 增大或缩小的比例,可适当选值;Invalidate()函数用来实现窗口重绘;
6. 最后,在OnDraw函数中添加自己的绘图函数,比如如下从txt文件中读取数据:

<span style="font-size:18px;">void CSingleDocPlotView::OnDraw(CDC* pDC)  // 窗口重新绘制时总会调用程序视类中的OnDraw函数
{
    CSingleDocPlotDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    char buffer[256];
    unsigned int tag;
    unsigned int time;
    double xPosition;
    double yPosition;
 
 
    CPen myPen(0,10,RGB(0,0,255));
    pDC->SelectObject(myPen);
    std::ifstream measdatafile("measdata.txt",std::ios::binary); // 打开每一时刻量测数据个数文件
    if (!measdatafile)
    {
        printf("量测数据未找到!\n"); 
        return ;
    }
    measdatafile.getline(buffer,255,'\n');
    sscanf_s(buffer,"%u %u %lf %lf %lf",&tag,&time,&xPosition,&yPosition);       // 将buffer中内容放入du中
    pDC->MoveTo(xPosition,yPosition);
 
    while (!measdatafile.eof())
    {
        measdatafile.getline(buffer,255,'\n');                                   // 一次采集一行数据
        sscanf_s(buffer,"%u %u %lf %lf %lf",&tag,&time,&xPosition,&yPosition);
        pDC->LineTo(xPosition,yPosition);
    }
    measdatafile.close();
 
    return ;
}</span>
到此所有设置完成。
程序运行结果如下:

扫描二维码关注公众号,回复: 4902387 查看本文章

转:https://blog.csdn.net/u013920434/article/details/38226295?utm_source=blogxgwz8

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/86096846