// DlgRange.cpp: 实现文件 // #include "stdafx.h" #include "hgjson.h" #include "DlgRange.h" #include "afxdialogex.h" #include "resource.h" #include "DlgCondition.h" // CDlgRange 对话框 IMPLEMENT_DYNAMIC(CDlgRange, CDialogEx) CDlgRange::CDlgRange(const wchar_t* name, int type, CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_RANGE, pParent) , name_(name ? name : L""), type_(type) { } CDlgRange::~CDlgRange() { } std::wstring CDlgRange::get_item_text(UINT id) { int l = GetDlgItem(id)->GetWindowTextLengthW(); wchar_t* buf = new wchar_t[l + 4]; l = GetDlgItem(id)->GetWindowTextW(buf, l + 2); buf[l] = 0; std::wstring ret(buf); delete[] buf; return std::move(ret); } void CDlgRange::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, list_); DDX_Control(pDX, IDC_COMBO_VAL, val_); DDX_Control(pDX, IDC_COMBO_RANGE_FIELD, range_type_); } BOOL CDlgRange::OnInitDialog() { CDialogEx::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog list_.SetExtendedStyle(list_.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); list_.InsertColumn(0, TEXT("Value lists"), 0, 150); list_.InsertColumn(1, TEXT("Condition"), 0, 111); list_.InsertColumn(2, TEXT("Default"), 0, 48); GetDlgItem(IDC_EDIT_VAL)->EnableWindow(type_ != TYPE_FIELDS); list_.EnableWindow(type_ != TYPE_FIELDS); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(type_ != TYPE_FIELDS); GetDlgItem(IDC_EDIT_FROM)->EnableWindow(type_ == TYPE_RANGE); GetDlgItem(IDC_EDIT_TO)->EnableWindow(type_ == TYPE_RANGE); GetDlgItem(IDC_EDIT_STEP)->EnableWindow(type_ == TYPE_RANGE); GetDlgItem(IDC_EDIT_INIT2)->EnableWindow(type_ == TYPE_RANGE); range_type_.EnableWindow(type_ == TYPE_RANGE); GetDlgItem(IDC_COMBO_FIELD)->EnableWindow(type_ == TYPE_FIELDS); val_.EnableWindow(type_ == TYPE_FIELDS); if (type_ == TYPE_LIST || type_ == TYPE_RANGE) { bool def = false; for (auto& v: vals_) { int ind = list_.InsertItem(list_.GetItemCount(), v.val.c_str()); if (v.val == init_) { list_.SetItemText(ind, 2, L"yes"); def = true; } list_.SetItemText(ind, 1, v.cond.c_str()); } if (!def) { int ind = list_.InsertItem(list_.GetItemCount(), init_.c_str()); list_.SetItemText(ind, 1, L"default:"); list_.SetItemText(ind, 2, L"yes"); } } //else if(type_ == TYPE_RANGE && vals_.size() == 3) //{ // SetDlgItemTextW(IDC_EDIT_FROM, vals_[0].val.c_str()); // SetDlgItemTextW(IDC_EDIT_TO, vals_[1].val.c_str()); // SetDlgItemTextW(IDC_EDIT_STEP, vals_[2].val.c_str()); // SetDlgItemTextW(IDC_EDIT_INIT2, init_.c_str()); //} else if (type_ == TYPE_FIELDS) { } return TRUE; // return TRUE unless you set the focus to a control } BEGIN_MESSAGE_MAP(CDlgRange, CDialogEx) ON_BN_CLICKED(IDC_BUTTON_ADD, &CDlgRange::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CDlgRange::OnBnClickedOk) ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CDlgRange::OnNMDblclkList1) ON_CBN_SELCHANGE(IDC_COMBO_FIELD, &CDlgRange::OnCbnSelchangeComboField) END_MESSAGE_MAP() // CDlgRange 消息处理程序 void CDlgRange::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 std::wstring val(get_item_text(IDC_EDIT_VAL)), range(get_item_text(IDC_COMBO_RANGE_FIELD)); int ind = -1; if (val.empty()) { MessageBox(TEXT("NO Input!")); GotoDlgCtrl(GetDlgItem(IDC_EDIT_VAL)); return; } if (type_ == TYPE_RANGE && range.empty()) { MessageBox(TEXT("Range value, must specify the role!")); GotoDlgCtrl(GetDlgItem(IDC_COMBO_RANGE_FIELD)); return; } for (int i = 0; i < list_.GetItemCount(); ++i) { wchar_t buf[25] = { 0 }; list_.GetItemText(i, 0, buf, _countof(buf) - 1); if (val == buf) { list_.SetItemState(i, LVIS_FOCUSED | LVIS_SELECTED | LVIS_ACTIVATING, LVIS_FOCUSED | LVIS_SELECTED | LVIS_ACTIVATING); list_.SetSelectionMark(i); ind = i; break; } } if(ind == -1) ind = list_.InsertItem(list_.GetItemCount(), val.c_str()); if (type_ == TYPE_RANGE) list_.SetItemText(ind, 1, (range + L":").c_str()); list_.SetItemState(ind, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); list_.SetSelectionMark(ind); list_.EnsureVisible(ind, FALSE); } void CDlgRange::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 vals_.clear(); if (type_ == TYPE_LIST || type_ == TYPE_RANGE) { bool range = type_ == TYPE_RANGE, bl = false, bu = false, bs = false; if (init_.empty()) { MessageBox(TEXT("请确定默认值!双击列表中的某项进行选择。 "), TEXT("No Default"), MB_OK); return; } if(list_.GetItemCount() == 0) { MessageBox(TEXT("没有输入有效的值列表"), TEXT("No Value"), MB_OK); return; } for (int i = 0; i < list_.GetItemCount(); ++i) { wchar_t buf[256] = { 0 }; CONDVAL val; list_.GetItemText(i, 0, buf, _countof(buf) - 1); val.val = buf; list_.GetItemText(i, 1, buf, _countof(buf) - 1); val.cond = buf; if (range) { if (val.cond.find(L"min:") == 0) bl = true; else if (val.cond.find(L"max:") == 0) bu = true; else if(val.cond.find(L"step:") == 0) bs = true; } vals_.push_back(val); } if (range) { std::wstring no(L""); if (!bl) { no = L"lower value"; } else if (!bu) { no = L"upper value"; } else if (!bs) { no = L"step value"; } if (!no.empty()) { MessageBox(TEXT("没有输入有效的值列表"), no.c_str(), MB_OK); return; } } } else if(type_ == TYPE_RANGE) { //std::wstring val(get_item_text(IDC_EDIT_FROM)); // //if (val.empty()) //{ // MessageBox(TEXT("没有输入有效初始值"), TEXT("No Value"), MB_OK); // GotoDlgCtrl(GetDlgItem(IDC_EDIT_FROM)); // return; //} //vals_.push_back(val); // //val = get_item_text(IDC_EDIT_TO); //if (val.empty()) //{ // MessageBox(TEXT("没有输入有效终止值"), TEXT("No Value"), MB_OK); // GotoDlgCtrl(GetDlgItem(IDC_EDIT_TO)); // return; //} //vals_.push_back(val); // //val = get_item_text(IDC_EDIT_STEP); //if (val.empty()) //{ // MessageBox(TEXT("没有输入有效步长值"), TEXT("No Value"), MB_OK); // GotoDlgCtrl(GetDlgItem(IDC_EDIT_TO)); // return; //} //vals_.push_back(val); // //init_ = get_item_text(IDC_EDIT_INIT2); //if (init_.empty()) //{ // MessageBox(TEXT("没有输入有效默认值"), TEXT("No Value"), MB_OK); // GotoDlgCtrl(GetDlgItem(IDC_EDIT_INIT2)); // return; //} } else if (type_ == TYPE_FIELDS) { std::wstring field(get_item_text(IDC_COMBO_FIELD)); vals_.clear(); vals_.push_back(field); init_ = get_item_text(IDC_COMBO_VAL); if (init_.empty()) { MessageBox(TEXT("没有输入有效值"), TEXT("No Value"), MB_OK); GotoDlgCtrl(GetDlgItem(IDC_COMBO_VAL)); return; } } CDialogEx::OnOK(); } void CDlgRange::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; POINT pos = { 0 }; int item = -1; GetCursorPos(&pos); list_.ScreenToClient(&pos); item = list_.HitTest(pos); if (item != -1) { wchar_t buf[256] = { 0 }; int ret = 0; list_.GetItemText(item, 0, buf, _countof(buf) - 1); ret = ::MessageBoxW(m_hWnd, L"默认值、删除或者条件设置:\r\nYes: 是\r\nNo: 删除该项\r\nCancel: 设置条件", buf, MB_YESNOCANCEL); if (ret == IDYES) { init_ = buf; for (int i = 0; i < list_.GetItemCount(); ++i) { list_.SetItemText(i, 2, i == item ? L"yes" : L""); } } else if (ret == IDNO) { list_.DeleteItem(item); } else { CDlgCondition dlg(name_.c_str()); wchar_t buf[512] = { 0 }, * init = buf; list_.GetItemText(item, 1, buf, _countof(buf) - 1); if (type_ == TYPE_RANGE && wcsstr(buf, L":")) { init = wcsstr(buf, L":") + 1; } dlg.init_data(item_all_, item_val_, init); if (dlg.DoModal() == IDOK) { if (type_ == TYPE_RANGE && wcsstr(buf, L":")) { wcsstr(buf, L":")[1] = 0; } else buf[0] = 0; list_.SetItemText(item, 1, (buf + dlg.get_condition()).c_str()); } } } } void CDlgRange::OnCbnSelchangeComboField() { // TODO: 在此添加控件通知处理程序代码 std::wstring field(get_item_text(IDC_COMBO_FIELD)); init_val_api_(field.c_str(), &val_); }