📄 xkdlg.cpp
字号:
// XKDlg.cpp : implementation file
//
#include "stdafx.h"
#include "XK.h"
#include "XKDlg.h"
#include <math.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()
/////////////////////////////////////////////////////////////////////////////
// CXKDlg dialog
CXKDlg::CXKDlg(CWnd* pParent /*=NULL*/)
: CDialog(CXKDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CXKDlg)
m_kselect = 0;
m_rselect = 0;
m_qx = 20.0f;
m_qy = 20.0f;
m_ex = 40.0f;
m_ey = 50.0f;
m_r = 30.0f;
m_bj = 0.4f;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CXKDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXKDlg)
DDX_Control(pDX, IDC_EDIT6, m_Cr);
DDX_Radio(pDX, IDC_RADIO1, m_kselect);
DDX_Radio(pDX, IDC_RADIO3, m_rselect);
DDX_Text(pDX, IDC_EDIT2, m_qx);
DDX_Text(pDX, IDC_EDIT3, m_qy);
DDX_Text(pDX, IDC_EDIT4, m_ex);
DDX_Text(pDX, IDC_EDIT5, m_ey);
DDX_Text(pDX, IDC_EDIT6, m_r);
DDX_Text(pDX, IDC_EDIT7, m_bj);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CXKDlg, CDialog)
//{{AFX_MSG_MAP(CXKDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTONYX, OnButtonyx)
ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
ON_WM_DRAWITEM()
ON_BN_CLICKED(IDC_BUTTONSX, OnButtonsx)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXKDlg message handlers
BOOL CXKDlg::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
m_Cr.EnableWindow(false);
return TRUE; // return TRUE unless you set the focus to a control
}
void CXKDlg::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 CXKDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CXKDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CXKDlg::OnButtonyx()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
CString str;
CPen penr;
penr.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen peng;
peng.CreatePen(PS_SOLID,1,RGB(255,255,255));
UpdateData(true);
if(m_qx>95||m_qy>90||m_ex>95||m_ey>90){
MessageBox("图形超出画图区域,请不要超过90mm","警告",MB_ICONINFORMATION);
return;
}
int x0=320;
int y0=286;
int qx=3*int(m_qx);//起点x坐标
int qy=3*int(m_qy);//起点y坐标
int ex=3*int(m_ex);//终点x坐标
int ey=3*int(m_ey);//终点y坐标
int r=3*int(m_r);//半径
int bj=int(7*m_bj);//步距
float xl;
xl=(m_ey-m_qy)/(m_ex-m_qx);//直线的斜率
float lo=sqrt((ex-qx)*(ex-qx)+(ey-qy)*(ey-qy));//直线的长度
int x=0;
int y=0;
int i=1;
int n=int((ex-qx)/bj);//插补的次数
CRect surect;
CPoint sp1,sp2;
if(m_kselect==0){//逐点比较法
if(m_rselect==0){//插补直线
dc.SelectObject(&penr);
dc.MoveTo(x0+qx,y0-qy);
dc.LineTo(x0+ex,y0-ey);
dc.SelectObject(&peng);
x=qx+1;
y=qy+1;
dc.MoveTo(x0+x,y0-y);
x=x+bj;
dc.LineTo(x0+x,y0-y);
while(i<n){
if((y-qy)>int(xl*(x-qx))){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else if((y-qy)<=int(xl*(x-qx))){
y=y+bj;
dc.LineTo(x0+x,y0-y);
}
}
}
else if(m_rselect==1){//插补圆弧
float j1=atanf(xl);
float j2=acosf(0.5*lo/r);
float j3=j2-j1;
int ox=int(qx+r*cosf(j3));
int oy=int(qy-r*sinf(j3));
dc.SelectObject(&penr);
surect.SetRect(x0+ox-r,y0-oy-r,x0+ox+r,y0-oy+r);
sp1.x=x0+qx;
sp1.y=y0-qy;
sp2.x=x0+ex;
sp2.y=y0-ey;
dc.Arc(surect,sp2,sp1);
dc.MoveTo(x0+ox-5,y0-oy);
dc.LineTo(x0+ox+6,y0-oy);
dc.MoveTo(x0+ox,y0-oy-5);
dc.LineTo(x0+ox,y0-oy+5);
dc.SelectObject(&peng);
x=qx+1;
y=qy+1;
dc.MoveTo(x0+x,y0-y);
y=y+bj;
dc.LineTo(x0+x,y0-y);
i=0;
while(i<=n){
if(y<=oy&&x<=ox){//第三象限
if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
y=y+bj;
dc.LineTo(x0+x,y0-y);
}
else{
x=x-bj;
dc.LineTo(x0+x,y0-y);
i--;
}
}
else if(y>=oy&&x<=ox){//第二象限
if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else{
y=y+bj;
dc.LineTo(x0+x,y0-y);
}
}
else if(y>=oy&&x>=ox){//第一象限
if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
y=y-bj;
dc.LineTo(x0+x,y0-y);
}
else{
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
}
else{//第四象限
if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else{
y=y-bj;
dc.LineTo(x0+x,y0-y);
}
}
}
}
}
float f1,f2,f3;
float temp=0;
if(m_kselect==1){//改进逐点比较法
if(m_rselect==0){//插补直线
dc.SelectObject(&penr);
dc.MoveTo(x0+qx,y0-qy);
dc.LineTo(x0+ex,y0-ey);
dc.SelectObject(&peng);
x=qx;
y=qy;
dc.MoveTo(x0+x,y0-y);
x=x+bj;
dc.LineTo(x0+x,y0-y);
i=1;
while(i<n){
f1=fabs(xl*(x+bj-qx)+qy-y);
f2=fabs(y+bj-(xl*(x-qx)+qy));
f3=fabs(y+bj-(xl*(x+bj-qx)+qy));
if(f1<=f2)
temp=f1;
else
temp=f2;
if(f3<=temp)
temp=f3;
if(temp==f1){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else if(temp==f2){
y=y+bj;
dc.LineTo(x0+x,y0-y);
}
else if(temp==f3){
x=x+bj;
y=y+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
}
}
else if(m_rselect==1){//插补圆弧
float j1=atanf(xl);
float j2=acosf(0.5*lo/r);
float j3=j2-j1;
int ox=int(qx+r*cosf(j3));
int oy=int(qy-r*sinf(j3));
dc.SelectObject(&penr);
surect.SetRect(x0+ox-r,y0-oy-r,x0+ox+r,y0-oy+r);
sp1.x=x0+qx;
sp1.y=y0-qy;
sp2.x=x0+ex;
sp2.y=y0-ey;
dc.Arc(surect,sp2,sp1);
dc.MoveTo(x0+ox-5,y0-oy);
dc.LineTo(x0+ox+6,y0-oy);
dc.MoveTo(x0+ox,y0-oy-5);
dc.LineTo(x0+ox,y0-oy+5);
dc.SelectObject(&peng);
x=qx+1;
y=qy+1;
dc.MoveTo(x0+x,y0-y);
y=y+bj;
dc.LineTo(x0+x,y0-y);
i=0;
while(i<=n){
if(y<=oy&&x<=ox){//第三象限
f1=fabs((y-oy)*(y-oy)+(x-bj-ox)*(x-bj-ox)-r*r);
f2=fabs((y+bj-oy)*(y+bj-oy)+(x-ox)*(x-ox)-r*r);
f3=fabs((y+bj-oy)*(y+bj-oy)+(x-bj-ox)*(x-bj-ox)-r*r);
if(f1<=f2)
temp=f1;
else
temp=f2;
if(f3<temp)
temp=f3;
if(temp==f1){
x=x-bj;
dc.LineTo(x0+x,y0-y);
i--;
}
else if(temp==f2){
y=y+bj;
dc.LineTo(x0+x,y0-y);
}
else if(temp==f3){
x=x-bj;
y=y+bj;
dc.LineTo(x0+x,y0-y);
i--;
}
}
else if(y>=oy&&x<=ox){//第二象限
f1=fabs((y-oy)*(y-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
f2=fabs((y+bj-oy)*(y+bj-oy)+(x-ox)*(x-ox)-r*r);
f3=fabs((y+bj-oy)*(y+bj-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
if(f1<=f2)
temp=f1;
else
temp=f2;
if(f3<temp)
temp=f3;
if(temp==f1){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else if(temp==f2){
y=y+bj;
dc.LineTo(x0+x,y0-y);
}
else if(temp==f3){
x=x+bj;
y=y+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
}
else if(y>=oy&&x>=ox){//第一象限
f1=fabs((y-oy)*(y-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
f2=fabs((y-bj-oy)*(y-bj-oy)+(x-ox)*(x-ox)-r*r);
f3=fabs((y-bj-oy)*(y-bj-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
if(f1<=f2)
temp=f1;
else
temp=f2;
if(f3<temp)
temp=f3;
if(temp==f1){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else if(temp==f2){
y=y-bj;
dc.LineTo(x0+x,y0-y);
}
else{
x=x+bj;
y=y-bj;
dc.LineTo(x0+x,y0-y);
i++;
}
}
else{//第四象限
f1=fabs((y-oy)*(y-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
f2=fabs((y-bj-oy)*(y-bj-oy)+(x-ox)*(x-ox)-r*r);
f3=fabs((y-bj-oy)*(y-bj-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
if(f1<=f2)
temp=f1;
else
temp=f2;
if(f3<temp)
temp=f3;
if(temp==f1){
x=x+bj;
dc.LineTo(x0+x,y0-y);
i++;
}
else if(temp==f2){
y=y-bj;
dc.LineTo(x0+x,y0-y);
}
else{
x=x+bj;
y=y-bj;
dc.LineTo(x0+x,y0-y);
i++;
}
}
}
}
}
}
void CXKDlg::OnRadio3()
{
// TODO: Add your control notification handler code here
m_Cr.EnableWindow(false);
}
void CXKDlg::OnRadio4()
{
// TODO: Add your control notification handler code here
m_Cr.EnableWindow(true);
}
void CXKDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CXKDlg::OnButtonsx()
{
// TODO: Add your control notification handler code here
Invalidate(true);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -