📄 winsvmdlg.cpp
字号:
// winsvmDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "winsvm.h"
#include "winsvmDlg.h"
#include ".\winsvmdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
extern CString info;
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
//CwinsvmDlg * pApp = NULL;
void lpRecvProc(LPVOID lpParam)//需要放在顶部
{
CwinsvmDlg * pmyview = (CwinsvmDlg*)lpParam;
pmyview->svmtrain();
// catch(char * stre)
//{
// AfxEndThread(0);
// pmyview->m_mythread = NULL;//线程
//}
pmyview->nr_fold = pmyview->cross_validation = 0;
pmyview->GetDlgItem(IDC_BUTTON4)->EnableWindow(false);
pmyview->GetDlgItem(IDC_BUTTON5)->EnableWindow(false);
pmyview->GetDlgItem(IDC_BUTTON6)->EnableWindow(false);
pmyview->GetDlgItem(IDC_BUTTON1)->EnableWindow();
}
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()
// CwinsvmDlg 对话框
BEGIN_DHTML_EVENT_MAP(CwinsvmDlg)
DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK)
DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel)
DHTML_EVENT_ONCLICK(_T("ButtonHelp"), OnButtonHelp)
END_DHTML_EVENT_MAP()
CwinsvmDlg::CwinsvmDlg(CWnd* pParent /*=NULL*/)
: CDHtmlDialog(CwinsvmDlg::IDD, CwinsvmDlg::IDH, pParent)
, cross_validation(0)
, nr_fold(0)
{
m_guyihua=NULL;//非模态对话框
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_mythread = NULL;//线程
}
void CwinsvmDlg::DoDataExchange(CDataExchange* pDX)
{
CDHtmlDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CwinsvmDlg, CDHtmlDialog)
ON_WM_SYSCOMMAND()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
ON_WM_SIZE()
ON_MESSAGE(UM_NOTIFY,OnMyNotify)//这才是地方
ON_COMMAND(IDM_RESTORE, OnMyRestore)
ON_COMMAND(IDM_ABOUTBOX, OnAbout)
ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
END_MESSAGE_MAP()
// CwinsvmDlg 消息处理程序
BOOL CwinsvmDlg::OnInitDialog()
{
CDHtmlDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// 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); // 设置小图标
// ShowWindow(SW_MINIMIZE);
sprintf(m_NotifyIconData.szTip,"winsvm2007");
m_NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
m_NotifyIconData.hIcon = m_hIcon;
m_NotifyIconData.hWnd = GetSafeHwnd();
m_NotifyIconData.uCallbackMessage = UM_NOTIFY;
m_NotifyIconData.uFlags = NIF_MESSAGE|NIF_TIP|NIF_ICON;
m_NotifyIconData.uID = IDIC_NOTIFY;
Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData);//在状态栏加个图标,接受鼠标消息
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CwinsvmDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDHtmlDialog::OnSysCommand(nID, lParam);
}
}
void CwinsvmDlg::OnDestroy()
{
if( m_mythread && GetExitCodeThread( m_mythread->m_hThread, &dwCode ) )
{
if( dwCode == STILL_ACTIVE )
{
TerminateThread( m_mythread->m_hThread, 0 );
CloseHandle( m_mythread->m_hThread );
m_mythread = NULL;
}
}
WinHelp(0L, HELP_QUIT);
CDHtmlDialog::OnDestroy();
Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData);//去掉状态栏消息
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CwinsvmDlg::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
{
CDHtmlDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CwinsvmDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
HRESULT CwinsvmDlg::OnButtonOK(IHTMLElement* /*pElement*/)
{
OnOK();
return S_OK;
}
HRESULT CwinsvmDlg::OnButtonCancel(IHTMLElement* /*pElement*/)
{
OnCancel();
return S_OK;
}
HRESULT CwinsvmDlg::OnButtonHelp(IHTMLElement* /*pElement*/)
{
//::WinHelp(m_hWnd,"WINSVM.HLP",HELP_CONTENTS,0);
OnHelp();
return S_OK;
}
void CwinsvmDlg::OnBnClickedButton1()
{
m_pMyPropSheet=new Cxuanxiang;
if(m_pMyPropSheet->DoModal()==IDOK)
{
param = m_pMyPropSheet->param0;
nr_fold = m_pMyPropSheet->m_nfold;//-v n: n-fold交互检验模式
if(nr_fold != 0)
cross_validation = 1;
// determine filenames
strcpy(input_file_name, m_pMyPropSheet->m_filename);
strcpy(model_file_name, m_pMyPropSheet->m_filename1);
delete m_pMyPropSheet;
m_pMyPropSheet=NULL;
//线程运行
if( m_mythread && GetExitCodeThread( m_mythread->m_hThread, &dwCode ) )
{
if( dwCode == STILL_ACTIVE )
{
TerminateThread( m_mythread->m_hThread, 0 );
CloseHandle( m_mythread->m_hThread );
m_mythread = NULL;
}
}
m_mythread=AfxBeginThread( (AFX_THREADPROC)lpRecvProc, this );
GetDlgItem(IDC_BUTTON4)->EnableWindow();
GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
GetDlgItem(IDC_BUTTON6)->EnableWindow();
return;
};
delete m_pMyPropSheet;
m_pMyPropSheet=NULL;
}
// 训练函数
void CwinsvmDlg::svmtrain()
{
const char *error_msg;
//Sleep(60000);//调试用
if (read_problem(input_file_name)==0)
return;//应该打不开返回推出。
error_msg = svm_check_parameter(&prob,¶m);
if(error_msg)
{
//fprintf(stderr,"Error: %s\n",error_msg);
MessageBox(error_msg);
return ;
}
if(cross_validation)
{
do_cross_validation();
}
else
{
model = svm_train(&prob,¶m);
svm_save_model(model_file_name,model);
svm_destroy_model(model);
}
svm_destroy_param(¶m);
free(prob.y);
free(prob.x);
free(x_space);
MessageBox(info);
info.Empty();
}
int CwinsvmDlg::read_problem(const char *filename)
{
int elements, max_index, i, j;
FILE *fp = fopen(filename,"r");
if(fp == NULL)
{
//fprintf(stderr,"can't open input file %s\n",filename);
CString strs;
strs.Format("不能打开文件 %s\n",filename);
MessageBox(strs);
return 0;
}
prob.l = 0;
elements = 0;
while(1)
{
int c = fgetc(fp);
switch(c)
{
case '\n':
++prob.l;
// fall through,
// count the '-1' element
case ':':
++elements;
break;
case EOF:
goto out;
default:
;
}
}
out:
rewind(fp);
prob.y = Malloc(double,prob.l);
prob.x = Malloc(struct svm_node *,prob.l);
x_space = Malloc(struct svm_node,elements);
max_index = 0;
j=0;
for(i=0;i<prob.l;i++)
{
double label;
prob.x[i] = &x_space[j];
fscanf(fp,"%lf",&label);
prob.y[i] = label;
while(1)
{
int c;
do {
c = getc(fp);
if(c=='\n') goto out2;
} while(isspace(c));
ungetc(c,fp);
fscanf(fp,"%d:%lf",&(x_space[j].index),&(x_space[j].value));
++j;
}
out2:
if(j>=1 && x_space[j-1].index > max_index)
max_index = x_space[j-1].index;
x_space[j++].index = -1;
}
if(param.gamma == 0)
param.gamma = 1.0/max_index;
if(param.kernel_type == PRECOMPUTED)
for(i=0;i<prob.l;i++)
{
if (prob.x[i][0].index != 0)
{
//fprintf(stderr,"Wrong input format: first column must be 0:sample_serial_number\n");
//exit(1);
MessageBox("错误的输入格式: 样本序列号第一列必须为零\n");
return 0 ;
}
if ((int)prob.x[i][0].value <= 0 || (int)prob.x[i][0].value > max_index)
{
//fprintf(stderr,"Wrong input format: sample_serial_number out of range\n");
//exit(1);
MessageBox("错误的输入格式: 样本序列号超出范围\n");
return 0 ;
}
}
fclose(fp);
return 1;
}
void CwinsvmDlg::do_cross_validation(void)
{
int i;
int total_correct = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -