首页 > 编程知识 正文

mfc绘图gpu,mfc基本对话框绘图步骤

时间:2023-05-05 00:52:03 阅读:114441 作者:1012

CDC类定义了设备上下文对象的类。

CDC对象提供了用于处理设备上下文(如显示器和打印机)的成员函数,以及用于处理与窗口客户区域相对应的显示上下文的成员。

在CDC对象的成员函数中进行所有绘制。

类为设备的上下文操作提供成员函数并处理绘制工具。 安全数字接口(GDI )对象收集、颜色和调色板处理。

它还为获取和设置绘图属性、映射、视点操作、放大窗口、变换坐标、操纵区域、剪切、绘制直线、绘制简单椭圆和多边形等形状提供成员函数。

它还为绘制文本、处理字体、使用打印机跳转以及滚动和播放元文件提供成员函数。

如果要使用CDC对象,请生成它,然后调用使用等效设备上下文的Windows函数的成员函数。

MFC中绘图分为三个区域:标准客户区、临时客户区、非客户窗口区。

在窗口中,HDC是绘图的句柄,与HWND相同。 HDC是设备环境专用的绘制手柄。 在MFC中封装在CDC类中。

HDC句柄的绘制有三种方法,分别是标准客户区的绘制、临时客户区的绘制、非客户区的绘制。 因此,CDC类的绘制也分为三种。

标准客户区制图标准客户区制图在WM_PAINT消息回调时执行,调用BeginPain函数获取标准客户区制图句柄进行制图,最后调用EndPaint函数释放制图句柄。 两个函数(CDC类)封装在从CDC类派生的CPointDC类中。 在MFC中,如果要在标准客户站点进行绘制,请使用WM_PAINT消息映射函数创建并绘制CPointDC对象。

临时客户区绘制可以在任何消息回调函数中执行,调用GetDC获取临时客户区绘制句柄进行绘制,最后调用ReleaseDC函数进行释放。 MFC封装在CClientDC类中,该类由CDC类继承。

客户端直流封装了GetDC和ReleaseDC。 因此,如果MFC需要临时绘制,则需要使用CClientDC类对象。

非客户出图。非客户出图(包括非客户出图标题栏)必须在回调WM_NCPAINT消息时执行,调用GetWindowDC函数以获取非客户出图句柄,最后在ReleaseDC中释放。 在MFC中封装在CWindowDC中,该类也由CDC类继承。 以这种方式创建的对象是在整个屏幕上绘制时必需的。

绘图的三大坐标,根据不同的绘图区域有着不同的坐标系系统。在Windows程序开发中常用的三种坐标系是:屏幕坐标系、客户区坐标系、非可会窗口坐标系

1 )屏幕坐标系:

坐标原点位于屏幕法人的左上角,从左向右x的坐标变大,从上到下y的坐标哦。 如果正大屏幕分辨率设置为1024x1768,则屏幕左上角的坐标为(0,0 ),屏幕左下角为1024x1768,使用GetWindonRect获取屏幕坐标

2 )非客户、窗口坐标系

坐标原点位于窗口(包括标题栏)的左上角,xy坐标轴的方向与使用GetClientRect获取窗口的矩形区域相同。

3 )客户区域坐标系

坐标原点位于标题栏下客户区域的左上角,xy方向相同。 例如,BeginPaint函数返回的设备环境基于客户区域坐标系。 此函数通常仅在WM_NCPAIN消息中使用GetDC函数返回的设备环境基于客户区域坐标系。 通常,可以使用GetClientRect函数获取任何消息的是客户区域坐标系,它是基于左上角的坐标系计算的

ng>绘图过程中使用的其他类:

CPen:用于定义一个画笔,设置显示字体或者图形边线的颜色和线条属性。CBrush:用于定义一个笔刷,对于一个封闭的图形填充颜色和属性CFont:定义一个字体类,对要显示的字体进行设置(如加粗,下划线等)CBitmap:定义一个位图对象,用于加载位图资源CRgn:用于绘制一个不规则的区域范围。

 

 

MFC中标准绘图:

void C绘图Dlg::OnPaint(){ CPaintDC dc(this); // 用于绘制的设备上下文 RECT rect; GetClientRect(&rect); //获取客户区的位置 rect.bottom = 30; dc.SetTextColor(RGB(0, 255, 255)); //设置字体 dc.FillSolidRect(&rect, RGB(255, 0, 0)); //将rect所选区域填充成自己想要的颜色 CString str; str = "hiajdskjdsfol"; dc.DrawText(str, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); //向指定的区域写入字体。 dc.MoveTo(40, 40); //画线开始端 dc.LineTo(140, 40);//画线结束端 //CPen p1(PS_SOLID,4,RGB(255,0,0));//画笔,可以是空参数,也可以带入参数,第一个参数是线的种类(实线、虚线),线的宽度,线的颜色 CPen p1;//定义一个画笔,设置画线的属性 LOGPEN  lp = { PS_SOLID, 4 };//设置画笔属性 lp.lopnColor = RGB(255, 0, 0);//设置画笔颜色 p1.CreatePenIndirect(&lp);//创建画笔 dc.SelectObject(&p1);//绘图设备选择画笔。 dc.MoveTo(40, 60); //画线开始端 dc.LineTo(140, 60);//画线结束端 CPen p2(PS_DASHDOT, 1, RGB(0, 255, 0));//注意使用PS_DASHDOT时,线的宽度只能选择为1 dc.SelectObject(&p2); dc.Rectangle(10, 80, 50, 120);//注意,如果不结束画笔的选择,那么此画笔将一直沿用。 CPen p3;//定义一个空画笔 p3.CreatePen(PS_DASHDOTDOT, 1, RGB(0, 0, 255)); //空画笔需要使用。CreatePen创建画笔 dc.SelectObject(&p3); CPoint ps[] = { CPoint(196, 92), CPoint(96, 92), CPoint(196, 192) };//使用Polygon时需要使用定 // 义一个指针数值,将多边形的定点包含高大的萝莉 dc.Polygon(ps, sizeof(ps) / sizeof(ps[0]));//Polygon是一个画多边形的函数,第一个参数是所画图形坐标指正,第二个是定点的个数、 CRect rect1(240, 50, 340, 160);//定义一个方形区域 dc.SelectObject(&p1); CPoint point1(340, 50), point2(440, 160); dc.MoveTo(point1); dc.LineTo(rect1.CenterPoint()); dc.LineTo(point2); dc.Chord(rect1, point1, point2); CPen p4(PS_NULL, 54, RGB(202, 02, 51)); CBrush br(RGB(255, 0, 255)); dc.SelectObject(&br); dc.SelectObject(&p4); dc.Rectangle(140, 170, 240, 230);}

运行结果:

MFC中客户区绘图:

客户区临时绘图,我们使用一个按钮触发绘图实现,当按下按钮之后,软件触发绘图事件。代码如下:

void C绘图Dlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码CClientDC dc(this);RECT rect;GetClientRect(&rect); //获取客户区的位置rect.bottom = 30;dc.SetTextColor(RGB(0, 255, 255)); //设置字体dc.FillSolidRect(&rect, RGB(255, 0, 0)); //将rect所选区域填充成自己想要的颜色CString str;str = "hiajdskjdsfol";dc.DrawText(str, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); //向指定的区域写入字体。dc.MoveTo(40, 40); //画线开始端dc.LineTo(140, 40);//画线结束端//CPen p1(PS_SOLID,4,RGB(255,0,0));//画笔,可以是空参数,也可以带入参数,第一个参数是线的种类(实线、虚线),线的宽度,线的颜色CPen p1;//定义一个画笔,设置画线的属性LOGPEN lp = { PS_SOLID, 4 };//设置画笔属性lp.lopnColor = RGB(255, 0, 0);//设置画笔颜色p1.CreatePenIndirect(&lp);//创建画笔dc.SelectObject(&p1);//绘图设备选择画笔。dc.MoveTo(40, 60); //画线开始端dc.LineTo(140, 60);//画线结束端CPen p4(PS_NULL, 54, RGB(202, 02, 51));CBrush br(RGB(255, 0, 255));dc.SelectObject(&br);dc.SelectObject(&p4);dc.Rectangle(140, 170, 240, 230);}

运行结果:

 

 

MFC中非客户区绘图:

void C绘图Dlg::OnNcPaint(){ // TODO:  在此处添加消息处理程序代码 // 不为绘图消息调用 CDialogEx::OnNcPaint() CWindowDC dc(this);//定义一个非客户绘图设备 RECT rect; GetClientRect(&rect);//获取非客户区大小 dc.FillSolidRect(&rect, RGB(255, 0, 0));//绘制一个背景区域,大小为客户区大小 dc.Ellipse(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);//绘制一个椭圆}

运行结果:注意,标题栏被的左上角被当做初始原点进行绘图

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。