您的位置:首页 > 其它

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的区域:

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的确很好玩,但是接下来要看算法了,为了毕业,苦逼的研究生苦中作乐啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息