MFC绘制直线

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC绘制直线相关的知识,希望对你有一定的参考价值。

初学MFC,照着孙鑫老师的视频来的,为什么在绘制直线的时候,我的都是鼠标拖动完成之后没有反应,而需要鼠标再点击一下才会出现一条直线,也就是说onLbuttonup没有响应吧,可是完全是按照孙鑫老师的来的,都重改了好多遍了还是这种问题。实在搞不懂了,请教给位!谢谢了!部分程序如下:(每种用/* */标记起来的都是一种实现方法,可以用其中的任何一种)
CDrawView::CDrawView()
// TODO: add construction code here
m_ptOrigin=0;


CDrawView::~CDrawView()



BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)

// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);


/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing

void CDrawView::OnDraw(CDC* pDC)

CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here


/////////////////////////////////////////////////////////////////////////////
// CDrawView printing

BOOL CDrawView::OnPreparePrinting(CPrintInfo* pInfo)

// default preparation
return DoPreparePrinting(pInfo);


void CDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

// TODO: add extra initialization before printing


void CDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

// TODO: add cleanup after printing


/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics

#ifdef _DEBUG
void CDrawView::AssertValid() const

CView::AssertValid();


void CDrawView::Dump(CDumpContext& dc) const

CView::Dump(dc);


CDrawDoc* CDrawView::GetDocument() // non-debug version is inline

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
return (CDrawDoc*)m_pDocument;

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);


void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

// TODO: Add your message handler code here and/or call default
/*HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);*/
/*CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);*/

/*CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
/*CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
/*CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/

CView::OnLButtonUp(nFlags, point);

参考技术A 这样试试:
public:
CMFC练习Doc* GetDocument() const;
CPoint startpoint; //起始点
RECT rcOldClip; //原先的鼠标活动区域
//在头文件中声明

void CMFC练习View::OnLButtonDown(UINT nFlags, CPoint point)

// TODO: 在此添加消息处理程序代码和/或调用默认值
GetClipCursor(&rcOldClip); // 获得原鼠标活动的有效区域
startpoint=point; //鼠标所在点为起始点
SetCapture(); //进行鼠标捕捉
CView::OnLButtonDown(nFlags, point);


void CMFC练习View::OnLButtonUp(UINT nFlags, CPoint point)

// TODO: 在此添加消息处理程序代码和/或调用默认值
ClipCursor(&rcOldClip); //恢复原来的鼠标活动区
ReleaseCapture(); //释放鼠标捕捉
CView::OnLButtonUp(nFlags, point);


void CMFC练习View::OnMouseMove(UINT nFlags, CPoint point)

// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this); //获得DC
HCURSOR cusor; //鼠标光标句柄
RECT rcClip; //限值矩形区域
if((nFlags&MK_LBUTTON)==MK_LBUTTON) //移动鼠标左键时是按下的

GetWindowRect(&rcClip); //获得客户去窗口区域
ClipCursor(&rcClip); //将鼠标的移动限制在客户区
if((nFlags&MK_CONTROL) !=MK_CONTROL) //ctrl键没有按下

cusor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); //载入标准十字光标
SetCursor(cusor); //使用新光标
dc.MoveTo(startpoint.x,startpoint.y); //开始画线
dc.LineTo(point.x,point.y);
startpoint=point;

else

cusor=AfxGetApp()->LoadStandardCursor(IDC_SIZENS); //载入标准箭头光标
SetCursor(cusor); //使用光标
CBrush mybrush(RGB(0,0,255)); //生成刷子
CBrush *oldbrush; //原刷子指针
oldbrush=dc.SelectObject(&mybrush); //将刷子选入设备,并返回原刷子指针
dc.Rectangle(startpoint.x,startpoint.y,point.x,point.y); //绘制矩形
dc.SelectObject(oldbrush); //恢复原有刷子



CView::OnMouseMove(nFlags, point);
参考技术B m_ptOrigin,看现在这个变量是不是CPoint类型。光这看不问题的。
或者你按我的步骤试一试:
1,建立好工程后,项目,类向导,view内中添加UP,DOWN消息。
2,右键点击view类,添加CPoint类型变量m_ptOrigin。
3,down中 ,point = m_ptOrigin。
4,up中,CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);本回答被提问者采纳

怎么在mfc中画曲线

要做一个地图指示路径的导航软件,图上有些路径不能直线到达,要曲线才能,怎么画曲线啊。我看到一份代码,但是不太了解具体的意思,请给一下注释
int i,j;
CPen pen(PS_SOLID,3,RGB(255,69,0)); //画笔粗细以及颜色
CClientDC dc1(this);
CPen *pOldpen=dc1.SelectObject(&pen);
for(j=0;j<3000;j++)
dc1.MoveTo(zuobiao[spath[0]].x,zuobiao[spath[0]].y);
for(i=1;i<=k+1;i++)

for(j=0;j<8000;j++)
dc1.LineTo(zuobiao[spath[i]].x,zuobiao[spath[i]].y);

dc1.SelectObject(pOldpen);

  具体如下:
1)从CStatic派生,容易在对话框中使用。
2)能够随对话框的缩放自动改变大小,这里假设对话框中其它元素的位置基本不变。
3)曲线的粗细,颜色,线型(实,虚线)可以自由设置。
4)可以控制曲线的隐藏/显示。
5)两个坐标轴,Y轴根据数据自适应,实际数据最大最小值各偏离5%是坐标轴的最大最小值(简化起见,坐标轴采用五等分)。X轴是时间轴,一个像素点代表一个数据点,假设采样按一定的频率。
6)可以添加多条曲线。
7) 使用双缓冲,避免图形闪烁。
做一个CStatic派生控件的基本步骤:
1)定义一个从CStatic派生的类。
2)重载有关消息映射,WM_PAINT,WM_ERASEBKGND
3) 在OnPaint中绘图,在这里根据实际的需要做不同的计算,绘制。
  大致可分为以下几步,I布局计算,CStatic是整个绘图区,将这个区域划分为边缘空白,坐标轴区,曲线区等几个部分,需要算出各个部分的矩形顶点,以便控制曲线的绘制。
参考技术A 上面这段代码,就是用小段的直线,显示出曲线的效果
1. 先移动到第一个点
2. 然后向第二个点画直线
3. 向第三个点画直线
...
向第7999个点画直线
参考技术B 1、CPen(int nPenStyle, int nWidth, COLORREF crColor);第一句就是一个cpen的构造函数,包括线型,粗细和颜色;
2、然后创建一个指向客户区的设备,并将该画笔选入设备(也就是你要划线的区域);
3、如果用断线形成曲线的话,你这个程序的思路好像不大对吧,应该是一个MoveTo对应一个LineTo吧。。。。

以上是关于MFC绘制直线的主要内容,如果未能解决你的问题,请参考以下文章

怎么在mfc中画曲线

想用mfc做一个绘图系统,画圆直线矩形填充颜色和平移

MFC中画直线CDC::LineTo(POINT point)这个函数使用的疑问???

如何在MFC中用鼠标画直线

直线的中点Bresenham算法的实现

VC中MFC下的绘图初步解析