技术内幕的第五版好像很难懂,关于GDI图形设备、设备环境什么的、CDC什么的又搞得我一头雾水,谁帮我梳理一下。显示器的尺寸(物理、逻辑尺寸)是个什么鬼概念??谢谢!帮忙了!!!

解决方案 »

  1.   

    我是老是看书看书,我不知道如何去开始工作,我没有什么项目可做,我也不知道如何去开始工作?看呀看呀,我已经看了2个月了,我都着急了!还是不懂我能不着急么???
    http://www.csdn.net/expert/topic/926/926574.xml?temp=.3394586
      

  2.   

    要画画当然要个工具和画板了,cdc就相当于工具了,里面有什么画笔,画刷,图片之类的,windows不允许直接画在硬件上,所以先画在她提供的什么dc上,它做个转换后,就好了
    很多问题不复杂,你太急,影响了你的理解力,要轻松的学习,不是一味的死看书
      

  3.   

    我想CDC对象就象一堆纸,它决定你要画在那张上面,用什么画,如何画,,比如你是想画在当前窗口上,还是画在整个屏幕上,还是针对某个小客户区画
      

  4.   

    一 设备坐标和逻辑坐标  设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。  逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下:  1. 窗口为非滚动窗口  2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。  在VC中鼠标坐标的坐标位置用设备坐标表示,但所有GDI绘图都用逻  坐标表示,所以用鼠标绘图时,那么必须将设备坐标转换为逻辑坐标,可以使用CDC 函数DptoLP()将设备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。  二 坐标模式
      为了在不同的领域使用逻辑坐标,Windows提供了以下8种坐标模式:  分别为MM_TEXT、MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。
      

  5.   

    三 实例解析  (一) 建立以左上角为原点,X轴和Y轴为1000的坐标,如下图
      我们可以用以下代码:  void CTtView::OnDraw(CDC* pDC)
       {
        CTtDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        CRect rect;
        GetClientRect(&rect);    pDC->SetMapMode(MM_ANISOTROPIC);
        pDC->SetViewportOrg(0,0);
        pDC->SetViewportExt(rect.right,rect.bottom);    pDC->SetWindowOrg(0,0);
        pDC->SetWindowExt(1000,1000);    pDC->MoveTo(50,50);
        pDC->LineTo(50,950);
        pDC->LineTo(950,950);
        pDC->LineTo(50,50);
       }  代码分析:  1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中  2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式  3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点  4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和    pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系  5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同  6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。  7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。  (二) 建立以视窗中心为原点的坐标,如下图
      用如下代码:  void CTtView::OnDraw(CDC* pDC)
       {
        CTtDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        CRect rect;
        GetClientRect(&rect);    pDC->SetMapMode(MM_ANISOTROPIC);
        pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
        pDC->SetViewportExt(rect.right,rect.bottom);    pDC->SetWindowOrg(0,0);
        pDC->SetWindowExt(1000,-1000);    pDC->MoveTo(150,150);
        pDC->LineTo(-150,-200);
        pDC->LineTo(150,-150);
        pDC->LineTo(150,150);
       }  代码分析:  1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。  2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。  3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。
      

  6.   


       你懂得C语言用API编程吗?
      

  7.   

    其实我觉得如果你能静下心来,一定会发现MFC 的CDC 还是相当方便的
    CDC 本身的坐标包含两个层次的概念:逻辑坐标和设备坐标。我们使用CDC 时都是用逻辑坐标,包括我们画线、圆时,传入的点都是在逻辑坐标上的位置
    而设备坐标是指实际的设备上的位置,比如显示器的光栅点的位置,打印机留在纸上的墨点在纸上位置逻辑坐标到设备坐标的转换关系是通过SetMapMode/Set.Org/Set.Ext 五个函数设定的,如果你的保存的坐标是设备的,在使用CDC 前必须调用DPToLP 
    即使在MM_TEXT 下,逻辑坐标和设备坐标的值也是可能不同的
    应该说逻辑坐标是CDC 提供的一种服务,有了逻辑坐标,我们基本上不必考虑设备坐标的存在
    按我的体会,使用设备坐标主要为了解决“自画子窗体”问题,如果子窗体的位置是相对固定的,那在计算它在的逻辑坐标才需要DPToLP/LPToDP 的概念