MBCS dialog templates are decoded with the system ANSI code page, so on
non-Chinese systems the GBK template strings turn into "?" before
TranslateDialog can read them. Set those strings explicitly in OnInitDialog
(PluginSettings save/close, the three Advanced dialogs, the file-manager
search buttons/checkboxes, and Trigger Settings) so they are re-decoded
with the thread locale. Also fix the language-selection dialog and the
toolbar "Lang/语言" button: the language dialog's template is built as
WCHAR strings but created through the ANSI path, so its title, label, and
buttons are set explicitly in OnInitDialog (AppendString stays on CP_ACP),
with the title looked up via _TR("切换语言") and set through SetWindowTextW
after an explicit GBK conversion; new en_US ("Switch Language") and zh_TW
("切換語言") translations accompany it. The toolbar button is set through
the Unicode TB_SETBUTTONINFOW message after an explicit GBK conversion. Add
en_US/zh_TW translations for the experimental-features context menu items.
Co-Authored-By: deepseek-v4-pro
140 lines
4.7 KiB
C++
140 lines
4.7 KiB
C++
// CPreviewLevelsDlg.h
|
||
// 屏幕预览质量等级配置对话框:编辑 6 档 PreviewProfile(编码宽度 / JPEG 质量)。
|
||
// 纯主控端 UI 偏好,持久化由 CMy2015RemoteDlg::SavePreviewProfilesToCfg() 负责。
|
||
// 仅在 2015RemoteDlg.cpp 中 include 一次(头文件内联实现,勿多处包含)。
|
||
#pragma once
|
||
|
||
#include "LangManager.h"
|
||
|
||
class CPreviewLevelsDlg : public CDialog
|
||
{
|
||
public:
|
||
enum { IDD = IDD_PREVIEW_LEVELS };
|
||
|
||
// profiles: 指向 6 元素 PreviewProfile 数组,确认后写回
|
||
CPreviewLevelsDlg(PreviewProfile* profiles, CWnd* pParent = NULL)
|
||
: CDialog(CPreviewLevelsDlg::IDD, pParent), m_profiles(profiles)
|
||
{
|
||
}
|
||
|
||
protected:
|
||
PreviewProfile* m_profiles;
|
||
PreviewProfile m_working[QUALITY_COUNT];
|
||
|
||
static const char* LevelName(int i)
|
||
{
|
||
static const char* names[QUALITY_COUNT] = {
|
||
"Ultra", "High", "Good", "Medium", "Low", "Minimal"
|
||
};
|
||
return (i >= 0 && i < QUALITY_COUNT) ? names[i] : "?";
|
||
}
|
||
|
||
void LoadToControls()
|
||
{
|
||
CString s;
|
||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||
s.Format(_T("%d"), m_working[i].maxWidth);
|
||
SetDlgItemText(IDC_PLEVEL_WIDTH + i, s);
|
||
s.Format(_T("%d"), m_working[i].jpegQuality);
|
||
SetDlgItemText(IDC_PLEVEL_QUALITY + i, s);
|
||
}
|
||
}
|
||
|
||
bool ReadInt(int id, int& out)
|
||
{
|
||
CString s;
|
||
GetDlgItemText(id, s);
|
||
s.Trim();
|
||
if (s.IsEmpty()) return false;
|
||
|
||
int v = 0;
|
||
for (int k = 0; k < s.GetLength(); k++) {
|
||
TCHAR ch = s[k];
|
||
if (ch < _T('0') || ch > _T('9')) return false;
|
||
v = v * 10 + (ch - _T('0'));
|
||
}
|
||
out = v;
|
||
return true;
|
||
}
|
||
|
||
bool ReadFromControls(CString& err)
|
||
{
|
||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||
int w, q;
|
||
if (!ReadInt(IDC_PLEVEL_WIDTH + i, w))
|
||
{ err.Format(_T("等级 %s 的最大宽度不是有效数字"), LevelName(i)); return false; }
|
||
if (!ReadInt(IDC_PLEVEL_QUALITY + i, q))
|
||
{ err.Format(_T("等级 %s 的 JPEG 质量不是有效数字"), LevelName(i)); return false; }
|
||
|
||
if (w < 64 || w > 2560)
|
||
{ err.Format(_T("等级 %s 的最大宽度需在 64~2560 之间"), LevelName(i)); return false; }
|
||
if (q < 1 || q > 100)
|
||
{ err.Format(_T("等级 %s 的 JPEG 质量需在 1~100 之间"), LevelName(i)); return false; }
|
||
|
||
m_working[i].maxWidth = w;
|
||
m_working[i].jpegQuality = q;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
void ResetToDefaults()
|
||
{
|
||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||
m_working[i] = GetScreenPreviewProfile(i);
|
||
}
|
||
LoadToControls();
|
||
}
|
||
|
||
virtual BOOL OnInitDialog() override
|
||
{
|
||
CDialog::OnInitDialog();
|
||
|
||
// 非中文系统上 MBCS 对话框模板的中文会被系统 ACP 转成 "?",TranslateDialog
|
||
// 拿到的是已乱码文本无法还原,故在此显式设置(参照 NotifySettingsDlg)。
|
||
// 均经 _TR/_L 支持多语言翻译。
|
||
SetWindowText(_TR("屏幕预览质量等级"));
|
||
SetDlgItemText(IDC_PLEVEL_LABEL_LEVEL, _TR("等级"));
|
||
SetDlgItemText(IDC_PLEVEL_LABEL_WIDTH, _TR("最大宽度"));
|
||
SetDlgItemText(IDC_PLEVEL_LABEL_QUALITY, _TR("JPEG质量"));
|
||
static const TCHAR* kLevelNames[QUALITY_COUNT] = {
|
||
_T("Ultra 极佳"), _T("High 优秀"), _T("Good 良好"),
|
||
_T("Medium 一般"), _T("Low 较差"), _T("Minimal 最低")
|
||
};
|
||
for (int i = 0; i < QUALITY_COUNT; i++)
|
||
SetDlgItemText(IDC_PLEVEL_LABEL_LEVEL0 + i, _L(kLevelNames[i]));
|
||
SetDlgItemText(IDC_PLEVEL_LABEL_HINT,
|
||
_TR("最大宽度为期望编码宽度;JPEG 质量 1~100"));
|
||
SetDlgItemText(IDC_PLEVEL_RESET, _TR("恢复默认"));
|
||
SetDlgItemText(IDOK, _TR("确定"));
|
||
SetDlgItemText(IDCANCEL, _TR("取消"));
|
||
|
||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||
m_working[i] = m_profiles[i];
|
||
}
|
||
LoadToControls();
|
||
return TRUE;
|
||
}
|
||
|
||
virtual void OnOK() override
|
||
{
|
||
CString err;
|
||
if (!ReadFromControls(err)) {
|
||
MessageBox(err, _TR("提示"), MB_ICONWARNING);
|
||
return;
|
||
}
|
||
for (int i = 0; i < QUALITY_COUNT; i++) {
|
||
m_profiles[i] = m_working[i];
|
||
}
|
||
CDialog::OnOK();
|
||
}
|
||
|
||
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam) override
|
||
{
|
||
if (LOWORD(wParam) == IDC_PLEVEL_RESET && HIWORD(wParam) == BN_CLICKED) {
|
||
ResetToDefaults();
|
||
return TRUE;
|
||
}
|
||
return CDialog::OnCommand(wParam, lParam);
|
||
}
|
||
};
|