doc_and_tools/tools/apps/hgjson/DlgRange.cpp

264 lines
6.1 KiB
C++

// 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<LPNMITEMACTIVATE>(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_);
}