客户坐标和屏幕坐标的问题

pcitman 2003-06-20 09:38:48
下面的这段代码,按理说IDC_STATIC_S1窗口(为一FRAME控件)是不会移动的。
但运行后却往下移了,为什么?
我原本是想用另外一个FRAME做参照,将它移动到指定位置中,发现不行,于是试一下一面的代码让它在原地不移动,结果还是不行,不知道问题出现在哪里?
将 ScreenToClient(&myRect);这句去掉,或这改成ClientToScreen同样不行。

CRect myRect;
CWnd* pWnd;
pWnd=(CWnd*)GetDlgItem(IDC_STATIC_S1);
pWnd->GetWindowRect(&myRect);
ScreenToClient(&myRect);
pWnd->SetWindowPos(&wndTop,myRect.left,myRect.top,myRect.Width(),myRect.Height(),SWP_SHOWWINDOW);
...全文
453 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dz_w 2003-06-26
  • 打赏
  • 举报
回复
应该是对工具条使用RepositionBars时形成的影响。
athena521 2003-06-26
  • 打赏
  • 举报
回复
up
xiaohedou 2003-06-26
  • 打赏
  • 举报
回复
up
学习
syl08341 2003-06-23
  • 打赏
  • 举报
回复
up
pcitman 2003-06-23
  • 打赏
  • 举报
回复
MoveWindow也不行,我开始就是用MoveWindow的,发觉不行了就改为SetWindowPos,结果还是不行。
我用的是formview视图,在frmmain框架中响应菜单信息
而将工具条取消后则基本不动(动了大约3-5个象素单位)。
at_yuan2 2003-06-23
  • 打赏
  • 举报
回复
为什么不用MoveWindow呢

CRect myRect;
CWnd* pWnd;
pWnd=(CWnd*)GetDlgItem(IDC_STATIC_S1);
pWnd->GetWindowRect(&myRect);
ScreenToClient(&myRect);
pWnd->MoveWindow(&myRect,TRUE);

一定不会动的
pcitman 2003-06-23
  • 打赏
  • 举报
回复
???????????
pcitman 2003-06-20
  • 打赏
  • 举报
回复
楼上说的我都知道
只是我在FormView视图中要把特定的控件移到特定的位置,而这特定的位置由设计时拖一个FRAME控件来指定。
guoxiny 2003-06-20
  • 打赏
  • 举报
回复
视图的缩放的完整论述

关键字:坐标系统、CScrollView、视图缩放、窗口、视口
Visual C++6.0开发图形数据支持系统,其中的难点正在于理解坐标系统的含义、各
种映射模式的意义以及与逻辑坐标的转换。下面分几个部分逐一进行论述:

一 坐标系统概述
众所周知,VC中的坐标系统分为逻辑坐标和设备坐标,逻辑坐标就是内存中虚拟
的坐标,我们可以理解为看不见的,而设备坐标就是跟具体的设备相联系的坐标系统,
如:显示器和打印机等。不同的映射模式决定了设备坐标和逻辑坐标之间的转换关系,
也就是两种坐标系统在相互转换时,逻辑单位和设备单位之间的某种比例关系。这里
需要说明的是:Windows中,只有对需要设备环境句柄作参数的GDI函数,映射方式才
会起作用。对于视口和窗口的概念比较的容易混淆,其实窗口和视口是与映射模式相
关联的:映射方式就是用于从"窗口"(逻辑坐标)到"视口"(设备坐标)的映射。"视
口"是基于设备坐标的,通常,视口与客户区相同;"窗口"是基于逻辑坐标的,逻辑坐
标可以是像素、毫米、英寸等。下面的公式是将窗口(逻辑)坐标转化为视口(设备
)坐标:

xViewport = (xWindow - xWinOrg)*xViewExt/xWinExt + xViewOrg
yViewport = (yWindow - yWinOrg)*yViewExt/yWinExt + yViewOrg
(xWindow,yWindow)是待转换的逻辑点,
(xViewport,yViewport)是转换后的设备坐标。
设备坐标的视口原点(xViewOrg,yViewOrg)和逻辑坐标的窗口原点
(xWinOrg,yWinOrg)默认情况下均被设置成(0,0),但具体情况下可以改变;
(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗
口范围,在多数映射方式下,范围是映射方式所隐含的,不能改变。注意:每个范围
自身没有什么意义,但是视口范围和窗口范围的比是逻辑单位转换为设备单位的换算
因子。例如,对于MM_LOENGLISH模式,xViewExt/xWinExt 表示每0.01英寸(一个逻辑
单位)中水平像素数。

二 映射模式及视图缩放
对于标准的映射模式,这里不作讨论,下面重点的说明
MM_ISOTROPIC和MM_ANISOTROPIC两种映射模式,这两种模式用户可以控制逻辑单位和
像素之间的比例。两种方式的概念上的差异在于各向同性和各向异性,也就是坐标的
建立是否可以定义不同的方向和单位长度。下面举一个视图缩放的例子来具体说明。
 
Void CMyView::OnPrepareDC()
{
CView::OnPrepareDC(pDC,pInfo);
CDC* pDC;
pDC->SetMapMode(MM_ANISOTROPIC);

int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
pDC->SetWindowExt(100,100);
pDC->SetViewportExt(xLogPixPerInch, yLogPixPerInch);
}

我们说过视口的幅度通常是屏幕客户区域的大小,而在上面的代码里我们并没有
这样做。这样做可以吗?其实,在MM_TEXT的映射模式下,缺省的窗口范围和视口范
围均为(1,1),从中可见,我们要设置的只是xViewExt/xWinExt的比值来决定显示
比例的大小,而与xViewExt(视口范围)和xWinExt(窗口范围)的关系不大。
GetDeviceCaps(LOGPIXELSX)和GetDeviceCaps(LOGPIXELSY)代表每逻辑英寸对应的水
平像素点数;xLogPicPerInch/100代表每0.01逻辑单位对应的水平像素数目;那么
100是什么意思呢?这就对应着每逻辑英寸对应的逻辑单位数目,也就是每逻辑单位
对应于0.01逻辑英寸,有人会问,这不正是MM_LOENGLISH 方式吗?那么我们作做这
样一个测试(见Demo),在OnDraw()中分别设置两种映射模式,看看到底有什么不同。
 
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->SetMapMode(MM_ANISOTROPIC);
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
pDC->SetWindowExt(100,100);
pDC->SetViewportExt(xLogPixPerInch, yLogPixPerInch);
pDC->Rectangle(100,100,200,200); //矩形的长度和宽度正好对应于一个逻辑英寸

pDC->SetMapMode(MM_LOENGLISH);
pDC->Rectangle(100,-100,200,-200); //矩形的长度和宽度正好对应于一个实际英寸
}

我们从结果中可以看出,显示在屏幕上时,两个正方形并不能重合,而在打印
预览中可以重合。这是什么原因呢?前面我们说过,就是对应于MM_ANISOTROPIC映射
方式下,100的含义是"每逻辑单位对应于0.01逻辑英寸",而在MM_LOENGLISH映射模式
下,每逻辑单位对应的是0.01实际英寸,逻辑英寸要比实际英寸大一些,注意,这仅
仅是对于显示器来说,有逻辑英寸和实际英寸的区别,在对于打印机而言,没有区别!
设置窗口不同的窗口幅度和视口幅度的比值就可以轻松实现缩放。
最后,用一个公式来说明以上论述的内容:

GetDeviceCaps(LOGPIXELSX) xViewExt
------------------------- * ----------
100 xWinExt

= 每逻辑单位对应的像素数目
= 每0.01逻辑英寸中水平像素的数目

各参数的意义:
GetDeviceCaps(LOGPIXELSX): 每逻辑英寸对应的水平像素点数
100: 每逻辑英寸对应的逻辑单位数
xViewExt: 视口范围
xWinExt: 窗口范围
unrise 2003-06-20
  • 打赏
  • 举报
回复
帮你up...
pcitman 2003-06-20
  • 打赏
  • 举报
回复
up

16,550

社区成员

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

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

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