基於C++程式放大區域性圖形(mfc)
基於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);
}
相關文章
- Matlab繪圖(2)透過程式碼進行區域性放大繪圖、多檔案繪圖Matlab繪圖
- 視覺化學習:實現Canvas圖片區域性放大鏡視覺化Canvas
- rtabmap 區域性建圖
- Android自定義控制元件之區域性圖片放大鏡--BiggerViewAndroid控制元件View
- Android自定義控制元件之區域性圖片放大鏡–BiggerViewAndroid控制元件View
- 基於C++和OpenCv的SIFT_影象區域性特徵檢測演算法程式碼的實現C++OpenCV特徵演算法
- 基於 Vue 的商品主圖放大鏡方案Vue
- 一個基於vue的圖片放大鏡Vue
- 基於區域性資訊表示的細粒度情感元素抽取
- 基於MFC文件/視/框架程式之利劍框架
- Mac圖片區域性擦除工具Mac
- 程式效能優化-區域性性原理優化
- 基於Vue實現圖片在指定區域內移動Vue
- 酒店房間和 C++ 區域性變數的作用域C++變數
- 基於MFC文件/視/框架程式之利劍 (轉)框架
- javascript圓形區域碰撞檢測程式碼JavaScript
- C++程式設計經驗-返回區域性變數的討論C++程式設計變數
- 百度地圖繪製多邊形區域地圖
- 區域性類實現C++的閉包薦C++
- 圖片區域性識別怎麼操作
- 基於上下文圖的策略性領域驅動開發
- RenderDoc圖形偵錯程式詳細使用教程(基於DirectX11)
- Windows程式設計系列:圖形程式設計基礎Windows程式設計
- 【區域性特徵】ASIFT特徵
- OpenGL基礎圖形程式設計(四)基礎程式結構程式設計
- 移動端開發——關於區域性區域滾動總結 | 實戰系列
- 論文解讀丨基於區域性特徵保留的圖卷積神經網路架構(LPD-GCN)特徵卷積神經網路架構GC
- 一種強化的基於區域性直方圖裁剪均衡化的對比度調節演算法。直方圖演算法
- OpenGL基礎圖形程式設計(一)OpenGL與3D圖形世界程式設計3D
- 圓形放大的hover效果
- C++基礎-1-記憶體管理(全域性區、堆區、棧區)C++記憶體
- 微信小程式setData區域性重新整理列表微信小程式
- javascript實現區域性列印程式碼例項JavaScript
- SVG 基礎圖形SVG
- 微信小程式折線圖表折線圖加區域圖微信小程式
- Java™ 教程(區域性類)Java
- 區域性內部類
- VUE-區域性使用Vue