一个关于关于MFC的问题:如何在对话框上画图
在单文档程序中,想在一个对话框上的静态文本框控件上画图,为对话框关联一个CPictrue类,在类中条件WM_PAINT响应函数OnPaint(),下面是该函数中的代码:v...
在单文档程序中,想在一个对话框上的静态文本框控件上画图,为对话框关联一个CPictrue类,在类中条件WM_PAINT响应函数OnPaint(),下面是该函数中的代码:
void CPictrue::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd*pWnd=GetDlgItem(IDC_PICT);
CDC*pDC=pWnd->GetDC();
CPen*pPenGreen=new CPen;
pPenGreen->CreatePen(PS_SOLID,2,RGB(0,255,0));//创建画笔
CGdiObject*pOldPen=pDC->SelectObject(pPenGreen);
pDC->MoveTo(10,10); //画坐标轴
pDC->LineTo(10,280);
pDC->LineTo(300,280);
pDC->MoveTo(295,275); //画X轴箭头
pDC->LineTo(300,280);
pDC->LineTo(295,285);
pDC->MoveTo(5,15); //画Y轴箭头
pDC->LineTo(10,10);
pDC->LineTo(15,15);
pDC->SelectObject(pOldPen);
pWnd->ReleaseDC(pDC);
// Do not call CDialog::OnPaint() for painting messages
}
但是运行不能正常显示所画图形:如下图,
但是拖住对话框快速晃动几下就可以正常显示了,请解释一下,另外这段代码该怎么改? 展开
void CPictrue::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd*pWnd=GetDlgItem(IDC_PICT);
CDC*pDC=pWnd->GetDC();
CPen*pPenGreen=new CPen;
pPenGreen->CreatePen(PS_SOLID,2,RGB(0,255,0));//创建画笔
CGdiObject*pOldPen=pDC->SelectObject(pPenGreen);
pDC->MoveTo(10,10); //画坐标轴
pDC->LineTo(10,280);
pDC->LineTo(300,280);
pDC->MoveTo(295,275); //画X轴箭头
pDC->LineTo(300,280);
pDC->LineTo(295,285);
pDC->MoveTo(5,15); //画Y轴箭头
pDC->LineTo(10,10);
pDC->LineTo(15,15);
pDC->SelectObject(pOldPen);
pWnd->ReleaseDC(pDC);
// Do not call CDialog::OnPaint() for painting messages
}
但是运行不能正常显示所画图形:如下图,
但是拖住对话框快速晃动几下就可以正常显示了,请解释一下,另外这段代码该怎么改? 展开
3个回答
推荐于2017-09-02 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464972
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
在对话框中响应CDialog::OnLButtonDown(nFlags, point);与CDialog::OnLButtonUp(nFlags, point);CDialog::OnMouseMove(nFlags, point);这三个事件,给个例子,比着这个改一下。
先定义BOOL m_bMove=false;
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_ptOld=point;
m_bMove=TRUE;//保存这个坐标点
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//画出连续的带有颜色的线
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));//创建一个画笔
CPen *pOldPen=dc.SelectObject(&pen);//选到一个设备描述表中
if(m_bMove==TRUE)
{
dc.MoveTo(m_ptOrigin);//划线时先把移动到原点
dc.LineTo(point); //划到线的终点
m_ptOrigin=point; //连续划线就要将线的终点重设为下一次线的起点
}
dc.SelectObject(pOldPen);*/ //释放
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bMove=FALSE;
CView::OnLButtonUp(nFlags, point);
}
先定义BOOL m_bMove=false;
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_ptOld=point;
m_bMove=TRUE;//保存这个坐标点
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//画出连续的带有颜色的线
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));//创建一个画笔
CPen *pOldPen=dc.SelectObject(&pen);//选到一个设备描述表中
if(m_bMove==TRUE)
{
dc.MoveTo(m_ptOrigin);//划线时先把移动到原点
dc.LineTo(point); //划到线的终点
m_ptOrigin=point; //连续划线就要将线的终点重设为下一次线的起点
}
dc.SelectObject(pOldPen);*/ //释放
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bMove=FALSE;
CView::OnLButtonUp(nFlags, point);
}
展开全部
CDialog 没有刷新,要么 把静态框去掉,要么从CWnd派生一个类,在类的 OnPaint里画
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
OnPaint是给你更新当前窗口的不是给你画控件的。所以你的方法是错误的
对于Static控件(picurebox也算吧?),首先要给它设置一个style叫“SS_OWNERDRAW”(在对话框编辑器里面,应该可以给它勾上这个属性)
然后主窗体在控件需要绘制的时候会收到WM_DRAWITEM消息,这个DRAWITEM就相当于WM_PAINT,只不过是给你画控件不是给你画自己的。这个消息的lParam是一个DRAWITEMSTRUCT类型的结构体,里面有一个hDC你可以拿来创建CDC对象然后在上面进行绘制。
对于Static控件(picurebox也算吧?),首先要给它设置一个style叫“SS_OWNERDRAW”(在对话框编辑器里面,应该可以给它勾上这个属性)
然后主窗体在控件需要绘制的时候会收到WM_DRAWITEM消息,这个DRAWITEM就相当于WM_PAINT,只不过是给你画控件不是给你画自己的。这个消息的lParam是一个DRAWITEMSTRUCT类型的结构体,里面有一个hDC你可以拿来创建CDC对象然后在上面进行绘制。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |