Windows CDC画图详解:设备环境与DC类应用

5星 · 超过95%的资源 需积分: 50 62 下载量 18 浏览量 更新于2024-07-29 2 收藏 353KB DOC 举报
本文将深入解析Windows中的 CDC (Common Device Context) 画图详解。CDC是Windows图形设备接口 (GDI) 的核心组成部分,它提供了一种设备无关的方式来处理图形绘制,使得开发者能够在不同类型的设备(如屏幕、打印机等)上保持一致的绘图操作。CDC设备环境是一个关键概念,它是一个包含了图形对象(如画笔、笔刷、位图、调色板、剪裁区和路径)及其属性的数据结构,这些对象和属性决定了图形的绘制效果。 在Windows编程中,设备描述表 (device context description table, DC) 是创建、管理和访问设备环境的主要工具。DC是一种抽象的作图环境,它封装了Windows API 中的绘图函数,如线条绘制、图像填充、文本输入等。CPaintDC、CClientDC、CWindowDC 和 CMetaFileDC 是DC的四个常用类别,分别对应于屏幕、客户端窗口、窗口本身和元文件绘制,它们提供了针对不同场景的设备环境。 GDI(Graphics Device Interface)作为底层接口,通过DC将应用程序的绘图请求传递给设备驱动程序。GDI是中间层,它屏蔽了硬件的具体差异,比如打印机和显示器的特性,使开发者无需关注细节,只需专注于逻辑上的绘图操作。设备环境包含了与绘制相关的所有数据,如颜色、字体等,这样应用程序可以通过创建CDC对象来间接操作这些设备相关的资源。 在Microsoft Foundation Classes (MFC) 中,CDC进一步简化了使用过程,它封装了设备环境和GDI的功能,为开发者提供了一套易于使用的接口。通过MFC的CDC,开发者可以直接进行设备无关的图形绘制,无需关心底层的硬件操作,大大提高了开发效率和代码的可维护性。 总结来说,CDC画图是Windows图形编程中的基石,它通过设备环境和GDI实现了设备无关性,使得开发者能够跨平台、高效地进行图形绘制。无论是基础的图形操作还是复杂的界面设计,理解并熟练运用CDC都是至关重要的技能。
2010-10-19 上传
图形学作业:五角星VC++画法 void CHuayuView::OnDraw(CDC* pDC) { CHuayuDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //画五角星 int X0=100,Y0=100,R=80; float a[6][3],b[6][3]; float xr; float pi=3.14; a[1][1] = X0; a[1][2] = Y0 + R; a[2][1] = X0 + R * sin(pi / 2.5); a[2][2]= Y0 + R * cos(pi / 2.5); a[3][1] = R * sin(pi / 5) + X0; a[3][2] = Y0 - R * cos(pi / 5); a[4][1] = -R * sin(pi / 5) + X0; a[4][2] =a[3][2]; a[5][1] = X0 - R * sin(pi / 2.5); a[5][2] = a[2][2]; xr = (a[2][2] - Y0) / cos(pi / 5); b[1][1] = X0 - sin(pi / 5) * xr; b[1][2] = a[2][2]; b[2][1] = X0 + sin(pi / 5) * xr; b[2][2] = b[1][2]; b[3][1] = sin(pi / 2.5) * xr + X0; b[3][2] = -cos(pi / 2.5) * xr + Y0; b[4][1] = X0; b[4][2] = -xr + Y0; b[5][1] = -sin(pi / 2.5) * xr + X0; b[5][2] = b[3][2]; pDC->MoveTo(a[5][1], a[5][2]); int i; for(i=1;iLineTo(b[i][1], b[i][2]); pDC->LineTo(a[i][1], a[i][2]); } pDC->MoveTo(a[1][1], a[1][2]);pDC->LineTo(b[4][1], b[4][2]); pDC->MoveTo(a[2][1], a[2][2]);pDC->LineTo(b[5][1], b[5][2]); pDC->MoveTo(a[3][1], a[3][2]);pDC->LineTo(b[1][1], b[1][2]); pDC->MoveTo(a[4][1], a[4][2]);pDC->LineTo(b[2][1], b[2][2]); pDC->MoveTo(a[5][1], a[5][2]);pDC->LineTo(b[3][1], b[3][2]); int c[5][2]; for(i=0;i<5;i++) {c[i][0]=(a[i+1][1]+b[i+1][1]+X0)/3; c[i][1]=(a[i+1][2]+b[i+1][2]+Y0)/3; } int d[5][2]; for(i=0;iSelectObject(&brush); for(i=0;iExtFloodFill(c[i][0],c[i][1],RGB(0,0,0),FLOODFILLBORDER);//在指定的区域内填充颜色 Sleep(40); } CBrush brush2; brush2.CreateSolidBrush(RGB(222,111,222)); pDC->SelectObject(&brush2); for(i=0;iExtFloodFill(d[i][0],d[i][1],RGB(0,0,0),FLOODFILLBORDER); Sleep(40); } }