您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页mfc画线

mfc画线

来源:意榕旅游网


一.画鼠标按下到弹起之间的直线

1.创建 CView 的私有成员变量 CPoint m_ptOrigin;

2.在构造函数中初始化 m_ptOrigin = 0;

3.添加 LButtonDown(鼠标左键按下)消息函数并在鼠标左键按下的事件中记录m_ptOrigin点的坐标;

4.添加 LButtonUp(鼠标左键弹起)消息函数并在鼠标左键弹起的事件中进行画线

/*HDC hdc;

hdc=::GetDC(m_hWnd); //HDC方式创建

MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //线的初始点

LineTo(hdc,point.x,point.y); //线的终点

::ReleaseDC(m_hWnd,hdc);*/ //释放dc

/*

CDC *pDC=GetDC(); //CDC方式创建

pDC->MoveTo(m_ptOrigin);

pDC->LineTo(point);

ReleaseDC(pDC);*/

/*

CClientDC dc(this); //ClientDC 方式创建

//CClientDC dc(GetParent());

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

*/

/*

//CWindowDC dc(this); //CWindowDC 方式创建

//CWindowDC dc(GetParent());//父窗口

CWindowDC dc(GetDesktopWindow());

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

*/

/*

CPen pen(PS_SOLID,1,RGB(255,0,0)); //定义画笔

CClientDC dc(this); //画板

CPen *pOldPen=dc.SelectObject(&pen);

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

dc.SelectObject(pOldPen);*/

/* 用笔刷画矩形

CBrush brush(RGB(255,0,0));//笔刷颜色

CClientDC dc(this);

dc.FillRect(CRect(m_ptOrigin,point),&brush);

*/

/* 使用资源图填充笔刷画矩形

CBitmap bitmap;

bitmap.LoadBitmap(IDB_BITMAP1);//载入图片资源

CBrush brush(&bitmap);

CClientDC dc(this);

dc.FillRect(CRect(m_ptOrigin,point),&brush);

*/

/* 画透明背景的矩形框

CClientDC dc(this);

//dc.Rectangle(CRect(m_ptOrigin,point));

CBrush

*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//透明笔刷

CBrush *pOldBrush=dc.SelectObject(pBrush);

dc.Rectangle(CRect(m_ptOrigin,point));

dc.SelectObject(pOldBrush);

*/

二.连续画线

1.在CView 中创建私有成员变量 BOOL m_bDraw;

2.在构造函数中初始化为 FALSE 即 m_bDraw = FALSE;

3.添加MouseMove(鼠标移动)事件响应函数,并添加

CClientDC dc(this);

CPen pen(PS_SOLID,1,RGB(255,0,0));

CPen *oldPen = dc.SelectObject(&pen);

if(m_bDraw)

{

//dc.SetROP2(R2_BLACK);

dc.MoveTo(m_ptOrigin);

dc.LineTo(m_ptOld);

dc.MoveTo(m_ptOld);

dc.LineTo(point);

//m_ptOrigin=point;

m_ptOld=point;

}

dc.SelectObject(oldPen);

画出来为扇形

MFC获得控件大小及在picturecontrol控件上画图

有时不管是要界面的摆设还是画图获得图像上像素点坐标,都需要控件的大小,代码如下

CRect rc;

CWnd *pWnd = GetDlgItem(IDC_STATIC_DIB);//参数为控件ID

pWnd->GetClientRect(&rc);//rc为控件的大小。

进一步,需要在pictrecontrol控件上画图

CDC *pDC = GetDlgItem(IDC_STATIC_DIB);

img.Show(pDc,&rc);

以上代码规整点整理如下:

CDC *pDC = GetDlgItem(IDC_STATIC_DIB)->GetDC();

CRect rc;

GetDlgItem(IDC_STATIC_DIB)->GetClient(rc);

img.Show(pDC,&rc);

//show()函数是提前写好的缩放图像的函数,没事贴出来,仿pj写的。。。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int ImgSuccinctDib::Show(CDC *pDC, CRect *pRect)

{

if (m_pPtr == NULL)

{

return 0;

}

BITMAPINFO* bi =(BITMAPINFO *) new

BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];

memcpy(&bi->bmiHeader,m_pBmih,sizeof(BITMAPINFOHEADER));

if (GetBitCount() == 8)

{

RGBQUAD pal[256];

for (int i = 0;i<256;i++)

{

pal[i].rgbBlue = i;

pal[i].rgbGreen = i;

pal[i].rgbRed = i;

pal[i].rgbReserved = 0;

}

memcpy(&bi->bmiColors,pal,256*sizeof(RGBQUAD));

}

::StretchDIBits(pDC->GetSafeHdc(),0,0,pRect->right,pRect->bottom,\\

0,0,m_pBmih->biWidth,m_pBmih->biHeight,m_pPtr,(BITMAPINFO*)bi,

DIB_RGB_COLORS,SRCCOPY);

delete []bi;

bi=NULL;

return 1;

}

关键是取picture控件的指针,GetDlgItem(IDC_PICTURE1),而后是取cdc,GetDC().

这个cdc类的指针就可以textout,moveto,lineto画线了,但是如何才能实现屏幕横滚呢,清屏功能是现成的吗?还要再看一下

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务