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