基于MFC的逐点比较法直线法插补教程.docx
《基于MFC的逐点比较法直线法插补教程.docx》由会员分享,可在线阅读,更多相关《基于MFC的逐点比较法直线法插补教程.docx(10页珍藏版)》请在冰豆网上搜索。
![基于MFC的逐点比较法直线法插补教程.docx](https://file1.bdocx.com/fileroot1/2022-10/10/73d8c895-d921-4b34-aba4-9eb14b54392d/73d8c895-d921-4b34-aba4-9eb14b54392d1.gif)
基于MFC的逐点比较法直线法插补教程
1.这是程序最终运行结果的示意图:
2.编辑如下
3.全部代码如下:
#include"stdafx.h"
#include"逐点比较法直线插补1.h"
#include"逐点比较法直线插补1Dlg.h"
CWnd*pWnd;
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMy1Dlgdialog
CMy1Dlg:
:
CMy1Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMy1Dlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMy1Dlg)
m_x=0.0;
m_y=0.0;
m_x0=0;
m_y0=0;
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMy1Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy1Dlg)
DDX_Text(pDX,IDC_EDIT1,m_x);
DDV_MinMaxDouble(pDX,m_x,0.,10.);
DDX_Text(pDX,IDC_EDIT2,m_y);
DDV_MinMaxDouble(pDX,m_y,0.,10.);
DDX_Text(pDX,IDC_EDIT3,m_x0);
DDV_MinMaxInt(pDX,m_x0,0,10);
DDX_Text(pDX,IDC_EDIT4,m_y0);
DDV_MinMaxInt(pDX,m_y0,0,10);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMy1Dlg,CDialog)
//{{AFX_MSG_MAP(CMy1Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMy1Dlgmessagehandlers
BOOLCMy1Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
pWnd=GetDlgItem(IDC_MYSTATIC);
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMy1Dlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMy1Dlg:
:
OnPaint()
{
if(a==1)
{
CPaintDCdc(this);//devicecontextforpainting
CStringstr;
inti,j;
intx,y;
//强制更新绘图,不可少,否则绘图会出错
//使static控件区域无效
pWnd->Invalidate();
//更新窗口,此时才真正向系统发送重绘消息,没有这句你可以试下,绝对出问题
pWnd->UpdateWindow();
CDC*pDC=pWnd->GetDC();//获取控件的CDC指针
pDC->Rectangle(0,0,380,390);//画一个矩形框
CPen*pPenRed=newCPen();//创建画笔对象
pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));//红色画笔
CPen*pPen=NULL;
//选中当前红色画笔,并保存以前的画笔
CGdiObject*pOldPen=pDC->SelectObject(pPenRed);
pDC->MoveTo(20,20);//绘制坐标轴
pDC->LineTo(20,360);//竖起轴
pDC->LineTo(360,360);//水平轴
//写X轴刻度值
for(i=0;i<=10;i++)
{
str.Format("%d",i);
pDC->TextOut(17+30*i,365,str);
//绘制X轴刻度
pDC->MoveTo(i*30+20,360);
pDC->LineTo(i*30+20,355);
}
//写Y轴刻度值
for(i=1;i<=10;i++)
{
str.Format("%d",i);
pDC->TextOut(2,360-30*i-5,str);
//绘制Y轴刻度
pDC->MoveTo(25,360-30*i);
pDC->LineTo(20,360-30*i);
}
//绘制X箭头
pDC->MoveTo(350,357);
pDC->LineTo(360,360);
pDC->LineTo(350,363);
//绘制Y箭头
pDC->MoveTo(17,30);
pDC->LineTo(20,20);//绘制左边箭头
pDC->LineTo(23,30);//绘制右边箭头
pDC->MoveTo(xi,yi);
pDC->LineTo(xe,ye);
//恢复以前的画笔
pDC->SelectObject(pOldPen);
//逐点比较法直线插补
while(sum>0)
{
if(F>=0)
{
F=F-m_y+m_y0;
pDC->Mov