MFC pictureControl 绘制直角坐标点

首先说一下什么是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.运行得到效果:
MFC pictureControl 绘制直角坐标点_第1张图片
9.好了,MFC的确很好玩,但是接下来要看算法了,为了毕业,苦逼的研究生苦中作乐啊。

你可能感兴趣的:(mfc,CDC,图片控件,坐标绘制)