求助:VC如何实现图片的放大和缩小?
我在对话框中加了个Picture控件(IDC_IMAGE),然后用以下的代码往这个控件里加了副图片:HBITMAPhbmp;CRectrect;GetDlgItem(ID...
我在对话框中加了个Picture控件(IDC_IMAGE),然后用以下的代码往这个控件里加了副图片:
HBITMAP hbmp;
CRect rect;
GetDlgItem(IDC_IMAGE)->GetWindowRect(&rect);
hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),FilePath,
IMAGE_BITMAP,rect.Width(),rect.Height(),LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CStatic *pcst=new CStatic();
pcst=(CStatic *)this->GetDlgItem(IDC_IMAGE);
pcst->SetBitmap(hbmp);
我现在想在对话框上加两个按钮,一个放大一个缩小,在放大或缩小的过程中,控件大小保持不变,请问具体该怎么实现?我用的是VC2005。 展开
HBITMAP hbmp;
CRect rect;
GetDlgItem(IDC_IMAGE)->GetWindowRect(&rect);
hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),FilePath,
IMAGE_BITMAP,rect.Width(),rect.Height(),LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CStatic *pcst=new CStatic();
pcst=(CStatic *)this->GetDlgItem(IDC_IMAGE);
pcst->SetBitmap(hbmp);
我现在想在对话框上加两个按钮,一个放大一个缩小,在放大或缩小的过程中,控件大小保持不变,请问具体该怎么实现?我用的是VC2005。 展开
3个回答
2015-07-08
展开全部
用StretchBlt函数即可实现,参考代码如下:
void CImgWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
//获得窗口大小
CRect r;
GetClientRect(&r);
//填充背景
HBRUSH brush = (HBRUSH)::GetStockObject(GRAY_BRUSH);
::FillRect(dc.m_hDC,&r,brush);
dc.SetStretchBltMode(HALFTONE);
//将位图选进设备场景中
CDC memdc;
memdc.CreateCompatibleDC( &dc );
CBitmap* pOldBmp= memdc.SelectObject(&m_bmpImage);
//获得位图参数
BITMAP bmp;
m_bmpImage.GetBitmap(&bmp);
//开始缩放
switch(m_nStrechType)
{
case STRECH_1_1://1:1
dc.BitBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,SRCCOPY);
break;
case STRECH_FULL_X://按宽度
dc.StretchBlt(r.left,r.top,r.Width(),bmp.bmHeight,&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
case STRECH_FULL_Y://按高度
dc.StretchBlt(r.left,r.top,bmp.bmWidth,r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
case STRECH_FULL://充满窗口
dc.StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
case STRECH_CENTER://居中显示,大小为窗口的一半
dc.StretchBlt(r.Width()/4,r.Height()/4,r.Width()/2,r.Height()/2,&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
break;
}
//还原
memdc.SelectObject(pOldBmp);
}
展开全部
StretchBlt Or BitBlt
我用BCB写的例子
StretchBlt(btmp->Canvas->Handle, 0, 0,2000,2000
, btmp->Canvas->Handle, MouseDownX, MouseDownY, X, Y, SRCCOPY);
BOOL StretchBlt(
__in HDC hdcDest,
__in int nXOriginDest,
__in int nYOriginDest,
__in int nWidthDest,
__in int nHeightDest,
__in HDC hdcSrc,
__in int nXOriginSrc,
__in int nYOriginSrc,
__in int nWidthSrc,
__in int nHeightSrc,
__in DWORD dwRop
);
我用BCB写的例子
StretchBlt(btmp->Canvas->Handle, 0, 0,2000,2000
, btmp->Canvas->Handle, MouseDownX, MouseDownY, X, Y, SRCCOPY);
BOOL StretchBlt(
__in HDC hdcDest,
__in int nXOriginDest,
__in int nYOriginDest,
__in int nWidthDest,
__in int nHeightDest,
__in HDC hdcSrc,
__in int nXOriginSrc,
__in int nYOriginSrc,
__in int nWidthSrc,
__in int nHeightSrc,
__in DWORD dwRop
);
追问
谢谢你,我不是计算机专业的,只是业余搞点程序,所以有很多东西一窍不通。不管怎样,感谢好心人的回答。
参考资料: http://msdn.microsoft.com/en-us/library/dd145120(v=vs.85).aspx
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用 BitBlt函数
更多追问追答
追问
能具体一点吗,谢谢了。
追答
http://wenku.baidu.com/view/454769d87f1922791688e858.html
百度文库里的文章,看看吧,可能对你有帮助
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询