// PositionDlg.cpp: 实现文件
|
//
|
|
#include "common/pch.h"
|
#include "PositionDlg.h"
|
#include "afxdialogex.h"
|
#include "resource.h"
|
#include "../common/NetworkApi.h"
|
#include "../common/JsonUtil.h"
|
#include "../common/StringUtil.h"
|
#include <thread>
|
#include <map>
|
|
|
|
// PositionDlg 对话框
|
|
IMPLEMENT_DYNAMIC(PositionDlg, CDialogEx)
|
|
PositionDlg::PositionDlg(CWnd* pParent /*=nullptr*/)
|
: CDialogEx(IDD_DIALOG_POSITION, pParent)
|
{
|
|
}
|
|
PositionDlg::~PositionDlg()
|
{
|
}
|
|
void PositionDlg::updatePositions()
|
{
|
std::thread t1(requestAllPositions, this);
|
t1.detach();
|
}
|
|
void PositionDlg::DoDataExchange(CDataExchange* pDX)
|
{
|
CDialogEx::DoDataExchange(pDX);
|
DDX_Control(pDX, IDC_LIST_POSITION, listPositionCtrl);
|
}
|
|
|
void PositionDlg::requestAllPositions(PositionDlg* context)
|
{
|
try {
|
|
|
|
string result = NetworkApi::get_all_positions();
|
auto doc = JsonUtil::parseUTF16(result);
|
list<string> codes;
|
if (doc[L"code"].GetInt() == 0) {
|
auto data = doc[L"data"].GetArray();
|
context->positionList.clear();
|
for (int i = 0; i < data.Size(); i++) {
|
auto item = data[i].GetObjectW();
|
string code = StringUtil::cstring2String(item[L"code"].GetString());
|
codes.push_back(code);
|
CodePosition codePosition;
|
codePosition.total = item[L"total"].GetInt();
|
codePosition.available = item[L"available"].GetInt();
|
codePosition.code = code;
|
codePosition.name = item[L"code_name"].GetString();
|
codePosition.costPrice = item[L"cost_price"].GetFloat();
|
if (item.HasMember(L"volume_rate")) {
|
codePosition.volumeRate = item[L"volume_rate"].GetFloat();
|
}
|
else {
|
codePosition.volumeRate = 0;
|
}
|
codePosition.sell_rules_count = 0;
|
context->positionList.push_back(codePosition);
|
}
|
|
// 获取代码同板块的涨停数量
|
result = NetworkApi::get_same_block_limit_up_codes_count(codes);
|
doc = JsonUtil::parseUTF16(result);
|
|
if (doc.IsObject()) {
|
if (doc[L"code"].GetInt() == 0) {
|
auto data = doc[L"data"].GetObjectW();
|
for (auto it = data.MemberBegin(); it != data.MemberEnd(); ++it) {
|
auto code = it->name.GetString();
|
auto blocks = it->value.GetObjectW();
|
int codeCount = 0;
|
for (auto bit = blocks.MemberBegin(); bit != blocks.MemberEnd(); ++bit) {
|
auto count = bit->value.GetInt();
|
if (count > codeCount) {
|
codeCount = count;
|
}
|
}
|
context->limitUpCodeCountMap[StringUtil::cstring2String(code)] = codeCount;
|
}
|
}
|
cout << result << endl;
|
}
|
|
|
context->listPositionCtrl.SetRedraw(false);
|
context->listPositionCtrl.DeleteAllItems();
|
|
int index = 0;
|
for (list<CodePosition>::iterator e = context->positionList.begin(); e != context->positionList.end(); e++) {
|
CodePosition position = *e;
|
context->listPositionCtrl.InsertItem(index, CString(position.code.c_str()));
|
context->listPositionCtrl.SetItemText(index, 0, position.name );
|
CString volumeRate = CString(StringUtil::toString(position.volumeRate * 100, 0).c_str());
|
volumeRate.Append(L"%");
|
context->listPositionCtrl.SetItemText(index, 1, volumeRate);
|
|
/*CString total=L"¥";
|
total.Append(CString(StringUtil::toString(position.total * position.costPrice, 1).c_str()));
|
context->listPositionCtrl.SetItemText(index, 3, total);*/
|
|
if (context->limitUpCodeCountMap.find(position.code) != context->limitUpCodeCountMap.end()) {
|
context->listPositionCtrl.SetItemText(index, 3, to_wstring(context->limitUpCodeCountMap[position.code]).c_str());
|
}
|
else {
|
context->listPositionCtrl.SetItemText(index, 3, L"0");
|
}
|
|
|
|
|
CString available = L"¥";
|
available.Append(CString(StringUtil::toString(position.available * position.costPrice, 1).c_str()));
|
/* available.Append(L" / ");
|
available.Append(to_wstring(position.available).c_str());*/
|
|
context->listPositionCtrl.SetItemText(index, 2, available);
|
|
|
if (position.available==0) {
|
context->listPositionCtrl.SetItemData(index, 0);
|
}
|
else {
|
context->listPositionCtrl.SetItemData(index, 1);
|
}
|
|
index++;
|
}
|
context->listPositionCtrl.SetRedraw(true);
|
}
|
|
|
}
|
catch (...) {
|
|
}
|
}
|
|
|
BEGIN_MESSAGE_MAP(PositionDlg, CDialogEx)
|
|
|
ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_POSITION, &PositionDlg::OnNMCustomdrawListRules)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &PositionDlg::OnBnClickedButton1)
|
END_MESSAGE_MAP()
|
|
|
// PositionDlg 消息处理程序
|
|
|
BOOL PositionDlg::OnInitDialog()
|
{
|
CDialogEx::OnInitDialog();
|
// 初始化列表
|
listPositionCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | WS_HSCROLL);
|
listPositionCtrl.ModifyStyle(LVS_SINGLESEL, LVS_REPORT);
|
//listPositionCtrl.SetRowHeigt(30);
|
|
CRect rect;
|
listPositionCtrl.GetClientRect(&rect);
|
|
int unitSize = (rect.Width() - 5) / 3.5f;
|
listPositionCtrl.InsertColumn(0, _T("名称"), LVCFMT_LEFT, unitSize * 0.9, 0);
|
listPositionCtrl.InsertColumn(1, _T("量比"), LVCFMT_LEFT, unitSize * 0.6, 1);
|
listPositionCtrl.InsertColumn(2, _T("剩余持仓"), LVCFMT_LEFT, unitSize * 1, 2);
|
listPositionCtrl.InsertColumn(3, _T("同板块涨停"), LVCFMT_LEFT, unitSize * 1, 3);
|
listPositionCtrl.AutoColumn();
|
|
std::thread t1(requestAllPositions, this);
|
t1.detach();
|
return TRUE; // return TRUE unless you set the focus to a control
|
// 异常: OCX 属性页应返回 FALSE
|
}
|
|
|
void PositionDlg::OnNMCustomdrawListRules(NMHDR* pNMHDR, LRESULT* pResult)
|
{
|
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
|
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
|
// TODO: 在此添加控件通知处理程序代码
|
|
NMCUSTOMDRAW nmCustomDraw = pLVCD->nmcd;
|
|
if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
|
{
|
*pResult = CDRF_NOTIFYITEMDRAW;
|
}
|
else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
|
{
|
//整行处理
|
if (0 == nmCustomDraw.lItemlParam)
|
{
|
pLVCD->clrText = RGB(144, 144, 144);
|
}
|
else if (1 == nmCustomDraw.lItemlParam)
|
{
|
|
pLVCD->clrText = RGB(0, 0, 0);
|
}
|
*pResult = CDRF_NOTIFYSUBITEMDRAW;
|
}//这上面的都是默认的不用理
|
else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
|
{
|
*pResult = 0;
|
// 暂时不处理每一列
|
return;
|
}
|
|
}
|
|
|
void PositionDlg::OnBnClickedButton1()
|
{
|
updatePositions();
|
}
|