StretchBlt 的翻转功能是在 源hdc 的宽和高上变个符号吧,怎么不好使呢?

北漂17载 2004-05-07 03:07:09
代码:
GetObject (hstScope, sizeof(BITMAP), &bm);
GetClientRect (hwnd, &rect);
aMemDC = CreateCompatibleDC (hdc);

SelectObject (aMemDC, hstScope);
SetStretchBltMode (hdc, STRETCH_DELETESCANS);
StretchBlt(hdc, 0, 0,rect.right , rect.bottom,
aMemDC, 0, 0,bm.bmWidth,bm.bmHeight,SRCCOPY);
DeleteDC (aMemDC);
能缩放,正常显示,但是在bm.bmWidth变为:-1*bm.bmWidth 时不但不翻转而且没有显示,why??
...全文
76 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
北漂17载 2004-05-07
  • 打赏
  • 举报
回复
明白了 多谢,结帖
cngdzhang 2004-05-07
  • 打赏
  • 举报
回复
srcHeight = Dst.ScaleY(pic.Height, vbHimetric, vbPixels)
srcWidth = Dst.ScaleX(pic.Width, vbHimetric, vbPixels)

dstHeight = CLng(srcHeight * yRate) '计算目标图象的高
If dstHeight < 0 Then
y = -1 * dstHeight
Else
y = 0
End If
dstWidth = CLng(srcWidth * xRate) //计算目标图象的宽
If dstWidth < 0 Then
x = -1 * dstWidth
Else
x = 0
End If
Call StretchBlt(Dst.hdc, x, y, dstWidth, dstHeight, hDc5, 0, 0, srcWidth, srcHeight, SRCCOPY)


它里面的代码是
If dstHeight < 0 Then //如果dstHeight<0
y = -1 * dstHeight //那么y变成>0的
Else
y = 0
End If

If dstWidth < 0 Then //如果dstWidth < 0
x = -1 * dstWidth //那么x变成>0的
Else
x = 0
End If


在你的程序中

StretchBlt(hdc, 0, 0,rect.right , rect.bottom,
aMemDC, 0, 0,bm.bmWidth,bm.bmHeight,SRCCOPY);

0, 0,bm.bmWidth,bm.bmHeight 是不能变的
因为这是源图像

要变的是
0, 0,rect.right , rect.bottom
对应于
x, y, dstWidth, dstHeight
目标图象

而且当rect.right >=0时,x=0,否则x=-1*rect.right;
同理rect.bottom>=0时,y=0,否则y=-1*rect.bottom;
北漂17载 2004-05-07
  • 打赏
  • 举报
回复
http://www.zjol.com.cn/vbbible/software/program/vb/ccw/htmapi75.htm 在vb里讲这个api的 看一下吧,我没读懂,怎么实现翻转
cngdzhang 2004-05-07
  • 打赏
  • 举报
回复
循环的条件不满足啊

for循环是先判断条件再执行的

例如

int i;

for(i=0;i<-10;i++)
{
}

一开始,i就是0都比-10大的,所以根本不会去循环
北漂17载 2004-05-07
  • 打赏
  • 举报
回复
问题的症结在哪里呢?
cngdzhang 2004-05-07
  • 打赏
  • 举报
回复
我估计是:

它是用一个循环来实现的:

int i.j;


for(i=0;i<width;i++) //width =-1*bm.bmWidth ;
{
for((j=0;j<height;j++)
{
//Draw image
}
}

当width=bm.bmWidth 是正数,执行循环,
width =-1*bm.bmWidth 时 <0 ,不会执行循环的

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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