鼠標滾輪實現單文檔視圖的放大與縮小

鼠標滾輪實現單文檔視圖的放大與縮小

其主要原理是利用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>
到此所有設置完成。

程序運行結果如下:


原圖


縮小後



放大後


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章