几个概念容易乱,先写下来:
一般来说,客户区左上角的点对应视口原点 (0,0),我理解他们为等同关系.设备区(0,0)点就是视口原点(0,0)点,且不可改变.
窗口座标应用中使用逻辑座标,偶理解为窗口原点就是逻辑原点.等同关系.且可以改变.下面可能用上.(不要理解为整个窗口的左上角那个点)
从理解应用来说,无论SetWindowOrgEx/SetViewportOrgEx都没有改变视口原点.它们只是改变了逻辑与设备座标的映射关系.
大师说了,在真正的意义上,视端口和窗口仅是数学上的概念。是的,只是数学概念,可以随意把逻辑(窗口)原点映射在屏幕的任何地方,当然输出在客户区外我们就看不见了.
1 如果用CreateWindow创建了菜单,视口原点一般在菜单左下方,工具栏上方.
2 如果用Rebar创建菜单,原点在Rebar左上方.
3 如果用SDI,MDI,1,2中的结论不成立
4 设备坐标的原点一开始就是窗口原点和视口原点,可用SetWindowOrgEx/SetViewportOrgEx指定新的窗口原点.
5 不管对窗口和视端口原点作什么改变,设备点(0,0)始终是显示区域的左上角。
6 精准定位相关函数:SetWindowPos/GetWindowRect/GetClientRect/DeferWindowPos/
BeginDeferWindowPos /EndDeferWindowPos/MoveWindow/ScreenToClient/DpToLp
SetViewportOrgEx是把新的设备点(x,y)映射为逻辑原点(0,0).但设备点(0,0)还是客户区左上角.
SetWindowOrgEx很有迷惑性,并不是视口原点移动到逻辑座标(x,y)处,而是表示此逻辑座标对应视口原点(0,0)
掌握一点,逻辑座标和设备座标最终都要在显示器上用像素定位.这就是说只有设备座标可以决定定位.在上面所说的一切地方,设备原点是不变的,都是客户区左上角.而逻辑原点可以对应任一设备座标,所以可以通过逻辑座标原点的改变影响输出.
End.