MFC pictureControl 绘制直角坐标点
2016-10-21 17:21
232 查看
首先说一下什么是DC(设备描述表)
Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制。DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC,并在不继续使用时释放掉。
在c++ 编程中常会见到HDC,CDC,CClientDC,CPaintDC,CWindowDC这样的类
HDC是DC的句柄,API中的一个类似指针的数据类型.
CDC是MFC的DC的一个类
CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.
CDC及其派生类的继承视图:
CObject
public |——CDC
public |——|——CClientDC
public |——|——CPaintDC
public |——|——CWindowDC
public |——|——CMetaFileDC
下面用例子和代码说明怎么使用pictureControl绘制坐标系和坐标点,以及在点附近输出坐标值:
1.先在对话框添加pictureControl,然后为其添加一个CStatic变量m_picDraw;
2.获取pictureControl的区域:
3.获取pictureControl的CDC
4.初始化画刷,用于将背景颜色涂黑
5.创建画笔绘制坐标系
6.在pictureControl绘制点
7.在绘制点的附近绘制点的坐标值
要使用
坐标值绘制:
8.运行得到效果:
![](http://img.blog.csdn.net/20161021171428091)
9.好了,MFC的确很好玩,但是接下来要看算法了,为了毕业,苦逼的研究生苦中作乐啊。
Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制。DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC,并在不继续使用时释放掉。
在c++ 编程中常会见到HDC,CDC,CClientDC,CPaintDC,CWindowDC这样的类
HDC是DC的句柄,API中的一个类似指针的数据类型.
CDC是MFC的DC的一个类
CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.
CDC及其派生类的继承视图:
CObject
public |——CDC
public |——|——CClientDC
public |——|——CPaintDC
public |——|——CWindowDC
public |——|——CMetaFileDC
下面用例子和代码说明怎么使用pictureControl绘制坐标系和坐标点,以及在点附近输出坐标值:
1.先在对话框添加pictureControl,然后为其添加一个CStatic变量m_picDraw;
2.获取pictureControl的区域:
CRect rectPicture; m_picDraw.GetClientRect(&rectPicture);
3.获取pictureControl的CDC
CDC *pDC=m_picDraw.GetDC()
4.初始化画刷,用于将背景颜色涂黑
CBrush newBrush; CBrush *pOldBrush; // 创建黑色新画刷 newBrush.CreateSolidBrush(RGB(0, 0, 0)); // 选择新画刷,并将旧画刷的指针保存到pOldBrush pOldBrush = pDC->SelectObject(&newBrush); // 以黑色画刷为绘图控件填充黑色,形成黑色背景 pDC->Rectangle(rectPicture); // 恢复旧画刷 pDC->SelectObject(pOldBrush); // 删除新画刷 newBrush.DeleteObject();
5.创建画笔绘制坐标系
//创建实心画笔,粗度为1,颜色为绿色 newPen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); //选择新画笔,并将旧画笔的指针保存到pOldPen pOldPen = pDC->SelectObject(&newPen); //画直角坐标 pDC->MoveTo(rectPicture.left, rectPicture.top + (rectPicture.Height() / 2)); pDC->LineTo(rectPicture.right, rectPicture.top + (rectPicture.Height() / 2)); pDC->MoveTo(rectPicture.left + (rectPicture.Width() / 2), rectPicture.top); pDC->LineTo(rectPicture.left + (rectPicture.Width() / 2), rectPicture.bottom); // 恢复旧画笔 pDC->SelectObject(pOldPen); // 删除坐标画笔 newPen.DeleteObject();
6.在pictureControl绘制点
//pictureControl的中点 float x0 = rectPicture.left + (rectPicture.Width() / 2); float y0 = rectPicture.top + (rectPicture.Height() / 2); //设定点的颜色 COLORREF point_color = RGB(255, 0, 0); //点坐标 Point2f temp_point1(-18.3,0.0),temp_point2(18.3,0.0); //转换坐标原点到绘图控件中点 temp_point.x = temp_point.x + x0; temp_point.y = y0 - temp_point.y; //绘制点,将点的6×6邻域都画上,让点更大更好看 for (int j = -3; j <= 3; j++) for (int k = -3; k <= 3; k++) pDC->SetPixel(temp_point1.x + j, temp_point1.y + k, point_color); pDC->SetPixel(temp_point2.x + j, temp_point2.y + k, point_color);
7.在绘制点的附近绘制点的坐标值
要使用
BOOL TextOut(int x,int y,const CString& str)输出文本,其参数类型CString在unicode环境下是宽字符,所以需要将Point2f转化成char字符串,然后再把多字符转化成宽字符,定义一个将Point2f转化成CString的函数:
//将Point2f转换成CString的坐标字符串,用于绘图输出 CString stringTOcstring(Point2f RSL_point) { char charofstr[20]; sprintf_s(charofstr, 20, "%s%.1f%s%.1f%s", "(", RSL_point.x, ",", RSL_point.y, ")"); int n = _mbslen((unsigned char*)charofstr); int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, charofstr, -1, NULL, 0); wchar_t *pUnicode; pUnicode = new wchar_t[unicodeLen + 1]; memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, 0, charofstr, -1, pUnicode, unicodeLen); CString cstr; cstr = pUnicode; delete pUnicode; return cstr; }
坐标值绘制:
CString cstr;//用于存放坐标字符串 //设定字体 CFont m_newFont;//用于输出坐标字符串的字体 CFont *m_OldFont;//用于还原原来的字体 m_newFont.CreatePointFont(80, _T("宋体"));//创建字体,8个像素高的宋体 m_OldFont = (CFont*)pDC->SelectObject(&m_newFont);//将字体赋予设备上下文 pDC->SetBkMode(TRANSPARENT);//设置输出字体的背景透明 pDC->SetTextColor(RGB(0, 0, 255));//设置字体颜色 int excursion_y = 5;//设置字体相对点的y偏移量 int excursion_x = 30;//设置字体相对点的y偏移量 //输出坐标值到绘图控件 pDC->TextOut(temp_point1.x - excursion_x, temp_point1.y + excursion_y, cstr); pDC->TextOut(temp_point2.x - excursion_x, temp_point2.y - excursion_y, cstr); pDC->SelectObject(m_OldFont);//恢复原字体
8.运行得到效果:
9.好了,MFC的确很好玩,但是接下来要看算法了,为了毕业,苦逼的研究生苦中作乐啊。
相关文章推荐
- MFC中在picture control中显示图像的方法
- OPENCV Mat图像在MFC PictureControl显示
- MFC多文档窗口的静态分割和坐标轴的绘制
- MFC界面Picture Control自适应不失真显示图片
- MFC中Picture Control如何添加图片
- mfc Picture control显示图片,利用资源ID
- MFC—PictureControl控件使用,显示和处理图像
- MFC picture control控件不失真自适应图片显示
- MFC编程入门之二十七(常用控件:图片控件PictureControl)
- MFC中利用picture control控件设置闪烁按钮。(控件以加载bitmap位图为例)
- VS2012中MFC使用Picture Control显示OpenCV处理的图像
- MFC Picture Control显示OpenCV图像
- MFC中picture控件坐标转换
- MFC 获取picture控件的鼠标点击坐标位置的方法(PreTranslateMessag)
- VS2010-MFC:MFC PictureControl控件上自适应显示图片,分图片失真或者图片不失真两种
- MFC picture control控件不失真自适应图片显示
- MFC中基础控件的使用之Picture Control
- (转载)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)
- High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件
- MFC picture control控件不失真自适应图片显示