请问如何在对话框中画波形?
我现在使用
CPaintDC dc(this);
dc.MoveTo();
dc.LineTo();
但是连一根线都画不出来,郁闷死了!
是不是因为对话框的坐标没有确定?
那么用
CRect rect;
GetClientRect(&rect);
行不行?
谢谢了!
12 个解决方案
#1
找例子呀.
比如在: http://www.codeproject.com/dialog/ownrdrwsubcls.asp
这个例子里面有的就是对话框常用的两个重要方法:subclass和OwnerDraw
比如在: 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);
}
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
}
// 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);
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
}
还是什么都没有,不知道为什么,什么都画不出来?
求大侠帮帮忙,万分感谢!
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);
pDC=GetDC();
pDC->MoveTo(12,200);
pDC->LineTo(15,200);
ReleaseDC(pDC);
#8
怎么能写在OnInitDialog呢?
你应该写在OnDraw里啊,其实你的曲线已经画过了,但是程序会以你的
肉眼无法识别的速度去调用OnDraw,结果马上被擦掉
你应该写在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 );
改成:
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()函数有关吗?
我根据大侠们提供的建议将代码更改之后,依然不见效!
我该怎么办?
麻烦你们了
我将弹出的子窗口做成一个CURVE类,在这个窗口中利用picture控件划定一个区域,现在要将坐标轴画在这个区域中本来将代码写在OnInitDialog()中,后来在CURVE类中创建了成员函数OnPaint(),并将画线代码移植到该函数中,运行时,在该子对话框中依然什么都看不到,这难道与父对话框中的OnPaint()函数有关吗?
我根据大侠们提供的建议将代码更改之后,依然不见效!
我该怎么办?
麻烦你们了
#1
找例子呀.
比如在: http://www.codeproject.com/dialog/ownrdrwsubcls.asp
这个例子里面有的就是对话框常用的两个重要方法:subclass和OwnerDraw
比如在: 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);
}
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
}
// 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);
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
}
还是什么都没有,不知道为什么,什么都画不出来?
求大侠帮帮忙,万分感谢!
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);
pDC=GetDC();
pDC->MoveTo(12,200);
pDC->LineTo(15,200);
ReleaseDC(pDC);
#8
怎么能写在OnInitDialog呢?
你应该写在OnDraw里啊,其实你的曲线已经画过了,但是程序会以你的
肉眼无法识别的速度去调用OnDraw,结果马上被擦掉
你应该写在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 );
改成:
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()函数有关吗?
我根据大侠们提供的建议将代码更改之后,依然不见效!
我该怎么办?
麻烦你们了
我将弹出的子窗口做成一个CURVE类,在这个窗口中利用picture控件划定一个区域,现在要将坐标轴画在这个区域中本来将代码写在OnInitDialog()中,后来在CURVE类中创建了成员函数OnPaint(),并将画线代码移植到该函数中,运行时,在该子对话框中依然什么都看不到,这难道与父对话框中的OnPaint()函数有关吗?
我根据大侠们提供的建议将代码更改之后,依然不见效!
我该怎么办?
麻烦你们了