怎么获取一个控件的逻辑坐标

Zxy0918520 2020-05-08 02:25:17
我有一个窗体带滚动条的如图
有一个控件表格在窗体2 里面,窗体二有滚动条。可以上下拖动,这个控件类的名字叫Grid我可以通过

auto s=CRect();
Grid->GetWindowRect(&s);
Grid->GetParent()->ScreeToClient(&s)
pDC->DPtoLp(&s);

得到他在屏幕上的坐标,但是问题来了。。。他在窗体二的逻辑坐标 怎么得出来, 特别是当我通过4或者5拉动改变窗体2的大小,这个对象S的是该表的,不过这样子不对啊。我里面的控件的相对于父窗口的逻辑坐标位置没变啊 只是改变了窗体的大小,我里面控件的位置没变啊,如果 在用Grid->GetWindowRect(&s);这个得出来的坐标就跟没改变窗口大小的时候不一样了,确实也应该不一样,不过我控件相对于父窗口没改变位置啊。
...全文
212 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zxy0918520 2020-05-13
  • 打赏
  • 举报
回复
引用 7 楼 tiger波波 的回复:
你用绝对坐标的话坐标值肯定变了吧,你应该使用相对坐标,比如控件的x在父窗口宽度的1/3位置,控件的宽度是父窗口宽度的1/2等等,每次父窗口大小变化后,你重新获取一下父窗口的宽度、高度,再移动控件就行了
老哥看一下楼上。。这个我没有改变窗口2的大小,只是拖一个用pdc画了一个原,那个左侧导航栏的表格图就变了。。。
Zxy0918520 2020-05-13
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
是否对参数的意思理解有误? pDC->StretchBlt( 0, 0, //目标DC的起始位置x,y dstWidth, dstHeight, //目标DC的大小cx,cy pSrcDC, //源DC 0, 0, //源DC起始位置 srcWidth, srcHeight, //源DC大小 cx,cy SRCCOPY);
参数确实弄错了。。。 本来代码是

auto sourcePos=CRect();
Grid->GetWindowRect(&sourcePos);
Grid->GetParent()->ScreeToClient(&sourcePos)
auto griddevicerect=CRect();
Grid->Grid->GetWindowRect(&griddevicerect);
pDC->DPtoLp(&s);
pDC->StretchBlt(0,0,
			sourcePos.Width(),sourcePos.Height() ,
			pGrid->GetWindowDC(),
			0, 0,
			griddevicerect.Width(), griddevicerect.Height(),
			SRCCOPY);
这个样子
引用 6 楼 zgl7903 的回复:
是否对参数的意思理解有误? pDC->StretchBlt( 0, 0, //目标DC的起始位置x,y dstWidth, dstHeight, //目标DC的大小cx,cy pSrcDC, //源DC 0, 0, //源DC起始位置 srcWidth, srcHeight, //源DC大小 cx,cy SRCCOPY);
版主大大說的對。。但我真的不知道怎么调这个坐标。。。调了好长时间了 快崩溃了。 改了一下代码:

//代码1
auto sourcePos=CRect();
Grid->GetWindowRect(&sourcePos);//这个应该是所在整个窗口的坐标
auto griddevice=sourcePos;
Grid->GetParent()->ScreeToClient(&sourcePos)//然后把这个坐标转换成窗口2的坐标
pDC->DPtoLp(&sourcePos);然后再次转换成在窗口2 所在的逻辑坐标


pDC->StretchBlt(sourcePos.left,sourcePos.top,
sourcePos.width(),sourcePos.Height(),
0,0,griddevice.width(),griddevice.Height();
 SRCCOPY);

以上代码可以完美的这个缩略图显示在我的控件下方, 不过就是改变窗口的时候导航栏看到的缩略图不一样,还有我今天发现我的另一个问题是,如果我在父窗口二上面在拖一个用pDC画好的椭圆,并且改变的椭圆的位置,我那个表格控件在导航栏的大小还是会发生变化。看下面两个图 这个样到底怎么回事呢。。。
tiger波波 2020-05-12
  • 打赏
  • 举报
回复
你用绝对坐标的话坐标值肯定变了吧,你应该使用相对坐标,比如控件的x在父窗口宽度的1/3位置,控件的宽度是父窗口宽度的1/2等等,每次父窗口大小变化后,你重新获取一下父窗口的宽度、高度,再移动控件就行了
zgl7903 2020-05-09
  • 打赏
  • 举报
回复
是否对参数的意思理解有误? pDC->StretchBlt( 0, 0, //目标DC的起始位置x,y dstWidth, dstHeight, //目标DC的大小cx,cy pSrcDC, //源DC 0, 0, //源DC起始位置 srcWidth, srcHeight, //源DC大小 cx,cy SRCCOPY);
Zxy0918520 2020-05-08
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
auto s=CRect(); Grid->GetWindowRect(&s); Grid->GetParent()->ScreeToClient(&s); //这里已经是控件在其父窗口中的客户区坐标
这个让我很费解 我坐标设的就是那个控件在窗体的坐标啊

pDC->StretchBlt(sourcePos.left, sourcePos.top,
			(sourcePos.Width()), (sourcePos.Height()),
			Grid->GetWindowDC(),
			0, 0,
			griddevicerect.Width(), griddevicerect.Height(),
			SRCCOPY);//Grid 是那个控件类,GetWindowDC 换成GetDC()也一样
只有将窗口2拖动到某个位置的时候才能正确显示 ,想不通 拜托大佬 给点提示
Zxy0918520 2020-05-08
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
auto s=CRect(); Grid->GetWindowRect(&s); Grid->GetParent()->ScreeToClient(&s); //这里已经是控件在其父窗口中的客户区坐标
后来我想想确实也是。。。不过我在4 那里拖动改变窗口1和2大小的时候,窗口1中的缩略图,可以看到窗口2 中的东西 只有拖动到某个位置的时候才能正确的看到这个表格缩略图,如果窗口1比较小的时候。那个缩略图 直接显示别的东西 您看下,下面两个图
zgl7903 2020-05-08
  • 打赏
  • 举报
回复
auto s=CRect(); Grid->GetWindowRect(&s); Grid->GetParent()->ScreeToClient(&s); //这里已经是控件在其父窗口中的客户区坐标
Zxy0918520 2020-05-08
  • 打赏
  • 举报
回复
引用 1 楼 hurryboylqs 的回复:
x坐标减去水平滚动条的pos
您好,请问一下水平滚动条是指我窗体2的吗,,,还是只我窗体二父窗口的水平滚动条,可是我窗口二的父窗口没有滚动条啊 只是拖拉两个窗体1和二的边界大小
hurryboylqs 2020-05-08
  • 打赏
  • 举报
回复
x坐标减去水平滚动条的pos

15,979

社区成员

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

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