求救!送分了!(十万火急)万分感谢!!!

时间:2021-03-18 00:27:40
我是个VC++初学者,所以如果以下问题过于愚昧,请见谅,谢谢!
  请问如何在对话框中画波形?
  我现在使用
   CPaintDC dc(this);
   dc.MoveTo();
   dc.LineTo();
但是连一根线都画不出来,郁闷死了!
是不是因为对话框的坐标没有确定?
那么用
   CRect rect;
   GetClientRect(&rect);
行不行?
谢谢了!

12 个解决方案

#1


找例子呀.
比如在: http://www.codeproject.com/dialog/ownrdrwsubcls.asp
这个例子里面有的就是对话框常用的两个重要方法:subclass和OwnerDraw

#2


你把代码帖出来看看啊?是在OnPaint()里吗?

#3


like such:
void CSdiView::OnPaint() 
{
   CPaintDC dc(this);
   dc.MoveTo(20,20);
   dc.LineTo(80,80);
}

#4


我是写在初始化函数内的,我想先在对话框中生成一个直角坐标系,至于画波形,那要写到OnPaint()函数中,代码如下:
// Curve.cpp : implementation file
//

#include "stdafx.h"
#include "DEAL.h"
#include "Curve.h"
#include "Mode.h"
#include "Draw.h"
#include "DFT.h"
#include "DEALDlg.h"
#include "GridCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCurve dialog


CCurve::CCurve(CWnd* pParent /*=NULL*/)
: CDialog(CCurve::IDD, pParent)
{
//{{AFX_DATA_INIT(CCurve)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CCurve::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCurve)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCurve, CDialog)
//{{AFX_MSG_MAP(CCurve)
ON_BN_CLICKED(IDD_COLORSET, OnColorset)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCurve message handlers

void CCurve::OnColorset() 
{
// TODO: Add your control notification handler code here
CMode mode;
mode.DoModal();

}



BOOL CCurve::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.SetViewportExt(120,120);
dc.GetCurrentPosition();
dc.MoveTo(120,120);
dc.LineTo(150,120);

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}

#5


没有获得设备环境
CWnd* pWnd=GetDlgItem(IDC_***);
 CPaintDC dc(pWnd);

#6


我将程序按照您说的改了一下,现在初始化函数如下:
BOOL CCurve::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
CWnd* pWnd=GetDlgItem(IDC_CURVE);
CPaintDC dc(pWnd);

CRect rect;
GetClientRect(&rect);
dc.GetCurrentPosition();
dc.MoveTo(12,200);
dc.LineTo(15,200);

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}
还是什么都没有,不知道为什么,什么都画不出来?
求大侠帮帮忙,万分感谢!

#7


CDC *pDC=NULL;
pDC=GetDC();
pDC->MoveTo(12,200);
pDC->LineTo(15,200);
ReleaseDC(pDC);

#8


怎么能写在OnInitDialog呢?
你应该写在OnDraw里啊,其实你的曲线已经画过了,但是程序会以你的
肉眼无法识别的速度去调用OnDraw,结果马上被擦掉

#9


补充一句,在CDialog是OnPaint()中。

#10


我的曲线是画在弹出的子对话框中的,写在OnPaint()中,编译的时候会报错啊
麻烦大侠们再看看,劳您费心了,谢谢了

#11


自然是话不出来,你根本没创建CBrush 或 CPen 之类的
改成:
CPen lightpen( PS_SOLID, 0, ::GetSysColor( COLOR_3DHILIGHT ) );
pDC->SelectObject( &lightpen );
pDC->MoveTo( rect.right, rect.top );
pDC->LineTo( rect.left, rect.top );
pDC->LineTo( rect.left, rect.bottom );

#12


这样还是不行,什么都没有,还有其他办法吗?
我将弹出的子窗口做成一个CURVE类,在这个窗口中利用picture控件划定一个区域,现在要将坐标轴画在这个区域中本来将代码写在OnInitDialog()中,后来在CURVE类中创建了成员函数OnPaint(),并将画线代码移植到该函数中,运行时,在该子对话框中依然什么都看不到,这难道与父对话框中的OnPaint()函数有关吗?
我根据大侠们提供的建议将代码更改之后,依然不见效!
我该怎么办?
麻烦你们了

#1


找例子呀.
比如在: http://www.codeproject.com/dialog/ownrdrwsubcls.asp
这个例子里面有的就是对话框常用的两个重要方法:subclass和OwnerDraw

#2


你把代码帖出来看看啊?是在OnPaint()里吗?

#3


like such:
void CSdiView::OnPaint() 
{
   CPaintDC dc(this);
   dc.MoveTo(20,20);
   dc.LineTo(80,80);
}

#4


我是写在初始化函数内的,我想先在对话框中生成一个直角坐标系,至于画波形,那要写到OnPaint()函数中,代码如下:
// Curve.cpp : implementation file
//

#include "stdafx.h"
#include "DEAL.h"
#include "Curve.h"
#include "Mode.h"
#include "Draw.h"
#include "DFT.h"
#include "DEALDlg.h"
#include "GridCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCurve dialog


CCurve::CCurve(CWnd* pParent /*=NULL*/)
: CDialog(CCurve::IDD, pParent)
{
//{{AFX_DATA_INIT(CCurve)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CCurve::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCurve)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCurve, CDialog)
//{{AFX_MSG_MAP(CCurve)
ON_BN_CLICKED(IDD_COLORSET, OnColorset)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCurve message handlers

void CCurve::OnColorset() 
{
// TODO: Add your control notification handler code here
CMode mode;
mode.DoModal();

}



BOOL CCurve::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.SetViewportExt(120,120);
dc.GetCurrentPosition();
dc.MoveTo(120,120);
dc.LineTo(150,120);

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}

#5


没有获得设备环境
CWnd* pWnd=GetDlgItem(IDC_***);
 CPaintDC dc(pWnd);

#6


我将程序按照您说的改了一下,现在初始化函数如下:
BOOL CCurve::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
CWnd* pWnd=GetDlgItem(IDC_CURVE);
CPaintDC dc(pWnd);

CRect rect;
GetClientRect(&rect);
dc.GetCurrentPosition();
dc.MoveTo(12,200);
dc.LineTo(15,200);

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}
还是什么都没有,不知道为什么,什么都画不出来?
求大侠帮帮忙,万分感谢!

#7


CDC *pDC=NULL;
pDC=GetDC();
pDC->MoveTo(12,200);
pDC->LineTo(15,200);
ReleaseDC(pDC);

#8


怎么能写在OnInitDialog呢?
你应该写在OnDraw里啊,其实你的曲线已经画过了,但是程序会以你的
肉眼无法识别的速度去调用OnDraw,结果马上被擦掉

#9


补充一句,在CDialog是OnPaint()中。

#10


我的曲线是画在弹出的子对话框中的,写在OnPaint()中,编译的时候会报错啊
麻烦大侠们再看看,劳您费心了,谢谢了

#11


自然是话不出来,你根本没创建CBrush 或 CPen 之类的
改成:
CPen lightpen( PS_SOLID, 0, ::GetSysColor( COLOR_3DHILIGHT ) );
pDC->SelectObject( &lightpen );
pDC->MoveTo( rect.right, rect.top );
pDC->LineTo( rect.left, rect.top );
pDC->LineTo( rect.left, rect.bottom );

#12


这样还是不行,什么都没有,还有其他办法吗?
我将弹出的子窗口做成一个CURVE类,在这个窗口中利用picture控件划定一个区域,现在要将坐标轴画在这个区域中本来将代码写在OnInitDialog()中,后来在CURVE类中创建了成员函数OnPaint(),并将画线代码移植到该函数中,运行时,在该子对话框中依然什么都看不到,这难道与父对话框中的OnPaint()函数有关吗?
我根据大侠们提供的建议将代码更改之后,依然不见效!
我该怎么办?
麻烦你们了