doc_and_tools/tools/apps/hgjson/DlgZk.cpp

354 lines
9.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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