VC++ GDI绘图基础:文本对齐与设备环境

需积分: 10 2 下载量 131 浏览量 更新于2024-07-14 收藏 941KB PPT 举报
"VC++绘图基础 - nFlags参数详解及GDI绘图概念" 在VC++编程中,绘图是创建用户界面和图形应用程序的重要部分。GDI(Graphics Device Interface)是Windows操作系统提供的一个核心组件,它允许程序员通过一系列API函数来绘制图形、文本和图像,而不必直接操作硬件。GDI提供了设备无关性,这意味着代码可以在任何支持Windows的设备上运行,而无需针对特定硬件进行修改。 GDI中的文本对齐方式由nFlags参数控制,这个参数在绘制文本时用于设定文本在X轴和Y轴上的对齐方式。nFlags可以是以下几种组合: 1. X轴对齐方式: - `TA_CENTER`:使文本的中心点与外接矩形的中点对齐。 - `TA_LEFT`:这是默认设置,使文本的左边缘与外接矩形的左边缘对齐。 - `TA_RIGHT`:使文本的右边缘与外接矩形的右边缘对齐。 2. Y轴对齐方式: - `TA_BASELINE`:使文本的基线与选定字体的基线对齐。 - `TA_BOTTOM`:使文本的下边缘与外接矩形的底边对齐。 - `TA_TOP`:使文本的上边缘与外接矩形的上边对齐。 3. 更新当前位置标志: - `TA_NOUPDATECP`:默认设置,每次调用文本输出函数后不更新当前位置。 - `TA_UPDATECP`:每次调用后更新当前位置,新的位置在外接矩形的右边。如果设置了这个标志,TextOutW函数指定的坐标将被忽略。 除了nFlags,VC++绘图还涉及到其他重要的概念: - 设备环境(Device Context, DC):是GDI中的一个关键概念,它代表了屏幕、打印机或内存中的一个绘图区域。DC包含了关于设备的详细信息,如分辨率、颜色深度等,并提供了绘图操作的接口。 - 画笔(Pen):用于定义线条的颜色、样式和宽度。通过选择合适的画笔,可以改变线条的外观。 - 画刷(Brush):用于填充形状内部的颜色。可以选择不同类型的画刷,如实心、图案或渐变填充。 - 字体(Font):定义文本的样式,包括大小、字形、粗细等属性。选择不同的字体可以改变文本的显示效果。 - 绘图模式(Drawing Mode):决定如何混合颜色,例如正常绘图模式或透明模式。 在MFC框架中,这些GDI概念被封装在类中,如CDC(Device Context Class)用于处理设备环境,CBrush和CPen类分别用于画刷和画笔,CFont类用于管理字体。程序员可以使用这些类的成员函数来进行绘图操作,大大简化了编程过程。 理解nFlags参数以及GDI绘图机制是开发Windows图形应用程序的基础。通过熟练掌握这些知识点,开发者能够创建出丰富多样的图形界面和动态效果。
2023-05-29 上传

VC mfc单文档中代码如下void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); for (int i=0;i<points.size();i++){ br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r); br.DeleteObject(); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default center=point; r=rand()%46+5;//r=5~50 color=RGB(rand()%256,rand()%256,rand()%256); points.push_back(center); SetTimer(1,200,NULL); CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { for(int i=0;i<points.size();i++) { points[i].y-=5; if(points[i].y<-r) { points.erase(points.begin()+i); i--; } } } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1){ RedrawWindow(); rise(); } CView::OnTimer(nIDEvent); },为什么运行结果中后面单击出现的圆的状态会改变前面出现的圆的状态,怎么修改此代码能实现每次单击出现的圆的大小和颜色都不相同,完整步骤及代码

2023-05-29 上传