📄 k-averagedlg.cpp
字号:
// k-averageDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "k-average.h"
#include "k-averageDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CkavDlg 对话框
CkavDlg::CkavDlg(CWnd* pParent /*=NULL*/)
: CDialog(CkavDlg::IDD, pParent)
, m_nAmount(1)
, m_nPCount(0)
, m_fEnd(FALSE)
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}
void CkavDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_nAmount);
DDV_MinMaxUInt(pDX, m_nAmount, 1, 100);
}
BEGIN_MESSAGE_MAP(CkavDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_LBUTTONDOWN()
ON_BN_CLICKED(IDOK, OnOk)
ON_BN_CLICKED(IDC_BUTTON2, OnClose)
ON_BN_CLICKED(IDC_BUTTON1, OnSort)
ON_BN_CLICKED(IDC_BUTTON3, OnAbout)
END_MESSAGE_MAP()
// CkavDlg 消息处理程序
BOOL CkavDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//初始化数据:
m_rectClient.SetRect(0,0,491,468);
for(int i=0;i<MAXPOINT;i++)
{
// m_SortPoint[i]=NULL;
m_pointCenter[i].SetPoint(0,0);
}
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO:在此添加额外的初始化代码
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CkavDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CkavDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
//指定客户区:
CWnd *pWnd=GetDlgItem(IDC_CLIENT);
CDC *pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(WHITE_BRUSH);
pControlDC->Rectangle(m_rectClient);
/*
pWnd->GetWindowRect(&m_rectClient);
ScreenToClient(&m_rectClient);
CPaintDC dc(this);
//绘制客户区:
CRgn rgn;
rgn.CreateRectRgnIndirect(&m_rectClient);
dc.SelectClipRgn(&rgn);
dc.Rectangle(m_rectClient);
CBushr brushNew,*pbrushOld;
brushNew.CreateSolidBrush(255,0,0);
pbrushOld=dc.SelectObject(&brushNew);
CPen penNew,*ppenOld;
penNew.CreatePen(PS_SOLID,3,RGB(200,200,200));
ppenOld=dc.SelectObject(&penNew);
*/
if(m_fEnd==TRUE)
{
for(unsigned int i=0;i<m_nPCount;i++)
{
pControlDC->MoveTo(m_pointCenter[m_poiPoint[i].m_nSort-1]);
pControlDC->LineTo(m_poiPoint[i].m_point);
}
m_fEnd=FALSE;
}
for(unsigned int i=0;i<m_nPCount&&i<MAXPOINT;i++)
{
pControlDC->Rectangle(m_poiPoint[i].m_point.x-5,m_poiPoint[i].m_point.y-5,m_poiPoint[i].m_point.x+5,m_poiPoint[i].m_point.y+5);
}
pWnd->ReleaseDC(pControlDC);
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CkavDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CkavDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
if(point.x<m_rectClient.right&&point.y<m_rectClient.bottom)
{
if(m_nPCount<=99)
{
m_poiPoint[m_nPCount].m_point=point;
m_nPCount++;
InvalidateRect(m_rectClient);
}
}
}
void CkavDlg::OnOk()
{
//OnOK();
}
void CkavDlg::OnClose()
{
CDialog::OnOK();
}
void CkavDlg::OnSort()
{
this->UpdateData(TRUE);
if(m_nPCount>=m_nAmount)
{
m_fEnd=FALSE;
//选定初始的m_nAmount个中心点:
for(unsigned int i=0;i<m_nAmount;i++)
{
m_pointCenter[i]=m_poiPoint[i].m_point;
}
//计算m_poiPoint[i].m_point与每一个中心点的距离,并把结果存储在distance[]数组中:
for(i=0;i<m_nPCount;i++)
{
this->OnDis(m_poiPoint[i]);
m_poiPoint[i].m_nSort=this->OnSmallest(m_distance);
}
while(OnCenter()==TRUE)
{
for(i=0;i<m_nPCount;i++)
{
OnDis(m_poiPoint[i]);
m_poiPoint[i].m_nSort=OnSmallest(m_distance);
}
}
m_fEnd=TRUE;
InvalidateRect(m_rectClient);
}
}
// 计算到每一个中心点的距离,并存储在数组中:
void CkavDlg::OnDis(CPoi poiPoint)
{
for(unsigned int m=0;m<m_nAmount;m++)
{
m_distance[m]=pow(poiPoint.m_point.x-m_pointCenter[m].x,2)+pow(poiPoint.m_point.y-m_pointCenter[m].y,2);
}
}
// 求出数组里最小距离的那个类号:
unsigned int CkavDlg::OnSmallest(double * dis)
{
unsigned k=0;
double a=dis[0];
for(unsigned int m=0;m<m_nAmount;m++)
{
if(a>dis[m])
{
a=dis[m];
k=m;
}
}
return k+1;
}
// //重新计算中心点:
BOOL CkavDlg::OnCenter(void)
{
unsigned int m;
int x,y;
CPoint lastcenter;
//为中心点是否变化设置标志:
BOOL change=FALSE;
for(unsigned int i=0;i<m_nAmount;i++)
{
//保留上一次的中心点:
lastcenter=m_pointCenter[i];
//计算新的中心点:
m=0;
x=y=0;
for(unsigned int j=0;j<m_nPCount;j++)
{
if(m_poiPoint[j].m_nSort==i+1)
{
m++;
x+=m_poiPoint[j].m_point.x;
y+=m_poiPoint[j].m_point.y;
}
}
m_pointCenter[i].x=x/m;
m_pointCenter[i].y=y/m;
//查看中心点是否变动:
if(lastcenter!=m_pointCenter[i])
change=TRUE;
}
return change;
}
void CkavDlg::OnAbout()
{
// TODO: 在此添加控件通知处理程序代码
CAboutDlg dlg;
dlg.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -