技术内幕的第五版好像很难懂,关于GDI图形设备、设备环境什么的、CDC什么的又搞得我一头雾水,谁帮我梳理一下。显示器的尺寸(物理、逻辑尺寸)是个什么鬼概念??谢谢!帮忙了!!!
解决方案 »
- 人民邮电出版社(明日科技)出版的《Visual C++ 管理信息系统完整项目实例剖析》 求下载地址??
- 请问一下BYTE,WORD, DWORD 之间的关系
- 请问大家使用VC开发一个功能比较单一的图像处理软件,一般报酬是多少?
- ADO的记录集为空时是否不能新增记录?
- SQL语言 VC ADO
- 请问如何通过 WININET 执行服务器上的 ASP 程序,并且得到执行结果!(如能解决另有高分相赠)
- 版主和微软件专家或Yang_进来帮忙,有关ADO对有Instead of update型TRIGGER的表进行更新操作时出错的问题。
- 怎样显示指定文件的属性页?
- crazybass(低音的狂想):"PowerQuest ServerMagic "在哪下载??? 可否借用?谢谢。
- 怎样让form.caption中的汉字跑马灯似的正确显示?急急急!
- 急!急!有没有网络远程监控程序!分多多!
- 软星(大宇北京子公司)怎么样?
http://www.csdn.net/expert/topic/926/926574.xml?temp=.3394586
很多问题不复杂,你太急,影响了你的理解力,要轻松的学习,不是一味的死看书
为了在不同的领域使用逻辑坐标,Windows提供了以下8种坐标模式: 分别为MM_TEXT、MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。
我们可以用以下代码: 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轴向上为正。
你懂得C语言用API编程吗?
CDC 本身的坐标包含两个层次的概念:逻辑坐标和设备坐标。我们使用CDC 时都是用逻辑坐标,包括我们画线、圆时,传入的点都是在逻辑坐标上的位置
而设备坐标是指实际的设备上的位置,比如显示器的光栅点的位置,打印机留在纸上的墨点在纸上位置逻辑坐标到设备坐标的转换关系是通过SetMapMode/Set.Org/Set.Ext 五个函数设定的,如果你的保存的坐标是设备的,在使用CDC 前必须调用DPToLP
即使在MM_TEXT 下,逻辑坐标和设备坐标的值也是可能不同的
应该说逻辑坐标是CDC 提供的一种服务,有了逻辑坐标,我们基本上不必考虑设备坐标的存在
按我的体会,使用设备坐标主要为了解决“自画子窗体”问题,如果子窗体的位置是相对固定的,那在计算它在的逻辑坐标才需要DPToLP/LPToDP 的概念