基於C++程式放大區域性圖形(mfc)

總是加班的狗發表於2017-06-20

基於C++程式放大區域性圖形;功能的實現;通過VC++實現對圖形的區域性進行放大;實現方法:;CDC類StretchBlt函式可以將一幅點陣圖從;BOOLStretchBlt(;intx,inty,//目標矩形的座標原點int;intxSrc,intySrc,//源矩形的座標;intnSrcWidth,intnSrcHeig;};;當指定的源和目標矩形的寬度或高度


基於C++程式放大區域性圖形

功能的實現

通過VC++實現對圖形的區域性進行放大。編譯並執行程式,如下圖所示。在圖形上移動滑鼠游標放大顯示圖形的不同部位,單擊滑鼠左鍵減小放大賠率,單擊滑鼠右鍵增大放大倍率。

實現方法:

CDC類StretchBlt函式可以將一幅點陣圖從一個源矩形以一定的光柵操作拷貝到另外一個不同大小的目標矩形,該函式的定義如下:

BOOL StretchBlt(

int x, int y, //目標矩形的座標原點 int nWidth,int nHeight, //目標矩形的長度和寬度 CDC*pSrcDC, //源裝置環境控制程式碼

int xSrc,int ySrc, //源矩形的座標原點

int nSrcWidth,int nSrcHeight, //源矩形的長度和寬度 DWORD dwRop //光柵操作標誌

};

當指定的源和目標矩形的寬度或高度不同時,StretchBlt函式將建立一個點陣圖的鏡象。如果是寬度變化,就沿x軸建立映象;如果是高度變化就沿y軸建立映象。而且該函式可以再記憶體中對源影象做拉伸或壓縮處理後在拷貝到目標距。這樣就實現某部分點陣圖的放大功能。

編寫步驟如下

(1)通過AppWizard建立一個單文件應用程式ZoomPart。

(2)在CZoomPartView類的標頭檔案中增加以下保護型別的成員變數:

protected:

CSize m_sizeDest;

CSize m_sizeSource;

CBitmap * m_pBitmap;

CDC * m_pdcMem;

int oldx,oldy,s,d; //s確定被放大區域,d確定放大顯示區域,放大倍率=d/s

bool recover;

long mana;

(3)在資源中加入自己喜歡的點陣圖,其ID設為IDB_BITMAP1。

(4)在CZoomPartViewd的建構函式中初始化成員變數,其程式碼如下:

CZoomPartView::CZoomPartView()

{

// TODO: add construction code here

m_pdcMem = new CDC;

m_pBitmap = new CBitmap;

recover = true;

s = 30; d = 45;

mana = SRCCOPY;

}

(5)在CZoomPartViewd的解構函式中加入如下程式碼:

CZoomPartView::~CZoomPartView()

{

delete m_pdcMem;

delete m_pBitmap;

}

(6)在CZoomPartViewd的OnDraw函式中顯示點陣圖,其程式碼如下:

void CZoomPartView::OnDraw(CDC* pDC)

{

CZoomPartDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//宣告判斷是否load點陣圖的靜態標誌

static bool load;

//按原來大小顯示點陣圖

if (!load) {

BITMAP bm;

load = !load;

m_pBitmap->LoadBitmap(IDB_BITMAP1);

m_pdcMem->CreateCompatibleDC(pDC);

m_pdcMem->SelectObject(m_pBitmap);

m_pBitmap->GetObject(sizeof(bm),&bm);

m_sizeSource.cx = bm.bmWidth;

m_sizeSource.cy = bm.bmHeight;

m_sizeDest = m_sizeSource;

pDC->StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy,

m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,mana);

}

else {

pDC->StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy,

m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,mana);

}

(7)在CZoomPartViewd類中通過ClassWizard響應WM_MOUSEMOVE訊息,根據當前放大倍數放大滑鼠位置附近的區域性影象,其程式碼如下:

void CZoomPartView::OnMouseMove(UINT nFlags, CPoint point)

{

//計算要放大的區域性矩形的源影象位置和目標位置

CString cord;

int dd;

CRect srect,drect,mrect;

srect.left = point.x - s;

srect.top = point.y - s;

srect.right = point.x + s;

srect.bottom = point.y + s;

drect.left = point.x - d;

drect.top = point.y - d;

} drect.right = point.x + d; drect.bottom = point.y + d; mrect.left = oldx - d; mrect.top = oldy - d; mrect.right = oldx + d; mrect.bottom = oldy + d; dd = 2*d; CDC * pDC = GetDC(); OnPrepareDC(pDC); //放大影象 if (recover) { pDC->BitBlt(mrect.left,mrect.top,dd,dd, m_pdcMem,mrect.left,mrect.top,mana); } pDC->StretchBlt(drect.left,drect.top, drect.Width(),drect.Height(),m_pdcMem,srect.left, srect.top,srect.Width(),srect.Height(),SRCCOPY); oldx = point.x; oldy = point.y; ReleaseDC(pDC); recover = true; CView::OnMouseMove(nFlags, point);

(8)在CZoomPartViewd類中通過ClassWizard響應WM_LBUTTONDOWN訊息和WM_RBUTTONDOWN訊息,減小和增加放大倍數,然後進行放大顯示。其程式碼如下:

void CZoomPartView::OnLButtonDown(UINT nFlags, CPoint point)

{

//如果滑鼠位置不在點陣圖上,則還原點陣圖大小顯示

CRect rc(0,0,m_sizeSource.cx,m_sizeSource.cy);

if(!rc.PtInRect(point))

{

Invalidate();

}

else if (d > 5)//如果放大倍數大於5,就繼續減小放大倍數,然後進行放大顯示 {

CDC * pDC = GetDC();

pDC->StretchBlt(oldx - d,oldy - d,2*d,

2*d,m_pdcMem,oldx - d,oldy - d,2*d,2*d,mana);

d -= 10;

ReleaseDC(pDC);

CZoomPartView::OnMouseMove(nFlags, point);

}

CView::OnLButtonDown(nFlags, point);

}

void CZoomPartView::OnRButtonDown(UINT nFlags, CPoint point)

{

//如果滑鼠位置不在點陣圖上,則還原點陣圖大小顯示

CRect rc(0,0,m_sizeSource.cx,m_sizeSource.cy);

if(!rc.PtInRect(point))

{

Invalidate();

}

else if (d <150)//如果放大倍數小於150,就繼續增加放大倍數,然後進行放大顯示 {

d += 10;

CZoomPartView::OnMouseMove(nFlags, point);

}

CView::OnRButtonDown(nFlags, point);

}


相關文章