|
// appDlg.cpp: 实现文件
|
//
|
|
#include "pch.h"
|
#include "framework.h"
|
#include "app.h"
|
#include "appDlg.h"
|
#include "afxdialogex.h"
|
#include "level2DataDlg.h"
|
#include "codesDataDlog.h"
|
#include "THSActionUtil.h"
|
#include "NetWorkUtil.h"
|
#include "GUITool.h"
|
#include "tool.h"
|
#include "JsonUtil.h"
|
|
#ifdef _DEBUG
|
#define new DEBUG_NEW
|
#endif
|
#include <string>
|
|
#ifdef _DEBUG
|
#define new DEBUG_NEW
|
#endif
|
|
|
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
|
|
class CAboutDlg : public CDialogEx
|
{
|
|
public:
|
CAboutDlg();
|
|
// 对话框数据
|
#ifdef AFX_DESIGN_TIME
|
enum { IDD = IDD_ABOUTBOX };
|
#endif
|
|
protected:
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
|
|
// 实现
|
protected:
|
DECLARE_MESSAGE_MAP()
|
};
|
|
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
|
{
|
}
|
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
{
|
CDialogEx::DoDataExchange(pDX);
|
}
|
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
|
END_MESSAGE_MAP()
|
|
|
// CappDlg 对话框
|
|
RecognitionManager* CappDlg::recognitionManager;
|
|
CappDlg::CappDlg(CWnd* pParent /*=nullptr*/)
|
: CDialogEx(IDD_APP_DIALOG, pParent)
|
{
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
socketManager = new SocketManager(CappDlg::OnActionCallback, this);
|
RecognitionUtil::init();
|
ImgUtil::init();
|
capture = new ScreenDataCapture();
|
recognitionManager = new RecognitionManager();
|
}
|
|
void CappDlg::DoDataExchange(CDataExchange* pDX)
|
{
|
CDialogEx::DoDataExchange(pDX);
|
}
|
|
BEGIN_MESSAGE_MAP(CappDlg, CDialogEx)
|
ON_WM_SYSCOMMAND()
|
ON_WM_PAINT()
|
ON_WM_QUERYDRAGICON()
|
ON_BN_CLICKED(IDC_BUTTON6, &CappDlg::OnBnClickedButton6)
|
ON_BN_CLICKED(IDC_BUTTON10, &CappDlg::OnBnClickedButton10)
|
ON_BN_CLICKED(IDC_BUTTON9, &CappDlg::OnBnClickedButton9)
|
ON_BN_CLICKED(IDC_BUTTON4, &CappDlg::OnBnClickedButton4)
|
ON_BN_CLICKED(IDC_BUTTON20, &CappDlg::OnBnClickedButton20)
|
ON_BN_CLICKED(IDC_BUTTON5, &CappDlg::OnBnClickedButton5)
|
ON_BN_CLICKED(IDC_BUTTON7, &CappDlg::OnBnClickedButton7)
|
ON_BN_CLICKED(IDC_BUTTON8, &CappDlg::OnBnClickedButton8)
|
END_MESSAGE_MAP()
|
|
|
// CappDlg 消息处理程序
|
|
BOOL CappDlg::OnInitDialog()
|
{
|
CDialogEx::OnInitDialog();
|
|
// 将“关于...”菜单项添加到系统菜单中。
|
|
// IDM_ABOUTBOX 必须在系统命令范围内。
|
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
|
ASSERT(IDM_ABOUTBOX < 0xF000);
|
|
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
if (pSysMenu != nullptr)
|
{
|
BOOL bNameValid;
|
CString strAboutMenu;
|
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
|
ASSERT(bNameValid);
|
if (!strAboutMenu.IsEmpty())
|
{
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
}
|
}
|
|
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
|
// 执行此操作
|
SetIcon(m_hIcon, TRUE); // 设置大图标
|
SetIcon(m_hIcon, FALSE); // 设置小图标
|
|
// TODO: 在此添加额外的初始化代码
|
CString st;
|
char ip[32];
|
NetWorkUtil::get_localhost_ip(ip);
|
|
CString ipStr(ip);
|
|
st.Format(_T("本机IP:%s"), ipStr);
|
GetDlgItem(IDC_STATIC3)->SetWindowTextW(st);
|
|
if (!capture->isInited())
|
{
|
try {
|
capture->init(OnDataCallback, this);
|
}
|
catch (string st) {
|
}
|
}
|
|
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
|
}
|
|
void CappDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
{
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
{
|
CAboutDlg dlgAbout;
|
dlgAbout.DoModal();
|
}
|
else
|
{
|
CDialogEx::OnSysCommand(nID, lParam);
|
}
|
}
|
|
// 如果向对话框添加最小化按钮,则需要下面的代码
|
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
|
// 这将由框架自动完成。
|
|
void CappDlg::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
|
{
|
CDialogEx::OnPaint();
|
}
|
}
|
|
void CappDlg::OnClose() {
|
MessageBox(_T("内容"), _T("标题"), MB_OKCANCEL);
|
CDialogEx::OnClose();
|
}
|
|
//当用户拖动最小化窗口时系统调用此函数取得光标
|
//显示。
|
HCURSOR CappDlg::OnQueryDragIcon()
|
{
|
return static_cast<HCURSOR>(m_hIcon);
|
}
|
|
|
void CappDlg::OnDataCallback(int index, string code, list<TradeData> dataList, void* context) {
|
//转为json
|
CappDlg* app = (CappDlg*)context;
|
//cout << "回调:" << std::this_thread::get_id() << ":" << index << endl;
|
CButton* btn = (CButton*)app->GetDlgItem(IDC_CHECK1);
|
bool check = btn->GetCheck();
|
if (check) {
|
string data = JsonUtil::loadL2Data(0, index, code, dataList);
|
clock_t time_start = clock();
|
try {
|
app->socketManager->sendMsg(index, data.c_str());
|
}
|
catch (string st) {
|
//重新连接服务器
|
app->socketManager->resetClient(index);
|
app->socketManager->Connect(index);
|
}
|
cout<<"*****数据处理时间:"<<(clock()- time_start)<<endl;
|
}
|
}
|
|
|
bool CappDlg::OnActionCallback(string data, void* context) {
|
//转为json
|
CappDlg* app = (CappDlg*)context;
|
cout << "action回调:" << std::this_thread::get_id() << ":" << data << endl;
|
//解析命令
|
Json::Value root = JsonUtil::parseJson(data);
|
if (root["action"].asString() == "setGPCode") {
|
//设置股票代码
|
int index = root["data"]["index"].asInt();
|
string code = root["data"]["code"].asString();
|
string quickCode = "5";
|
quickCode.append(to_string(index + 1));
|
list<string> codeList;
|
if (code.length() > 0)
|
{
|
codeList.push_back(code);
|
}
|
try {
|
|
if (!app->capture->isInited()) {
|
throw string("采集器尚未初始化");
|
}
|
|
//暂停采集
|
app->capture->stop(index);
|
|
bool result = THSActionUtil::setGP(quickCode, codeList, recognitionManager);
|
if (!result) {
|
throw string("设置版块监控的GP失败");
|
}
|
|
THSActionUtil::setListenL2GP(index, code, recognitionManager);
|
map<int, string> results = THSActionUtil::getListenL2GPCodes(recognitionManager);
|
//设置代码
|
for (map<int, string>::iterator ele = results.begin();ele != results.end();ele++) {
|
int key = (*ele).first;
|
string value = (*ele).second;
|
app->capture->setGPCode(key, value);
|
}
|
}
|
catch (string e) {
|
//CString msg(e.c_str());
|
//AfxMessageBox(msg);
|
throw e;
|
}catch (...) {
|
throw string("未知错误");
|
}
|
|
//恢复采集
|
app->capture->start(index);
|
}
|
return true;
|
}
|
|
|
|
void CappDlg::OnBnClickedButton1()
|
{
|
MessageBox(_T("内容"), _T("标题"), MB_OKCANCEL);
|
}
|
|
|
void CappDlg::OnBnClickedButton3()
|
{
|
socketManager->sendMsg(0, "0");
|
socketManager->sendMsg(1, "1");
|
socketManager->sendMsg(2, "2");
|
socketManager->sendMsg(3, "3");
|
socketManager->sendMsg(4, "4");
|
socketManager->sendMsg(5, "5");
|
socketManager->sendMsg(6, "6");
|
socketManager->sendMsg(7, "7");
|
}
|
|
|
void CappDlg::OnBnClickedButton2()
|
{
|
for (int i = 0;i < 8;i++)
|
{
|
socketManager->disConnect(i);
|
}
|
}
|
|
|
|
|
|
//服务器检测
|
void CappDlg::OnBnClickedButton6()
|
{
|
int num = socketManager->getClientsNum();
|
int scount = 0;
|
for (int i = 0; i < num; i++)
|
{
|
if (socketManager->sendMsg(i, "test")) {
|
scount++;
|
}
|
}
|
|
CString msg;
|
msg.Format(_T("检测结果:%d/%d"), scount, num);
|
MessageBox(msg, _T("通道检测结果"), MB_OK);
|
|
}
|
|
|
void CappDlg::OnBnClickedButton10()
|
{
|
socketManager->disConnect();
|
try {
|
socketManager->init(CappDlg::OnActionCallback, this);
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
}
|
int scount = 0;
|
int num = socketManager->getClientsNum();
|
for (int i = 0; i < num; i++)
|
{
|
if (socketManager->sendMsg(i, "test")) {
|
scount++;
|
}
|
}
|
|
|
CString msg;
|
msg.Format(_T("链接结果:%d/%d"), scount, num);
|
MessageBox(msg, _T("通道链接结果"), MB_OK);
|
}
|
|
//识别测试
|
void CappDlg::OnBnClickedButton9()
|
{
|
if (!capture->isInited())
|
{
|
try {
|
capture->init(OnDataCallback, this);
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
}
|
}
|
clock_t time = clock();
|
|
CString path= GUITool::selectImage();
|
std:string p = cstring2String(path);
|
if (p.length() <= 0) {
|
return;
|
}
|
list<TradeData> result = capture->captureLevel2TradeData(cv::imread(p), 0);
|
time = clock() - time;
|
|
Clevel2DataDlg::level2Data = { time, result };
|
Clevel2DataDlg dlg;
|
dlg.DoModal();
|
}
|
|
|
//截图识别
|
void CappDlg::OnBnClickedButton4()
|
{
|
if (!capture->isInited())
|
{
|
try {
|
capture->init(OnDataCallback, this);
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
}
|
}
|
clock_t time = clock();
|
|
CString path = GUITool::selectImage();
|
std:string p = cstring2String(path);
|
if (p.length() <= 0) {
|
return;
|
}
|
list<TradeData> result = capture->captureLevel2TradeData(cv::imread(p), 0);
|
time = clock() - time;
|
|
Clevel2DataDlg::level2Data = { time, result };
|
Clevel2DataDlg dlg;
|
dlg.DoModal();
|
}
|
|
//环境检测
|
void CappDlg::OnBnClickedButton20()
|
{
|
try {
|
THSActionUtil::checkEnv();
|
AfxMessageBox(_T("检测通过"));
|
}
|
catch (const string& st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
}
|
}
|
|
|
//启动任务
|
void CappDlg::OnBnClickedButton5()
|
{
|
//检测环境
|
|
try {
|
THSActionUtil::checkEnv();
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
return;
|
}
|
|
CButton* btn = (CButton*)GetDlgItem(IDC_BUTTON5);
|
|
if (!capture->isInited())
|
{
|
try {
|
capture->init(OnDataCallback, this);
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
return;
|
}
|
}
|
if (!capture->isRunning()) {
|
|
try {
|
map<int, string> result = THSActionUtil::getListenL2GPCodes(recognitionManager);
|
//设置代码
|
for (map<int, string>::iterator ele = result.begin();ele != result.end();ele++) {
|
int key= (*ele).first;
|
string value = (*ele).second;
|
capture->setGPCode(key,value);
|
}
|
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
return;
|
}
|
|
//刷新窗口句柄
|
capture->refreshHWND();
|
//句柄初始化
|
capture->start();
|
capture->startAll();
|
btn->SetWindowText(_T("暂停识别任务"));
|
}
|
else {
|
capture->stop();
|
capture->stopAll();
|
btn->SetWindowText(_T("启动识别任务"));
|
}
|
|
}
|
|
|
//股票代码识别
|
void CappDlg::OnBnClickedButton7()
|
{
|
if (!capture->isInited())
|
{
|
try {
|
capture->init(OnDataCallback, this);
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
return;
|
}
|
}
|
list<CString> paths= GUITool::selectMulImages();
|
std::list<string> fResultList;
|
|
for (list<CString>::iterator ele = paths.begin();ele != paths.end();ele++) {
|
CString path = *ele;
|
std:string p = cstring2String(path);
|
std::list<string> resultList = THSActionUtil::recognitionGPCode(cv::imread(p), recognitionManager);
|
for (std::list<string>::iterator ele1 = resultList.begin();ele1 != resultList.end();ele1++) {
|
bool contains = false;
|
for (std::list<string>::iterator e = fResultList.begin();e != fResultList.end();e++) {
|
if (*e == *ele1) {
|
contains = true;
|
break;
|
}
|
}
|
if (!contains) {
|
fResultList.push_back(*ele1);
|
}
|
}
|
}
|
codesDataDlog::codeData = fResultList;
|
codesDataDlog::upload = false;
|
codesDataDlog dlg;
|
dlg.DoModal();
|
}
|
|
//截图上传股票代码
|
void CappDlg::OnBnClickedButton8()
|
{
|
//
|
if (!capture->isInited())
|
{
|
try {
|
capture->init(OnDataCallback, this);
|
}
|
catch (string st) {
|
CString msg(st.c_str());
|
AfxMessageBox(msg);
|
return;
|
}
|
}
|
list<CString> paths = GUITool::selectMulImages();
|
std::list<string> fResultList;
|
|
for (list<CString>::iterator ele = paths.begin();ele != paths.end();ele++) {
|
CString path = *ele;
|
std:string p = cstring2String(path);
|
std::list<string> resultList = THSActionUtil::recognitionGPCode(cv::imread(p), recognitionManager);
|
for (std::list<string>::iterator ele1 = resultList.begin();ele1 != resultList.end();ele1++) {
|
bool contains = false;
|
for (std::list<string>::iterator e = fResultList.begin();e != fResultList.end();e++) {
|
if (*e == *ele1) {
|
contains = true;
|
break;
|
}
|
}
|
if (!contains) {
|
fResultList.push_back(*ele1);
|
}
|
}
|
}
|
codesDataDlog::codeData = fResultList;
|
codesDataDlog::upload = TRUE;
|
codesDataDlog dlg;
|
dlg.DoModal();
|
}
|