图片拖动后,上面文字出现偏移的问题

sh8023ym 2013-09-04 03:52:32
各位大神,求助啊。
小弟目前遇到一个问题,
需求描述如下:
制作了一个类似地图功能的控件,图片可以放大,缩小,拖动。而且图片上会标有文字,但是图片放大缩小拖动后文字大小不变,文字相对于图片的位置也不变
我的思路是:
先描画出缩小或放大后的图片,然后通过文字在图片上的位置,计算出文字在屏幕上显示的位置,描画再描画出文字
问题是:我将图片放大四倍左右后,再拖动图片,文字的相对于图片的位置会有1像素左右的偏差

代码如下:
CBitmap BkMap;
BkMap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());

CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&BkMap);
//SetStretchBltMode(memDC.m_hDC,HALFTONE);
//此处描画缩小或放大的图片
memDC.StretchBlt(0,0,m_rect.Width(), m_rect.Height(),
&m_memDC, m_bmpLeft, m_bmpTop, m_bmp.bmWidth/m_size, m_bmp.bmHeight/m_size,
SRCCOPY);

//此处计算通过文字在图片上的位置,计算出应该在控件上显示的位置
//m_txtX-文字在图片上的位置
//m_bmpLeft控件左上角显示图片的位置
//m_size图片放大的倍数
//m_Xtimes图片与控件的宽度比
//Y轴相关变量同X轴
CRect TheRect;
TheRect.left = (m_txtX - m_bmpLeft)*float(m_size)/float(m_Xtimes) - 200;
TheRect.top = (m_txtY - m_bmpTop)*float(m_size)/float(m_Ytimes);
TheRect.bottom = TheRect.top + 200;
TheRect.right = TheRect.left + 400;

if (m_size > 1)
{
CFont signFont;
signFont.CreatePointFont(500, L"微软雅黑");

memDC.SetBkMode(TRANSPARENT);
memDC.SelectObject(signFont);
//显示文字
memDC.DrawText(L"test",TheRect,DT_CENTER|DT_EXPANDTABS|DT_NOPREFIX);

signFont.DeleteObject();
}

dc.BitBlt(0,0,m_rect.Width(),m_rect.Height(), &memDC, 0, 0, SRCCOPY);

BkMap.DeleteObject();
memDC.DeleteDC();
this->ReleaseDC(&dc);

请诸位帮一下忙啊
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sh8023ym 2013-09-20
  • 打赏
  • 举报
回复
不好意思 我感觉您的回答并不是我预期的答复,我思考了另一种实现方式。 问题也没有心思去解决了
sh8023ym 2013-09-04
  • 打赏
  • 举报
回复
明白,但是目前问题是纯整数的情况下也会出现那个问题,我已经处理的CRect不会有小数的值了,m_size一直为m_times的整数倍 例如: TheRect.left = (800 - 400)*float(4)/float(1) - 200; ... 时也会出现问题
fishion 2013-09-04
  • 打赏
  • 举报
回复
double浮点型只是用来作计算过程用的,最后还是要转换成整形,只是精度越大,最后得出来的整形正确度就越高,你明白没
sh8023ym 2013-09-04
  • 打赏
  • 举报
回复
引用 2 楼 fishion 的回复:
m_Xtimes也用double来提高一下精度
谢谢您的回复 我用的是GDI不支持浮点型的,然后我debug时发现在四倍的情况下CRect的值一直为整数(无论是否为double) 又观察了一下发现详细现象为: 放大四倍后,文字在控件左半边时会比在控件右半边时,相对于图片的位置向左偏移1个图片像素。
fishion 2013-09-04
  • 打赏
  • 举报
回复
m_Xtimes也用double来提高一下精度
fishion 2013-09-04
  • 打赏
  • 举报
回复
重点就是看看TheRect的值了,可以用double来提高精度

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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