请问以下几句分别是做了什么操作?并且说说坐标原点的变化
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
第2句我知道是将显示区的高和宽分成32767个段的Y和X.(这是逻辑上的)
一开始原点在左上角,其他的就有点不明白了
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
第2句我知道是将显示区的高和宽分成32767个段的Y和X.(这是逻辑上的)
一开始原点在左上角,其他的就有点不明白了
解决方案 »
- ATL 响应菜单的函数是怎么映射进去的
- 小弟在往工程中加入两个类,进行编绎时,出现了奇怪的情况?还请高手赐教...
- directshow 的分离器(splitter)与解复用器(demultiplexer)有什么区别?
- 新手出道,请问计算机3D图形设计一般是用什么软件或者软件包呢?
- 关于wm_char的问题
- 怎么把输出到打印机的位图转为数据?
- 请问:怎样执行一个DOS命令?
- CIPAddressCtrl的地址怎么转化为char *以便于sendto利用,100分阿
- 请问:用vc中做数据库都有那些控件啊?
- 求流媒体协议相关资料
- 要如何打记录集使其可写。。
- 新手问题:用VC实现1个按钮变色,如何实现?
------------------------------
视口向右最大是cxClient,向下到底部是-cyClient,(也就是说向下为负,向上为正)
SetViewportOrgEx (hdc, 0, cyClient, NULL) ; ---------------------------------------------
将视口的(0,cyClient)点设为原点(左上角),视口原点上移了cyClient,原来的原点在窗口中的位置也就下移了 32767(注意不是cyClient),也就是原来的视口原点在窗口的左下角了
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
理解为逻辑坐标系长宽(276,72)对应屏幕坐标长宽(cxClient, cyClient).SetWindowOrgEx (hdc, 138, 36, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
逻辑坐标系点(138,36)即逻辑中点,对应屏幕坐标(cxClient / 2, cyClient / 2)即屏幕中点.那么
OffsetWindowOrgEx (hdc, -12, 0, NULL) ;
是什么意思?
------------------------------------
在当前的坐标原点为的基础上再向上(根据上面码,向上为负)移12,
相当于SetViewportOrgEx(hdc,cxClient/2 -12,cyClient /2,NULL)
SetWindowExtEx(hdc, 276, 72, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
SetWindowOrgEx (hdc, 138, 36, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
调用这几个函数之后逻辑原点和屏幕原点分别在什么位置?坐标轴是什么样子?
---------------------
回上面。
逻辑原点和窗口原点都在窗口中央,向上为负,向下为正,左为负右为正(假设cxClient,cyClient 都为正)
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;
那么逻辑原点和窗口原点分别在哪呢?
在每次呼叫OffsetWindowOrgEx后,将窗口原点向右移动42个单位。
真的搞不明白....
SetWindowExtEx(hdc, 276, 72, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
SetWindowOrgEx (hdc, 138,36, NULL);
SetViewportOrgEx (hdc, cxClient /2, cyClient/2,NULL);
-----------------------------------------------
这个应该设备坐标原点在窗口左上角。(相对没有变化)
回7楼
设备坐标原点在窗口右下角。回8楼
这要根据你的逻辑分辨率来算
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
后窗口原点和视口原点是怎么变化的?
是不是窗口原点到了显示区中间,视口原点没变化?SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;
--------------------------------------------
视口原点在窗口中央,窗口原点没变,但相对于视口原点向左上移了cxClient/2,cyClient/2(窗口原点在视口的坐标)SetWindowOrgEx(hdc,-cxClient/ 2, -cyClient/2, NULL);
再把窗口原点的坐标向左上移cxClient/2,cyClient/2,相对地,视口原点在窗口的右下角
如果想将逻辑点(0,0)定义为显示区域的中心,可进行如下呼叫:
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
逻辑点(0,0)将映像为设备点(cxClient/2,cyClient/2).改变位置的不是逻辑点(0,0)吗?从原来的左上角到了中间不是吗?
--------------------------------------
如果想将逻辑点(0,0)定义为显示区域的中心,可进行如下呼叫:
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
--------------------------------------------------
这是将视口原点移到了备坐标的cxClient/2,cyClient/2, ,而窗口原点对应于设备坐标的位置没有变;
相对地,
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
与
SetViewportOrgEx(hdc,-cxClient/2,-cyClient/2,NULL); //假设逻辑分辨率也是像素
在视觉上是同样的效果-----------------------------
希望我的解释不致使LZ更迷惑,LZ要分清逻辑坐标与窗口的关系,设备坐标与视口的关系,视口与窗口的关系。
好像windows程序设计上有详细解释
以这个为例子:
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);
-------------------------
一个事物是否在运动或者是否改变了位置需要一个参照物(即一个假设为不变不动的物体).
SetViewportOrgEx和SetWindowOrgEx调用的时候都以设备原点为参照物,所以假设设备原点是不会改变(在窗口的左上角为设备点(0,0))
SetViewportOrgEx函数作用:引用书上的话,"逻辑点(0.0)映像为设备点xViewOrg,yViewOrg)".
即当单独调用 SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); 时([cxClient/2,cyClient/2]是设备坐标),按照设备原点在左上角不变的原则,点(cxClient/2,cyClient/2)则在窗口中间.所以逻辑原点(0,0)就在窗口的中间.
SetWindowOrgEx函数作用:引用书上的话,"逻辑点(xWinOrg,yWinOrg)映像为设备点(0,0)".
即当单独调用SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);时([-cxClient/2,-cyClient/2]是逻辑坐标),同样按照设备原点在左上角不变的原则,逻辑点(-cxClient/2,-cyClient/2)即窗口的左上角,因此逻辑点(0,0)在窗口的中间位置.如果同时使用SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL); 的时候,调用完SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL); 后设备原点已经改变(上面所说的设备原点不会改变是正在调用函数的时候,当调用完函数的时候设备原点就会随参数改变).即现在的设备原点(0,0)是原来的设备原点(cxClient/2,cyClient/2)的位置(即窗口的中间).因此调用SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);后按照设备原点在窗口中间,因此逻辑点(-cxClient/2,-cyClient/2)是窗口中间,即逻辑原点(0,0)在窗口的右下角.我这样的理解应该没错吧?有错请指出.