六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

在MFC下完成圖像放大鏡

[摘要]信息產(chǎn)業(yè)部電子第二十二研究所青島分所 郎銳 一、 引言 當(dāng)我們想仔細(xì)觀察某個(gè)細(xì)微的東西時(shí),一般都會(huì)使用放大鏡。而要看清顯示在計(jì)算機(jī)屏幕上的圖片或文字時(shí)通常也 可以借助于Windows操作系統(tǒng)附帶...
信息產(chǎn)業(yè)部電子第二十二研究所青島分所 郎銳  

一、 引言

當(dāng)我們想仔細(xì)觀察某個(gè)細(xì)微的東西時(shí),一般都會(huì)使用放大鏡。而要看清顯示在計(jì)算機(jī)屏幕上的圖片或文字時(shí)通常也
可以借助于Windows操作系統(tǒng)附帶的放大程序來實(shí)現(xiàn)。但該程序只能以固定的放大倍數(shù)去進(jìn)行觀看,有時(shí)并不能滿足我們
的需要。本文就通過MFC基本類庫提供的StretchBlt函數(shù)來實(shí)現(xiàn)對(duì)屏幕圖象的局部放大,并且可以隨意放大、縮小,選取
到合適的放大倍數(shù)來對(duì)圖像的細(xì)節(jié)進(jìn)行觀察。

二、 設(shè)計(jì)與實(shí)現(xiàn)

本程序主要用來對(duì)圖像的局部進(jìn)行可調(diào)倍數(shù)的放大,應(yīng)當(dāng)具有以下主要功能:

1. 移動(dòng)MOUSE放大顯示圖像的不同部位
2. 左擊增加放大倍率、右擊減少放大倍率。  

從光學(xué)角度來看,對(duì)物體的放大成像是通過把較小的真實(shí)物體顯示成尺寸較大的虛像來實(shí)現(xiàn)的。因此我們可以用類
似的原理,把圖像中待放大的區(qū)間從較小的顯示范圍拉伸到一個(gè)比較大的顯示范圍即可達(dá)到圖像放大的效果,兩個(gè)區(qū)間
的比值也就是圖像的放大倍率。可以通過縮小源區(qū)間的范圍或擴(kuò)大放大區(qū)間的范圍來實(shí)現(xiàn)放大倍率的調(diào)整。在MFC基本類
庫中提供有CDC類的StretchBlt函數(shù)可以將一幅位圖從一個(gè)源矩形以一定的光柵操作拷貝到另外一個(gè)不同大小的目標(biāo)矩形
中去,因此可以用此函數(shù)來實(shí)現(xiàn)圖象放大的功能,其函數(shù)原形聲明如下:

BOOL StretchBlt( int x, int y, //目標(biāo)矩形的坐標(biāo)原點(diǎn)
int nWidth, int nHeight, //目標(biāo)矩形的長度和寬度  
CDC* pSrcDC, //源設(shè)備環(huán)境句柄
int xSrc, int ySrc, //源矩形的坐標(biāo)原點(diǎn)
int nSrcWidth, int nSrcHeight, //源矩形的長度和寬度
DWORD dwRop ); //光柵操作標(biāo)志

當(dāng)指定的源和目標(biāo)矩形的寬度或高度不一樣時(shí),StretchBlt函數(shù)將創(chuàng)建一個(gè)位圖的鏡像。如果是寬度有變化,就沿x軸
創(chuàng)建鏡像;如果是高度上有變化就沿y軸創(chuàng)建鏡像。而且該函數(shù)可以在內(nèi)存中對(duì)源圖象做拉伸或壓縮處理后再拷貝到目標(biāo)矩
形中去。

要放大圖像首先要把圖像顯示出來,一般可以從文件動(dòng)態(tài)裝載或者直接從資源中用LoadBitMap讀取位圖資源。下面的代
碼放在視類的OnDraw函數(shù)中,用以在第一次調(diào)用時(shí)將位圖裝載并顯示出來,以后再被調(diào)用只是負(fù)責(zé)重畫:

……
static bool load;
if (!load)
{
BITMAP bm;
load = !load;
//裝載位圖到 m_pBitmap
m_pBitmap->LoadBitmap(IDB_BITMAP1);
//創(chuàng)建相關(guān)的設(shè)備環(huán)境
m_pdcMem->CreateCompatibleDC(pDC);
//將位圖從m_ pBitmap中裝載到m_pdcMem中
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;
//把位圖從m_pdcMem中裝載到當(dāng)前正在使用的設(shè)備環(huán)境中
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);
SetCursor(NULL);//隱藏鼠標(biāo)
}

要實(shí)現(xiàn)前面提到的第一個(gè)功能:移動(dòng)MOUSE放大顯示圖像的不同部位,顯然首先要在WM_MOUSEMOVE消息的響應(yīng)函數(shù)里編寫
代碼。以整形變量s和d來分別表示所選取的源和目標(biāo)區(qū)域的大小,再通過消息響應(yīng)函數(shù)OnMouseMove的入口參數(shù)point來確定當(dāng)
前的鼠標(biāo)位置就可以計(jì)算出我們要選取的源和目標(biāo)區(qū)域在圖像的位置。放大的工作只需通過StretchBlt函數(shù)將源區(qū)域中所在的
圖像拉伸到目標(biāo)矩形那么大,并拷貝給目標(biāo)區(qū)域即可實(shí)現(xiàn)所選區(qū)域的放大效果,下面是部分主要代碼:

……
//確定目標(biāo)區(qū)域、源區(qū)域的坐標(biāo)位置
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;
//獲取可用設(shè)備環(huán)境句柄
CDC * pDC = GetDC();
OnPrepareDC(pDC);
if (recover)
{
pDC->BitBlt(mrect.left,mrect.top,dd,dd,m_pdcMem,mrect.left,mrect.top,mana);
}
//隱藏鼠標(biāo)
SetCursor(NULL);
//拉伸放大
pDC->StretchBlt(drect.left,drect.top,drect.Width(),drect.Height(),m_pdcMem,srect.left,srect.top,srect.Width(),srect.Height(),SRCCOPY);
//保存當(dāng)前鼠標(biāo)位置備用
oldx = point.x; oldy = point.y;
//釋放設(shè)備環(huán)境句柄
ReleaseDC(pDC);
recover = true;
……

為了實(shí)現(xiàn)第二個(gè)功能:左擊增加放大倍率、右擊減少放大倍率,可以分別在消息WM_LBUTTONDOWN和消息WM_RBUTTONDOWN中添加改
變選取區(qū)域大小的代碼來實(shí)現(xiàn)。如果選取源矩形不變而改變目標(biāo)矩形的大小會(huì)隨著放大倍數(shù)的增大,顯示區(qū)域也不斷增大,當(dāng)放大到
一定程度的時(shí)候會(huì)另人無法忍受,因此選取通過縮放源矩形大小來控制放大倍數(shù)的方案:

void CZoomInView::OnRButtonDown(UINT nFlags, CPoint point)  
{
if (s < 60)  
{
SetCursor(NULL);
s+=3;
OnMouseMove(nFlags, point);
}  
CView::OnRButtonDown(nFlags, point);
}
……
void CZoomInView::OnLButtonDown(UINT nFlags, CPoint point)  
{
if(s>5)
{
s-=3;  
SetCursor(NULL);
OnMouseMove(nFlags, point);
}
CView::OnLButtonDown(nFlags, point);
}

小結(jié):本文通過對(duì)MFC庫函數(shù)StretchBlt的使用來實(shí)現(xiàn)了對(duì)圖像位圖的局部細(xì)節(jié)的放大功能。本程序只是通過了一個(gè)簡單的例子做了講
解,重點(diǎn)放在StretchBlt函數(shù)的應(yīng)用上,功能上也只實(shí)現(xiàn)了對(duì)本程序客戶區(qū)圖象的放大,如要對(duì)屏幕上其他程序和桌面進(jìn)行放大則還需
要引入系統(tǒng)鉤子(HOOK)的技術(shù)來實(shí)現(xiàn),并且需要把處理代碼放到動(dòng)態(tài)連接庫中才可以實(shí)現(xiàn)全局鉤子。本程序在Windows 98下,以
Microsoft Visual C++ 6.0編譯通過。


主站蜘蛛池模板: 日本另类αv欧美另类aⅴ | 一级做a爰片性色毛片小说 一级做a爰片性色毛片思念网 | 午夜欧美成人久久久久久 | 亚洲成a人v大片在线观看 | 天堂在线网 | 日本国产在线视频 | 日本综合欧美一区二区三区 | 亚洲妖精天堂 | 婷婷视频网| 天美传媒在线观看 | 婷婷综合缴情亚洲五月伊 | 日本男人的天堂 | 青青草污视频 | 四虎国产精品永免费 | 伊伊人成亚洲综合人网香 | 天堂v亚洲国产v一区二区 | 日本www色视频 | 中文字幕不卡免费视频 | 青青青爽在线视频观看大全 | 窝窝午夜色视频国产精品东北 | 色噜噜在线观看 | 夜久久 | 色在线导航 | 亚洲狠狠 | 视频在线二区 | 色花堂视频 | 亚洲一区在线免费 | 色综合久久婷婷天天 | 欧美性大战久久久久久久 | 欧美又粗又硬又大久久久 | 欧美亚洲第一页 | 深夜久久 | 欧美午夜一区二区福利视频 | 日本精品国产 | 在线小视频国产 | 四虎国产精品永久在线网址 | 天堂资源在线中文 | 亚洲a影院| 新久草视频| 香蕉欧美成人精品a∨在线观看 | 天天爱添天天爱添天天爱添 |