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)才可理解
怎样才能透彻理解这两个概念,我被搞糊涂了!

解决方案 »

  1.   

    视口就是客户区,窗口是逻辑上的一块没有边界的画布;视口可看作一个取景框,SetViewportOrg/SetWindowOrg的结果都是改变取景框与画布的相对位置,
    SetViewportOrgEx(hdc,10,10,NULL);的效果是让画布的(0, 0)与取景框的(10, 10)点重合,
    如果你之后调用SetPixelV(hdc, 0, 0, 0),会看到在客户区的(10, 10)处有一个点
    视口原点与设备点(0,0)没区别至于那些数学公式不记也罢,对编程没有帮助,徒增混淆
      

  2.   

    视口原点是(0,0)
    客户区左上角是(0,0),但是它的逻辑坐标是(10,10)
    视口原点与设备点(0,0)是同一个概念
    xViewport=(xWindow-xWinOrg)*xViewExt/xWinExt+xViewOrg
    这个应该不难理解的啊
    公式变形一下就是(xViewport-xViewOrg)/(xWindow-xWinOrg)=xViewExt/xWinExt
      

  3.   

    SetViewportOrgEx(hdc,10,10,NULL);  这个函数的作用不是设置视口原点的坐标吗?
    怎么设置完了,视口原点的坐标还是(0,0)?
      

  4.   

    可是SetViewportOrgEx(hdc,10,10,NULL);  中的10是设备坐标参数呀!视口原点改变后,某一点的设备坐标改变吗?
    逻辑坐标改变吗?
    视口原点坐标是指屏幕左上角的坐标吗?
    若是,那么是(0,0)?那么视口原点不就不变了吗?
      

  5.   

    不好意思,我得理解错了
    应该SetViewportOrgEx(hdc,10,10,NULL);把设备点(10,10)设为逻辑原点
    应该说设备的原点肯定是窗口左上角把
    变的只是逻辑原点在视口中的设备坐标把
    那些跟dc有关的函数的坐标用的都是逻辑坐标
      

  6.   

    TEXT映射模式下
    运行SetViewportOrgEx(hdc,10,10,NULL);后
    视口原点坐标为多少,某一点的设备坐标改变吗?
    设备坐标原点呢?
    既然是“原点”,那坐标就应该是(0,0)嘛
    我这个观点哪里出了问题? 
      

  7.   

    誰能幫我分析一下下面四行語句的含義及執行的效果﹐SetMapMode( hdc, MM_ISOTROPIC );
    SetWindowExtEx( hdc, 32767, 32767, NULL );
    SetViewportExtEx( hdc, cxClient, -cyClient, NULL ); //這里為什么是-cyClient
                                                        //而不是cyClient?
    SetViewportOrgEx( hdc, 0, cyClient, NULL );         //既然上面是-cyClient而這里為何
                                                       //又是cyClient?
      

  8.   

    是不是应该这样理解呢:由于存在视口和窗口
    在视口中的坐标系始终就是MM_TEXT下的坐标系
    而窗口中的坐标系可以通过SetMapMode()改变y轴的方向
    在执行这句时SetWindowExtEx( hdc, 32767, 32767, NULL );
    逻辑原点和物理原点时重合的,所以这个逻辑矩形也就是在屏幕的上方了
    而视口坐标系y轴是向下的,所以在屏幕上方的区域的y值就是负的了
    SetViewportExtEx( hdc, cxClient, -cyClient, NULL );所以就用这句来对应了
    SetViewportOrgEx( hdc, 0, cyClient, NULL ); 这句就是把原来在屏幕上方的区域移下来
      

  9.   

    TO:小黃魚
    //逻辑原点和物理原点时重合的,所以这个逻辑矩形也就是在屏幕的上方了
                 ^^^^^^^^^^^^
           重合在哪里?在左上角嗎?SetWindowExtEx( hdc, 32767, 32767, NULL );
    這兩個32767是以哪里為起始點﹐哪里為終點的?SetViewportExtEx( hdc, cxClient, -cyClient, NULL );
    cxClient與-cyClient分別是以哪里為起點和終點的?
    既然只是表示一個范圍(長度或寬度)﹐為何又有正負之分呢?
      

  10.   

    在每中映射方式中Viewport與Window的坐標的方向是不是一樣的?要么都向左﹐要么都向下。
      

  11.   

    //逻辑原点和物理原点时重合的,所以这个逻辑矩形也就是在屏幕的上方了
                 ^^^^^^^^^^^^
           重合在哪里?在左上角嗎?
    我觉得是。
    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 );这个了
      

  12.   

    CWnd *pWnd = GetDlgItem(IDC_UR_BUTTON);
    CRect rect;
    如果返回相对屏幕的坐标,那么:
    pWnd->GetWindowRect(&rect);如果返回相对对话框的左边那么:
    pWnd->GetWindowRect(&rect);
    ScreenToClient(&rect);如果返回本身的尺寸大小
    pWnd->GetClientRect(&rect); //此时rect.left, rect.top 都是0
      

  13.   

    我想視口坐標的方向是不變的﹐但為何又有SetViewportOrgEx( hdc, cxClient / 2, cyClient / 2, NULL );這說明視口坐標的原點和范圍還是可變的吧?btw:謝謝小黃魚的熱情解答﹐我是一個beginner﹐不知現在還有不有人在做SDK的實際開發?
      

  14.   

    视口就是你看到的
    窗口是一个逻辑存在的、你可以在上面画东西的、虚拟的Window,视口是你看到的窗口的一部分
      

  15.   

    那是因为默认情况下逻辑坐标系为MM_TEXT,在这个情况下它的y向下是正的
    所以SetViewportOrgEx( hdc, cxClient / 2, cyClient / 2, NULL );
    我还是认为视口原点是不变的
    而且上面的语句只是改变逻辑原点为物理坐标表示的点(cxClient / 2, cyClient / 2)
    btw:我也是一个beginner,我想直接用sdk开发的人很少了,但是学这个以后,我想对于学vc还是挺有用的
      

  16.   

    哪這樣說來SetWindowOrgEx()與SetViewportOrgEx()是用不同的方式來達到同一種效果嘍?
      

  17.   

    請問如何得到當前窗口的大小?(以像素﹑mm﹑英寸為單位均可)。-->這個我自已來答﹐一時搞忘記了﹕
    HIWORD( lParam );
    LOWORD( lParam );
      

  18.   

    比如說﹕
    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;
      

  19.   


    dim strcomputer as string 
        strcomputer  = "Canfarserver"
    NetResource netres(NetResource 是结构体)
    问题是如何获得
     1:strcomputer 的long 指针
     2:netres的地址(long指针)
     高分请教!
      

  20.   

    請小魚兒一下﹕
    SetViewportOrgEx( hdc, cxClient / 2, cyClient / 2, NULL );
    SetWindowOrgEx( hdc, -cxClient / 2, -cyClient / 2, NULL );連續執行以上兩條語句后的效果﹗
      

  21.   

    说实话,这个我确实也没弄清楚,我只是强记了programming windows上的话
    就是把物理点(cxClient / 2, cyClient / 2)映射到逻辑视图的(-cxClient / 2, -cyClient / 2)
    至于为什么会这样我真的没想通
    哈哈,可见我也是刚起步的把
      

  22.   

    可否請老大幫忙看看我這個貼子?
    http://expert.csdn.net/Expert/topic/2598/2598534.xml?temp=.2378199
      

  23.   

    我忘記從數學意義上來講原點到底是否等價于(0,0)?
    如果等價﹐則
    在<<Windows Programming>>(5/e)第164頁有一句原話﹕不管對窗口和視口原點做什么改變﹐設備點(0,0)始終是客戶區的左上角。可能先把這個搞清楚再來理解下面這句話好一點:
    "就是把物理点(cxClient / 2, cyClient / 2)映射到逻辑视图的(-cxClient / 2, -cyClient / 2)"
      

  24.   

    如果将视埠原点改变为(xViewOrg,yViewOrg),则逻辑点(0.0)就会映射为装置点(xViewOrg,yViewOrg)。如果将视窗原点改变为(xWinOrg,yWinOrg),则逻辑点(xWinOrg,yWinOrg)将会映射为装置点(0,0),即左上角。不管对视窗和视埠原点作什么改变,装置点(0,0)始终是显示区域的左上角。
    这段话可以这样理解把:
    SetViewportOrgEx (hdc, xViewOrg, yViewOrg, NULL) ;这句就意味着把逻辑点(0.0)就会映射为装置点(xViewOrg,yViewOrg)
    SetWindowOrgEx (hdc, xWinOrg,yWinOrg, NULL) ;这句表示则逻辑点(xWinOrg,yWinOrg)将会映射为装置点(0,0),即左上角
      

  25.   

    TO:小黃魚
    可否請你幫忙看看我這個貼子?
    http://expert.csdn.net/Expert/topic/2598/2598534.xml?temp=.2378199
      

  26.   


    ----------------------------------------------------------------
    原贴内容:
    你说的那个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),这点是不变
      

  27.   

    我仍然坚持:
    你说的那个original point是指物理的还是逻辑的,还是2者?如果只是逻辑的我赞同,我指的是物理的原点可以映射为多个逻辑坐标,但是在物理坐标系中它的原点始终是窗口左上角,即(0,0),这是我的意见
    你呢?wangyangcheng(矛盾)