354 lines
9.1 KiB
C++
354 lines
9.1 KiB
C++
// DlgInput.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "hgjson.h"
|
||
#include "DlgZk.h"
|
||
#include "afxdialogex.h"
|
||
#include "DlgRange.h"
|
||
#include "DlgCondition.h"
|
||
#include "opt_ui/DlgPage.h" // for local_trans
|
||
#include <file/file_util.h>
|
||
|
||
#include <algorithm>
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// known name ...
|
||
namespace hz_2_py
|
||
{
|
||
std::string getLetter(std::string strText, bool head_only = false);
|
||
};
|
||
namespace util
|
||
{
|
||
std::wstring a2u(const char* a, bool from_utf8 = false);
|
||
std::string u2a(const wchar_t* u, bool to_utf8 = false);
|
||
};
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// CDlgZk dialog
|
||
|
||
IMPLEMENT_DYNAMIC(CDlgZk, CDialogEx)
|
||
|
||
CDlgZk::CDlgZk(CWnd* pParent /*=NULL*/)
|
||
: CDialogEx(CDlgZk::IDD, pParent)
|
||
{
|
||
}
|
||
|
||
CDlgZk::~CDlgZk()
|
||
{
|
||
}
|
||
|
||
|
||
std::wstring CDlgZk::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 CDlgZk::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialogEx::DoDataExchange(pDX);
|
||
DDX_Control(pDX, IDC_COMBO_FONT, font_);
|
||
DDX_Control(pDX, IDC_COMBO_SIZE, size_);
|
||
DDX_Control(pDX, IDC_COMBO_SIZE2, o_size_);
|
||
DDX_Control(pDX, IDC_SLIDER1, threshold_);
|
||
}
|
||
static BOOL CALLBACK EnumFamCallBack(LPLOGFONTW lplf, LPNEWTEXTMETRIC lpntm, DWORD FontType, LPVOID aFontCount)
|
||
{
|
||
((std::vector<std::wstring>*)aFontCount)->push_back(lplf->lfFaceName);
|
||
return TRUE;
|
||
}
|
||
BOOL CDlgZk::OnInitDialog()
|
||
{
|
||
CDialogEx::OnInitDialog();
|
||
|
||
// Set the icon for this dialog. The framework does this automatically
|
||
// when the application's main window is not a dialog
|
||
font_.SetCurSel(0);
|
||
size_.SetCurSel(size_.FindString(-1, TEXT("18")));
|
||
o_size_.SetCurSel(0);
|
||
|
||
SetDlgItemInt(IDC_EDIT_SIZE_W, 16);
|
||
SetDlgItemInt(IDC_EDIT_SIZE_H, 16);
|
||
|
||
threshold_.SetRange(0, 255);
|
||
threshold_.SetPos(127);
|
||
|
||
((CEdit*)GetDlgItem(IDC_EDIT_SIZE_W));
|
||
|
||
HDC hdc = ::GetDC(m_hWnd);
|
||
std::vector<std::wstring> fonts;
|
||
EnumFontFamiliesW(hdc, NULL, (FONTENUMPROC)EnumFamCallBack, (LPARAM)&fonts);
|
||
if (fonts.size())
|
||
{
|
||
font_.ResetContent();
|
||
for (auto& v : fonts)
|
||
font_.AddString(v.c_str());
|
||
int ind = font_.FindString(-1, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||
if (ind == -1)
|
||
ind = 0;
|
||
font_.SetCurSel(ind);
|
||
}
|
||
|
||
initialized_ = true;
|
||
|
||
return TRUE; // return TRUE unless you set the focus to a control
|
||
}
|
||
|
||
void CDlgZk::regen(void)
|
||
{
|
||
if (!initialized_)
|
||
return;
|
||
|
||
std::wstring f(get_item_text(IDC_COMBO_FONT)),
|
||
fs(get_item_text(IDC_COMBO_SIZE)),
|
||
t(get_item_text(IDC_EDIT_DATA)),
|
||
os(get_item_text(IDC_COMBO_SIZE2)),
|
||
sep(L"<EFBFBD><EFBFBD>");
|
||
SIZE out = { _wtoi(get_item_text(IDC_EDIT_SIZE_W).c_str()), _wtoi(get_item_text(IDC_EDIT_SIZE_H).c_str()) };
|
||
POINT off = { _wtoi(get_item_text(IDC_EDIT_OFF_X).c_str()), _wtoi(get_item_text(IDC_EDIT_OFF_Y).c_str()) };
|
||
int h = _wtoi(fs.c_str());
|
||
wchar_t text[40] = { 0 };
|
||
HWND hwnd = GetDlgItem(IDC_STATIC_DRAW)->m_hWnd;
|
||
HDC hdc = ::GetDC(hwnd);
|
||
char_dc dc(hdc);
|
||
uint8_t *ptr = NULL;
|
||
bool picture = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck() == BST_CHECKED;
|
||
|
||
if (picture)
|
||
{
|
||
bool stretch = ((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck() == BST_CHECKED;
|
||
if(bmp_)
|
||
ptr = dc.lattice(bmp_, threshold_.GetPos(), out, off, stretch);
|
||
else
|
||
ptr = dc.lattice(pic_.c_str(), threshold_.GetPos(), out, off, stretch);
|
||
if (ptr)
|
||
{
|
||
sep = pic_;
|
||
STR_FILE_NAME(sep, false);
|
||
os = std::wstring(L"font_map_[\"") + sep + L"\"] = " + sep + L";";
|
||
sep.insert(0, L"static uint8_t ");
|
||
sep += L"[] = {" + std::to_wstring(out.cx) + L", " + std::to_wstring(out.cy) + L"\r\n\t\t";
|
||
swprintf_s(text, _countof(text) - 1, L", 0x%02X", ptr[0]);
|
||
sep += text;
|
||
for (int i = 1; i < out.cx * out.cy / 8; ++i)
|
||
{
|
||
if (i % 16 == 0)
|
||
swprintf_s(text, _countof(text) - 1, L"\r\n\t\t, 0x%02X", ptr[i]);
|
||
else if (i % 8 == 0)
|
||
swprintf_s(text, _countof(text) - 1, L", 0x%02X", ptr[i]);
|
||
else
|
||
swprintf_s(text, _countof(text) - 1, L", 0x%02X", ptr[i]);
|
||
sep += text;
|
||
}
|
||
delete[] ptr;
|
||
sep += L"\r\n\t};\r\n" + os + L"\r\n\r\n";
|
||
}
|
||
else
|
||
{
|
||
::MessageBoxW(m_hWnd, pic_.c_str(), L"ͼƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>", MB_OK | MB_ICONERROR);
|
||
((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(BST_UNCHECKED);
|
||
threshold_.EnableWindow(FALSE);
|
||
((CButton*)GetDlgItem(IDC_CHECK2))->EnableWindow(FALSE);
|
||
((CButton*)GetDlgItem(IDC_BUTTON1))->EnableWindow(FALSE);
|
||
sep = L"";
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dc.set_font(h, f.c_str());
|
||
sep = L"";
|
||
for (int i = 0; i < t.length(); ++i)
|
||
{
|
||
sep += L"static uint8_t ";
|
||
text[0] = t[i];
|
||
text[1] = 0;
|
||
ptr = dc.lattice(text[0], out, off);
|
||
|
||
std::string ansi(util::u2a(text));
|
||
ansi = hz_2_py::getLetter(ansi);
|
||
std::transform(ansi.begin(), ansi.end(), ansi.begin(), tolower);
|
||
fs = util::a2u(ansi.c_str());
|
||
sep += fs + L"[] = {" + std::to_wstring(out.cx) + L", " + std::to_wstring(out.cy) + L"\r\n\t\t";
|
||
{
|
||
ansi = util::u2a(text, true);
|
||
uint8_t* p = (uint8_t*)&ansi[0];
|
||
swprintf_s(text, _countof(text) - 1, L"\\%03o\\%03o\\%03o", p[0], p[1], p[2]);
|
||
os = std::wstring(L"font_map_[\"") + text + L"\"] = " + fs + L";";
|
||
}
|
||
swprintf_s(text, _countof(text) - 1, L", 0x%02X", ptr[0]);
|
||
sep += text;
|
||
for (int i = 1; i < out.cx * out.cy / 8; ++i)
|
||
{
|
||
if (i % 16 == 0)
|
||
swprintf_s(text, _countof(text) - 1, L"\r\n\t\t, 0x%02X", ptr[i]);
|
||
else if (i % 8 == 0)
|
||
swprintf_s(text, _countof(text) - 1, L", 0x%02X", ptr[i]);
|
||
else
|
||
swprintf_s(text, _countof(text) - 1, L", 0x%02X", ptr[i]);
|
||
sep += text;
|
||
}
|
||
delete[] ptr;
|
||
sep += L"\r\n\t};\r\n" + os + L"\r\n\r\n";
|
||
}
|
||
}
|
||
::ReleaseDC(hwnd, hdc);
|
||
|
||
::SetDlgItemTextW(m_hWnd, IDC_EDIT_STATUS, sep.c_str());
|
||
}
|
||
|
||
BEGIN_MESSAGE_MAP(CDlgZk, CDialogEx)
|
||
ON_EN_CHANGE(IDC_EDIT_DATA, &CDlgZk::OnEnChangeEditData)
|
||
ON_CBN_SELCHANGE(IDC_COMBO_FONT, &CDlgZk::OnCbnSelchangeComboFont)
|
||
ON_CBN_SELCHANGE(IDC_COMBO_SIZE, &CDlgZk::OnCbnSelchangeComboSize)
|
||
ON_CBN_SELCHANGE(IDC_COMBO_SIZE2, &CDlgZk::OnCbnSelchangeComboSize2)
|
||
ON_BN_CLICKED(IDC_CHECK1, &CDlgZk::OnBnClickedCheck1)
|
||
ON_BN_CLICKED(IDC_CHECK2, &CDlgZk::OnBnClickedCheck2)
|
||
ON_EN_CHANGE(IDC_EDIT_OFF_X, &CDlgZk::OnEnChangeEditPos)
|
||
ON_EN_CHANGE(IDC_EDIT_OFF_Y, &CDlgZk::OnEnChangeEditPos)
|
||
ON_EN_CHANGE(IDC_EDIT_SIZE_W, &CDlgZk::OnEnChangeEditPos)
|
||
ON_EN_CHANGE(IDC_EDIT_SIZE_H, &CDlgZk::OnEnChangeEditPos)
|
||
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, &CDlgZk::OnNMReleasedcaptureSlider1)
|
||
ON_WM_CTLCOLOR()
|
||
ON_BN_CLICKED(IDC_BUTTON1, &CDlgZk::OnBnClickedButton1)
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
// CDlgZk message handlers
|
||
|
||
|
||
void CDlgZk::OnEnChangeEditData()
|
||
{
|
||
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD>ÿؼ<C3BF><D8BC><EFBFBD> RICHEDIT <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// <20><><EFBFBD>ʹ<EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д CDialogEx::OnInitDialog()
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRichEditCtrl().SetEventMask()<29><>
|
||
// ͬʱ<CDAC><CAB1> ENM_CHANGE <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㵽<EFBFBD><E3B5BD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
|
||
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
regen();
|
||
}
|
||
|
||
|
||
void CDlgZk::OnCbnSelchangeComboFont()
|
||
{
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
regen();
|
||
}
|
||
|
||
void CDlgZk::OnCbnSelchangeComboSize()
|
||
{
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
regen();
|
||
}
|
||
|
||
void CDlgZk::OnCbnSelchangeComboSize2()
|
||
{
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
regen();
|
||
}
|
||
|
||
|
||
void CDlgZk::OnBnClickedCheck1()
|
||
{
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
bool picture = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck() == BST_CHECKED;
|
||
|
||
threshold_.EnableWindow(picture);
|
||
((CButton*)GetDlgItem(IDC_CHECK2))->EnableWindow(picture);
|
||
((CButton*)GetDlgItem(IDC_BUTTON1))->EnableWindow(picture);
|
||
pic_ = L"";
|
||
if (bmp_)
|
||
DeleteObject(bmp_);
|
||
bmp_ = NULL;
|
||
if (picture)
|
||
OnBnClickedButton1();
|
||
else
|
||
regen();
|
||
}
|
||
|
||
void CDlgZk::OnBnClickedCheck2()
|
||
{
|
||
regen();
|
||
}
|
||
|
||
void CDlgZk::OnEnChangeEditPos()
|
||
{
|
||
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD>ÿؼ<C3BF><D8BC><EFBFBD> RICHEDIT <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// <20><><EFBFBD>ʹ<EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д CDialogEx::OnInitDialog()
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRichEditCtrl().SetEventMask()<29><>
|
||
// ͬʱ<CDAC><CAB1> ENM_CHANGE <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㵽<EFBFBD><E3B5BD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
|
||
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
regen();
|
||
}
|
||
|
||
|
||
void CDlgZk::OnNMReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*pResult = 0;
|
||
regen();
|
||
}
|
||
|
||
|
||
HBRUSH CDlgZk::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
||
{
|
||
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
|
||
|
||
// TODO: <20>ڴ˸<DAB4><CBB8><EFBFBD> DC <20><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
|
||
if (pWnd == GetDlgItem(IDC_STATIC_NOTE))
|
||
pDC->SetTextColor(RGB(255, 0, 0));
|
||
|
||
// TODO: <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵIJ<CFB5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>軭<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><F2B7B5BB><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
return hbr;
|
||
}
|
||
|
||
|
||
void CDlgZk::OnBnClickedButton1()
|
||
{
|
||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
file_util::PATHFILE path = { 0 };
|
||
uint8_t* buf = NULL;
|
||
size_t size = sizeof(bmp_);
|
||
|
||
if (bmp_)
|
||
{
|
||
DeleteObject(bmp_);
|
||
bmp_ = NULL;
|
||
}
|
||
if (file_util::get_clipboard(&bmp_, &size, CF_BITMAP) == ERROR_SUCCESS)
|
||
{
|
||
if (::MessageBoxW(m_hWnd, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>", MB_YESNO) == IDYES)
|
||
{
|
||
regen();
|
||
return;
|
||
}
|
||
|
||
DeleteObject(bmp_);
|
||
bmp_ = NULL;
|
||
}
|
||
|
||
if (file_util::browser_file(m_hWnd, &path, L"Bitmap Files(*.bmp)\0\0"))
|
||
{
|
||
pic_ = path.path;
|
||
}
|
||
else
|
||
{
|
||
((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(BST_UNCHECKED);
|
||
((CButton*)GetDlgItem(IDC_CHECK2))->EnableWindow(FALSE);
|
||
((CButton*)GetDlgItem(IDC_BUTTON1))->EnableWindow(FALSE);
|
||
threshold_.EnableWindow(FALSE);
|
||
}
|
||
regen();
|
||
}
|