Windows编程中的“视口”和“窗口”的问题,书上说的都不详细,我看不懂(《windows编程》、《MFC核心技术》都看过)
text映射模式下
SetViewportOrgEx(hdc,10,10,NULL);运行后
视口原点还是(0,0)吗?
客户区左上角是(0,0)吗?
视口原点与设备点(0,0)有区别吗?
公式:xViewport=(xWindow-xWinOrg)*xViewExt/xWinExt+xViewOrg
中,为什么是(xWindow-xWinOrg)?
我觉得应是(xWindow+xWinOrg)才可理解
怎样才能透彻理解这两个概念,我被搞糊涂了!
text映射模式下
SetViewportOrgEx(hdc,10,10,NULL);运行后
视口原点还是(0,0)吗?
客户区左上角是(0,0)吗?
视口原点与设备点(0,0)有区别吗?
公式:xViewport=(xWindow-xWinOrg)*xViewExt/xWinExt+xViewOrg
中,为什么是(xWindow-xWinOrg)?
我觉得应是(xWindow+xWinOrg)才可理解
怎样才能透彻理解这两个概念,我被搞糊涂了!
解决方案 »
- 关于子窗口的疑难问题
- VC通过ADO访问Access数据库,使用Order By子句之后Recordset打开失败!
- 如何关闭音频文件
- 请教各位大爷是咋整的呢??
- 问个很菜的问题
- for循环的循环终止条件可以改变吗?
- WebBrowser控件偶尔会出现白色遮挡是怎么回事
- 急,谢,LISTBox 怎样当***鼠标滑动***到Item时调用消息?
- 一个关于cdc 的问题请帮忙
- Ring3到Ring0(vc编写),控制台程序成功,基于对话框WIN32程序就不行了。大侠看看了。
- 请教拷贝文件夹中涉及到的字符串格式问题!在线等……
- 我这样结束一个进程为什么错误,请有心人多多指教,非常感谢(因刚注册分少,请包含)
SetViewportOrgEx(hdc,10,10,NULL);的效果是让画布的(0, 0)与取景框的(10, 10)点重合,
如果你之后调用SetPixelV(hdc, 0, 0, 0),会看到在客户区的(10, 10)处有一个点
视口原点与设备点(0,0)没区别至于那些数学公式不记也罢,对编程没有帮助,徒增混淆
客户区左上角是(0,0),但是它的逻辑坐标是(10,10)
视口原点与设备点(0,0)是同一个概念
xViewport=(xWindow-xWinOrg)*xViewExt/xWinExt+xViewOrg
这个应该不难理解的啊
公式变形一下就是(xViewport-xViewOrg)/(xWindow-xWinOrg)=xViewExt/xWinExt
怎么设置完了,视口原点的坐标还是(0,0)?
逻辑坐标改变吗?
视口原点坐标是指屏幕左上角的坐标吗?
若是,那么是(0,0)?那么视口原点不就不变了吗?
应该SetViewportOrgEx(hdc,10,10,NULL);把设备点(10,10)设为逻辑原点
应该说设备的原点肯定是窗口左上角把
变的只是逻辑原点在视口中的设备坐标把
那些跟dc有关的函数的坐标用的都是逻辑坐标
运行SetViewportOrgEx(hdc,10,10,NULL);后
视口原点坐标为多少,某一点的设备坐标改变吗?
设备坐标原点呢?
既然是“原点”,那坐标就应该是(0,0)嘛
我这个观点哪里出了问题?
SetWindowExtEx( hdc, 32767, 32767, NULL );
SetViewportExtEx( hdc, cxClient, -cyClient, NULL ); //這里為什么是-cyClient
//而不是cyClient?
SetViewportOrgEx( hdc, 0, cyClient, NULL ); //既然上面是-cyClient而這里為何
//又是cyClient?
在视口中的坐标系始终就是MM_TEXT下的坐标系
而窗口中的坐标系可以通过SetMapMode()改变y轴的方向
在执行这句时SetWindowExtEx( hdc, 32767, 32767, NULL );
逻辑原点和物理原点时重合的,所以这个逻辑矩形也就是在屏幕的上方了
而视口坐标系y轴是向下的,所以在屏幕上方的区域的y值就是负的了
SetViewportExtEx( hdc, cxClient, -cyClient, NULL );所以就用这句来对应了
SetViewportOrgEx( hdc, 0, cyClient, NULL ); 这句就是把原来在屏幕上方的区域移下来
//逻辑原点和物理原点时重合的,所以这个逻辑矩形也就是在屏幕的上方了
^^^^^^^^^^^^
重合在哪里?在左上角嗎?SetWindowExtEx( hdc, 32767, 32767, NULL );
這兩個32767是以哪里為起始點﹐哪里為終點的?SetViewportExtEx( hdc, cxClient, -cyClient, NULL );
cxClient與-cyClient分別是以哪里為起點和終點的?
既然只是表示一個范圍(長度或寬度)﹐為何又有正負之分呢?
^^^^^^^^^^^^
重合在哪里?在左上角嗎?
我觉得是。
BOOL SetWindowExtEx(
HDC hdc, // handle to device context
int nXExtent, // new horizontal window extent
int nYExtent, // new vertical window extent
LPSIZE lpSize // original window extent
);
Parameters
.............
[in] Specifies the window's horizontal extent in logical units.
nYExtent
[in] Specifies the window's vertical extent in logical units.
..............
你看指定范围时用的是逻辑坐标,MM_ISOTROPIC 的坐标系是y 向上是正的
而这时这个范围右上角的坐标在视口坐标系中是负的把
所以SetViewportExtEx( hdc, cxClient, -cyClient, NULL );这个了
CRect rect;
如果返回相对屏幕的坐标,那么:
pWnd->GetWindowRect(&rect);如果返回相对对话框的左边那么:
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);如果返回本身的尺寸大小
pWnd->GetClientRect(&rect); //此时rect.left, rect.top 都是0
窗口是一个逻辑存在的、你可以在上面画东西的、虚拟的Window,视口是你看到的窗口的一部分
所以SetViewportOrgEx( hdc, cxClient / 2, cyClient / 2, NULL );
我还是认为视口原点是不变的
而且上面的语句只是改变逻辑原点为物理坐标表示的点(cxClient / 2, cyClient / 2)
btw:我也是一个beginner,我想直接用sdk开发的人很少了,但是学这个以后,我想对于学vc还是挺有用的
HIWORD( lParam );
LOWORD( lParam );
case WM_PAINT:hdc = BeginPaint( hwnd, &ps );SelectObject( hdc, GetStockObject( SYSTEM_FIXED_FONT ) );SetMapMode( hdc, MM_LOMETRIC );SetViewportOrgEx( hdc, cxClient / 2, cyClient / 2, NULL );TextOut( hdc, -( cxClient / 2 / GetDeviceCaps( hdc, LOGPIXELSX ) * 25.4 / 10 ), 0, szHeading, lstrlen( szHeading ) );
szUndLine ) ); //我想在這名將從窗口最左邊輸出szHeading,這樣寫可否?EndPaint( hwnd, &ps );
return 0;
dim strcomputer as string
strcomputer = "Canfarserver"
NetResource netres(NetResource 是结构体)
问题是如何获得
1:strcomputer 的long 指针
2:netres的地址(long指针)
高分请教!
SetViewportOrgEx( hdc, cxClient / 2, cyClient / 2, NULL );
SetWindowOrgEx( hdc, -cxClient / 2, -cyClient / 2, NULL );連續執行以上兩條語句后的效果﹗
就是把物理点(cxClient / 2, cyClient / 2)映射到逻辑视图的(-cxClient / 2, -cyClient / 2)
至于为什么会这样我真的没想通
哈哈,可见我也是刚起步的把
http://expert.csdn.net/Expert/topic/2598/2598534.xml?temp=.2378199
如果等價﹐則
在<<Windows Programming>>(5/e)第164頁有一句原話﹕不管對窗口和視口原點做什么改變﹐設備點(0,0)始終是客戶區的左上角。可能先把這個搞清楚再來理解下面這句話好一點:
"就是把物理点(cxClient / 2, cyClient / 2)映射到逻辑视图的(-cxClient / 2, -cyClient / 2)"
这段话可以这样理解把:
SetViewportOrgEx (hdc, xViewOrg, yViewOrg, NULL) ;这句就意味着把逻辑点(0.0)就会映射为装置点(xViewOrg,yViewOrg)
SetWindowOrgEx (hdc, xWinOrg,yWinOrg, NULL) ;这句表示则逻辑点(xWinOrg,yWinOrg)将会映射为装置点(0,0),即左上角
可否請你幫忙看看我這個貼子?
http://expert.csdn.net/Expert/topic/2598/2598534.xml?temp=.2378199
----------------------------------------------------------------
原贴内容:
你说的那个original point是指物理的还是逻辑的,还是2者?如果只是逻辑的我赞同,我指的是物理的原点可以映射为多个逻辑坐标,但是在物理坐标系中它的原点始终是窗口左上角,即(0,0),这是我的意见
----------------------------------------------------------------
原贴内容:
First,I think the original point can be set to (0,0)﹐but it isn't necessary.
----------------------------------------------------------------
原贴内容:
我觉得这2个函数:SetWindowOrgEx()與SetViewportOrgEx()分别改变的是逻辑原点在物理坐标系中的位置和物理原点在逻辑坐标系中的位置,但是物理原点始终是窗口左上角,即(0,0),这点是不变
你说的那个original point是指物理的还是逻辑的,还是2者?如果只是逻辑的我赞同,我指的是物理的原点可以映射为多个逻辑坐标,但是在物理坐标系中它的原点始终是窗口左上角,即(0,0),这是我的意见
你呢?wangyangcheng(矛盾)