拉伸位图怎么做?

wkp 2001-05-06 07:05:00
各位:
在下用下面的算法来拉伸一张图片,可是在视图客户区里却会得到两张图片。
一张左顶点位于客户区(0,0)点,另一张位于(x,y)点:请问何解?
void CPView::showpicture(CString name,int mode)
{
CBitmap m_bitmap;
CDC *pDC=GetDC();
int x,y;
CRect rc;
GetClientRect(&rc);
HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, _T(name), IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);

m_bitmap.Attach(hBitmap);

CDC dcImage;
if (!dcImage.CreateCompatibleDC(pDC))
return;
BITMAP bm;
m_bitmap.GetBitmap(&bm);
// show the image.
CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);
x=(rc.right -bm.bmWidth)/2;
y=(rc.bottom -bm.bmHeight)/2;
pDC->StretchBlt(100, 100, bm.bmWidth, bm.bmHeight, &dcImage, 100, 100,bm.bmWidth*4,bm.bmHeight*4,SRCCOPY);
dcImage.SelectObject(pOldBitmap);
}


...全文
494 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wkp 2001-05-06
  • 打赏
  • 举报
回复
多谢各位高手,不知有没有哪位肯编一个拉伸位图的源程序,将源代码发给小弟!
这次发者加分!小弟EMAIL:wkp_790616@263.net
jeffreyren 2001-05-06
  • 打赏
  • 举报
回复
你要分清楚sdk 和MFC的函数。
vcbacker 2001-05-06
  • 打赏
  • 举报
回复
::StretchBlt是11个参数的;CDC::StretchBlt是10个的。
两个都能用,;)
vcbacker 2001-05-06
  • 打赏
  • 举报
回复
前者是Win32函数,后者是MFC的函数。
类似的情形还有很多。
jeffreyren 2001-05-06
  • 打赏
  • 举报
回复
可以,看你怎么得到dc了。
CClientDC dc(this);
vcbacker 2001-05-06
  • 打赏
  • 举报
回复
::StretchBlt和CDC::StretchBlt是不一样的,不过效果相同罢了。
wkp 2001-05-06
  • 打赏
  • 举报
回复
我也知道StretchBlt()有11个参数,但有的书上只带10个参数(象上边一样),敢问各位,是不是第一个参数hdcDest可以省略?
wkp 2001-05-06
  • 打赏
  • 举报
回复
我也知道StretchBlt()有11个参数,但有的书上只带10个参数(象上边一样),敢问各位,是不是第一个参数hdcDest可以省略?
wkp 2001-05-06
  • 打赏
  • 举报
回复
请问 “hdcDest:指向目标设备环境的句柄。”可以是CLIENT吗?
elang 2001-05-06
  • 打赏
  • 举报
回复
pDC->StretchBlt(100, 100, bm.bmWidth, bm.bmHeight, &dcImage, 100, 100,bm.bmWidth*4,bm.bmHeight*4,SRCCOPY);
这一句有问题
改成这样也就好了
pDC->StretchBlt(100, 100, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0,bm.bmWidth,bm.bmHeight,SRCCOPY);
另外你的程序并没有显示两个图片 关键是你参数不对 第八第九各参数不能大于图象本身


jeffreyren 2001-05-06
  • 打赏
  • 举报
回复
我没有测试你的程序,不清楚为什么会出现2个位图。
但是,你的程序好象是缩小位图而不是拉伸位图呀!

看看函数的定义:


函数功能:函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

函数原型:BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

参数:

hdcDest:指向目标设备环境的句柄。

nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

nYOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。

nHeightDest:指定目标矩形的高度,按逻辑单位表示高茺。

hdcSrc:指向源设备环境的句柄。

nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。

nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。

nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。

nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。

dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。

返回值:如果函数执行成功,那么返回值为非零,如果函数执行失败,那么返回值为零。Windows NT:若想获得更多的错误信息,请调用GetLastError函数。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧