在 MFC VS2010 和 VC++6.0 中画线没有得到相同的结果

Posted

技术标签:

【中文标题】在 MFC VS2010 和 VC++6.0 中画线没有得到相同的结果【英文标题】:Drawing lines in MFC VS2010 and VC++6.0 doesn't get the same result 【发布时间】:2012-02-08 05:00:50 【问题描述】:

这几天一直在学习MFC,想在VC++6.0和VS2010都用MoveTo()和LineTo()函数画线,但是在vs2010好像不行,我只加了两个窗口消息处理程序,WM_LBUTTONDOWN 和 WM_LBUTTONUP,在单文档项目中。 这是VC++6.0中的代码:

CPoint m_ptOrign;
void CStyleView::OnLButtonDown(UINT nFlags, CPoint point) 

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


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

    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
    dc.MoveTo(m_ptOrign);
    dc.LineTo(point);
    CView::OnLButtonUp(nFlags, point);

这是vs2010中的代码:

CPoint m_ptOrign;
void CStyleView::OnLButtonDown(UINT nFlags, CPoint point)

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

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

    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);

    dc.MoveTo(m_ptOrign);
    dc.LineTo(point);

    CView::OnLButtonUp(nFlags, point);

我添加到两个项目中的代码是一样的。当我松开左键时,该行立即出现在vc++6.0项目中,但它没有出现在vs 2010 mfc项目中。 如果 vs 2010 项目窗口的大小或位置发生变化,则会出现该行。 但是当我在 vs 2010 项目中使用dc.Rectangle(CRect(m_ptOrign,point)) 时,它运行良好。 不知道为什么.....

还有,如果我使用

CBrush *pBbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBbrush);
dc.Rectangle(CRect(m_ptOrign,point))

在vs2010中,又不行了,像画线的情况

【问题讨论】:

你为什么期望NULL_BRUSH 来绘制任何东西? 默认笔刷是白色。笔刷不影响矩形的边框。如果我不更换画笔,矩形将被填充一些颜色。如果我在同一点绘制两个矩形,(第一个小,第二个大或者它们很接近),小一个将完全被覆盖或擦除大的,小的就看不见了screen.@CodyGray 【参考方案1】:

LineTo 将使用当前选择到 DC 中的笔。由于您尚未选择笔,它将使用默认值。不知道为什么 VC6 和 VC2010 会不一样,可能和两个版本的 MFC 不同有关吧。

一般来说,抓住 DC 并开始使用它是个坏主意。更好的是在 OnPaint 或 OnDraw 方法中完成所有绘图。您可以调用 InvalidateRect 以将绘制消息发送到窗口。

【讨论】:

默认笔在背面,实心,1 点。对于用户操作的绘制,不需要使谁窗口无效(即通过 OnPaint 处理),使用本地 CClientDC 绘制就可以了。

以上是关于在 MFC VS2010 和 VC++6.0 中画线没有得到相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

MFC VC++6.0 对话框怎么获得文档类中的数据

vc6.0 mfc窗口问题

VC中MFC从哪里开始运行,MFC怎么调试,很急呀

vc++6.0编的基于MFC的简单的tcp聊天程序

C++ MFC VC 6.0 到 VS2013 lStreamReturn = GetRichEditCtrl().StreamIn(SF_RTF, es);

VS2010远程调试你的程序vc++/wpf/C#/MFC