1. 程式人生 > >滑鼠滾輪實現單文件檢視的放大與縮小

滑鼠滾輪實現單文件檢視的放大與縮小

滑鼠滾輪實現單文件檢視的放大與縮小

其主要原理是利用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>
到此所有設定完成。
程式執行結果如下:

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