⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 insertvaluedlg.cpp

📁 本程序实现抛物线插值的功能
💻 CPP
字号:
// InsertValueDlg.cpp : implementation file
//

#include "stdafx.h"
#include "InsertValue.h"
#include "InsertValueDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInsertValueDlg dialog

CInsertValueDlg::CInsertValueDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CInsertValueDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CInsertValueDlg)
	m_x0 = 1.0f;
	m_dengju = 3;
	m_y0 = 1.0f;
	m_x1 = 4.0f;
	m_y1 = 2.0f;
	m_x2 = 10.0f;
	m_y2 = 10.0f;
	m_insert2x = 2.0f;
	m_insert3x = 2.5f;
	m_insert1x = 5.0f;
	m_insert4x = 8.5f;
	m_radio = 1;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CInsertValueDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CInsertValueDlg)
	DDX_Control(pDX, IDC_graphic, m_graphic);
	DDX_Control(pDX, IDC_BUTTON1, m_generate);
	DDX_Text(pDX, IDC_EDIT3, m_x0);
	DDX_Text(pDX, IDC_EDIT10, m_dengju);
	DDX_Text(pDX, IDC_EDIT4, m_y0);
	DDX_Text(pDX, IDC_EDIT5, m_x1);
	DDX_Text(pDX, IDC_EDIT6, m_y1);
	DDX_Text(pDX, IDC_EDIT7, m_x2);
	DDX_Text(pDX, IDC_EDIT8, m_y2);
	DDX_Text(pDX, IDC_EDIT9, m_insert2x);
	DDX_Text(pDX, IDC_EDIT12, m_insert3x);
	DDX_Text(pDX, IDC_EDIT1, m_insert1x);
	DDX_Text(pDX, IDC_EDIT13, m_insert4x);
	DDX_Radio(pDX, IDC_RADIO2, m_radio);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CInsertValueDlg, CDialog)
	//{{AFX_MSG_MAP(CInsertValueDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_BUTTON1, OnGenerate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInsertValueDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	// TODO: Add extra initialization here
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CInsertValueDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CInsertValueDlg::OnPaint() 
{
	int t1=25,t2=275,s=m_dengju;//s为等分数
	float valuex[3],valuey[3],mix,miy,max,may,temp1,m0,m1,m2,insert[4];
	CPaintDC dc(this);
	CRect rect;
	CWnd *pwnd=GetDlgItem(IDC_graphic);
	CDC *pdc=pwnd->GetDC();
	pwnd->Invalidate();
	pwnd->UpdateWindow();
	//绘制x轴
	pdc->MoveTo(20,270);
	pdc->LineTo(420,270);
	//绘制x轴箭头
	pdc->MoveTo(410,265);
	pdc->LineTo(420,270);
	pdc->MoveTo(410,275);
	pdc->LineTo(420,270);
	pdc->TextOut(400,275,"X");
	//绘制x轴刻度
	for(int i=0;i<10;i++)
	{
		t1+=35;
		pdc->MoveTo(t1,270);
		pdc->LineTo(t1,267);
		if(i<9)
		pdc->TextOut(t1,273,char(i+49));
	}
	pdc->TextOut(t1-3,273,char(49));
	pdc->TextOut(t1+3,273,char(48));
	//绘制y轴
	pdc->MoveTo(25,275);
	pdc->LineTo(25,10);
	//绘制y轴箭头
	pdc->MoveTo(20,15);
	pdc->LineTo(25,10);
	pdc->MoveTo(30,15);
	pdc->LineTo(25,10);
	pdc->TextOut(10,5,"Y");
	//绘制y轴刻度
	for(int w=0;w<10;w++)
	{
		t2-=25;
		pdc->MoveTo(25,t2);
		pdc->LineTo(28,t2);
		if(w<9)
		pdc->TextOut(15,t2-5,char(w+49));
	}
	pdc->TextOut(10,t2-5,char(49));
	pdc->TextOut(15,t2-5,char(48));
	valuex[0]=m_x0;
	valuex[1]=m_x1;
	valuex[2]=m_x2;
	valuey[0]=m_y0;
	valuey[1]=m_y1;
	valuey[2]=m_y2;
	m0=m_y0;
	m1=(m_y1-m_y0)/(m_x1-m_x0);
	m2=((m_y2-m_y0)/(m_x2-m_x0)-(m_y1-m_y0)/(m_x1-m_x0))/(m_x2-m_x1);
	mix=valuex[0];
	max=valuex[0];
	miy=valuey[0];
	may=valuey[0];
	for(int u=1;u<3;u++)
	{
		if (mix<valuex[u] && max<valuex[u])
			{
				max=valuex[u];
				may=valuey[u];
			}
		else if(mix>valuex[u])
		{
			mix=valuex[u];
			miy=valuey[u];
		}
	};
	if 	(m_radio==1)
	{
	//这里是等距和非等距两种情况的分支
	temp1=(max-mix)/s;//temp为等距情况下每等份的长度
	pdc->MoveTo(int(mix*35+25),int(270-miy*25));
	//pdc->LineTo(int(max*35+25),int(270-may*25));
	for(int v=1;v<s;v++)
		pdc->LineTo(int((mix+v*temp1)*35+25),int(270-(m0+m1*((mix+v*temp1)-m_x0)+m2*((mix+v*temp1)-m_x0)*((mix+v*temp1)-m_x1))*25));
	pdc->LineTo(int(max*35+25),int(270-may*25));
	}
	else
	{
	//下面是非等距
	insert[0]=m_insert1x;
	insert[1]=m_insert2x;
	insert[2]=m_insert3x;
	insert[3]=m_insert4x;
	for(int r=0;r<3;r++)
	{
		temp1=insert[r];
		for(int t=r+1;t<4;t++)
		{
			if(temp1>insert[t])
			{
				insert[r]=insert[t];
				insert[t]=temp1;
				temp1=insert[r];
			}
		}
	}
	pdc->MoveTo(int(mix*35+25),int(270-miy*25));
	for(int d=0;d<4;d++)
		pdc->LineTo(int(insert[d]*35+25),int(270-(m0+m1*(insert[d]-m_x0)+m2*(insert[d]-m_x0)*(insert[d]-m_x1))*25));
	pdc->LineTo(int(max*35+25),int(270-may*25));
	}


}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CInsertValueDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


void CInsertValueDlg::OnRadio2() 
{
(CEdit*)GetDlgItem(IDC_EDIT10)->ShowWindow(SW_HIDE);
}

void CInsertValueDlg::OnRadio1() 
{
(CEdit*)GetDlgItem(IDC_EDIT10)->ShowWindow(SW_SHOW);
}



void CInsertValueDlg::OnGenerate() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	Invalidate();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -