// DlgRange.cpp: 实现文件 // #include "stdafx.h" #include "hgjson.h" #include "DlgRange.h" #include "afxdialogex.h" #include "resource.h" // CDlgRange 对话框 IMPLEMENT_DYNAMIC(CDlgRange, CDialogEx) CDlgRange::CDlgRange(int type, CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_RANGE, pParent) , 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_); } 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, 177); list_.InsertColumn(1, TEXT("Default"), 0, 48); GetDlgItem(IDC_EDIT_VAL)->EnableWindow(type_ == TYPE_LIST); list_.EnableWindow(type_ == TYPE_LIST); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(type_ == TYPE_LIST); 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); GetDlgItem(IDC_COMBO_FIELD)->EnableWindow(type_ == TYPE_FIELDS); val_.EnableWindow(type_ == TYPE_FIELDS); if (type_ == TYPE_LIST) { for (auto& v: vals_) { int ind = list_.InsertItem(list_.GetItemCount(), v.c_str()); if (v == init_) list_.SetItemText(ind, 1, L"yes"); } } else if(type_ == TYPE_RANGE && vals_.size() == 3) { SetDlgItemTextW(IDC_EDIT_FROM, vals_[0].c_str()); SetDlgItemTextW(IDC_EDIT_TO, vals_[1].c_str()); SetDlgItemTextW(IDC_EDIT_STEP, vals_[2].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)); int ind = -1; if (val.empty()) { MessageBox(TEXT("NO Input!")); 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()); 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) { 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 }; list_.GetItemText(i, 0, buf, _countof(buf) - 1); vals_.push_back(buf); } } 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, 1, i == item ? L"yes" : L""); } } else if (ret == IDNO) { list_.DeleteItem(item); } } } void CDlgRange::OnCbnSelchangeComboField() { // TODO: 在此添加控件通知处理程序代码 std::wstring field(get_item_text(IDC_COMBO_FIELD)); init_val_api_(field.c_str(), &val_); }