图形基础(五十八)

2010-12-30 21:10:52 · 作者: · 浏览: 40691
hdc, -cxClient / 2, -cyClient / 2, NULL) ;

SetWindowOrgEx的参数总是使用逻辑单位。在这个呼叫之後,逻辑点(-cxClient / 2,-cyClient / 2)映射为装置点(0,0),即显示区域的左上角。

您不会将这两个函式一起用,除非您知道这么做的结果:

SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;

这意味著逻辑点(-cxClient/2,-cyClient/2)将映射为装置点(cxClient/2, cyClient/2),结果是如下所示的座标系:


 

您可以使用下面两个函式取得目前视埠和视窗的原点:

GetViewportOrgEx (hdc, &pt) ;
GetWindowOrgEx (hdc, &pt) ;

其中pt是POINT结构。由GetViewportOrgEx传回的值是装置座标,而由GetWindowOrgEx传回的值是逻辑座标。

您可能想改变视埠或者视窗的原点,以改变视窗显示区域内的显示输出-例如,回应使用者在卷动列内的输入。但是,改变视埠和视窗原点并不能立即改变显示输出,而必须在改变原点之後更新输出。例如,在第四章的SYSMETS2程式中,我们使用了iVscrollPos值(垂直卷动列的目前位置)来调整显示输出的y座标:

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

for (i = 0 ; i < NUMLINES ; i++)
{
y = cyChar * (i - iVscrollPos) ;
// 显示文字
}
EndPaint (hwnd, &ps) ;
return 0 ;

我们可以使用SetWindowOrgEx获得同样的效果:

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

SetWindowOrgEx (hdc, 0, cyChar * iVscrollPos) ;

for (i = 0 ; i &l