Последнее обновление:Mfc шрифт связывании и Rich Edit Control RICHEDIT50W не отображается Unicode Правильно
Ну, я нашел в виновника своего рода. Я изменил элемент управления на RichEdit20W
с 50W
и теперь отображает Hangul (Korean). Мне не пришлось менять какой-либо другой код, кроме init, добавлен AfxInitRichEdit2() и прокомментировал LoadLibrary (L "MsftEdit.dll"). AfxInitRichEdit5() недоступен для VS2010. При прочих равных условиях и Rich Edit 4.1 был доступен с VS2005, он должен был работать. Я не могу перейти на VS2015 прямо сейчас, поэтому я застрял. Я собираюсь предложить щедрость, хотя для тех, кто может заставить Хангул работать с 50 Вт и VS2010.
У меня есть дилемма, которую я не могу решить.
У меня есть приложение mfc Unicode, которое использует CEdit и CRicheditCtrl.
Rich Edit - 50 Вт, загруженный с MsftEdit.dll
и проверенный с помощью Spy ++
, что имя класса RICHEDIT50W.
Моя проблема:
Я использую тот же шрифт Courier New
для обоих CEdit и CRichEditCtrl.
В качестве теста я использовал некоторые символы Хангула, чтобы увидеть выходные данные для
элементов управления.
CEdit выходы ᄀᄁᄂᄃᄄᄅᄆᄇᄈ
в то время как
CRichEditCtrl выводит box
для каждого символа, как нет глифа для него.
Если они используют один и тот же шрифт, не должны ли я видеть одинаковые выходные символы?
Я думаю, что связывание шрифтов не является проблемой, оба имеют одинаковый шрифт по умолчанию.
Может ли кто-нибудь решить эту загадку?
Заранее благодарен!
Обратите внимание, что это происходит с некоторыми другими наборами символов, а не только хангыль
Update
Я посмотрел на примере VS2010 WordPad, она использует CRichEditView но
предоставляет обертки для доступа к встроенному CRichEditCtrl.
Я думал, что смогу получить некоторые данные, но я не вижу, как они делают
Богатые Редактировать вызовы управления.
Вот как я создаю шрифт для обоих элементов управления.
Но я показываю конкретно часть Rich Edit.
Док говорит, что привязка шрифта должна обрабатывать переключение с шрифта по умолчанию
на шрифт в текущей точке вставки.
Я делаю вставку в основном на конце использованием
ctrl.SetSel(-1,-1);
ctrl.ReplaceSel(str);
И, по словам ДИЗКН, это должно изменить на правильный шрифт в случае необходимости,
если кроме шрифта по умолчанию ,
В примере WordPad, если я вставляю текст Hangul, шрифт переключается на
Gulim
.
Вот мой код:
LOGFONT lf;
int pitch = 10;
memset(&lf, 0, sizeof(LOGFONT));
HDC hdc = ::GetDC(NULL);
lf.lfHeight = -MulDiv(pitch, GetDeviceCaps(hdc, LOGPIXELSY), 72);
lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
lstrcpy(lf.lfFaceName, _T("Courier New"));
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = ANSI_CHARSET; // English, but use DEFAULT_CHARSET if not
lf.lfQuality = DEFAULT_QUALITY;
if (!m_Font.CreateFontIndirect(&lf))
{ // Ours didn't work, create a system default fixed font
// (Ignore, example for post only. Never gets called though)
//memset(&lf, 0, sizeof(LOGFONT));
//::GetObject(GetStockObject(ANSI_FIXED_FONT), sizeof(LOGFONT), &lf);
//m_Font.CreateFontIndirect(&lf);
}
// Save the generated Font LOGFONT
m_lf = lf;
// Set the default Font CHARFORMAT2
memset(&m_cfDefaultFont, 0, sizeof(m_cfDefaultFont));
m_cfDefaultFont.cbSize = sizeof(m_cfDefaultFont);
m_cfDefaultFont.dwMask = CFM_CHARSET | CFM_FACE | CFM_WEIGHT ;
m_cfDefaultFont.bCharSet = m_lf.lfCharSet;
lstrcpy(m_cfDefaultFont.szFaceName, m_lf.lfFaceName);
m_cfDefaultFont.wWeight = m_lf.lfWeight;
// Finally set the font in the controls
m_RichEdit.SetFont(&m_Font);
// Same effect as m_RichEdit.SetFont()
//m_RichEdit.SendMessage(EM_SETCHARFORMAT, SCF_ALL, &m_cfDefaultFont);
// This displays nothing but 'box' glyphs
m_RichEdit.SetWindowTextW(_T("ᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎ"));
Update 2
Это, как я инициализировать Rich Edit в приложении.
И показывает использование 50 Вт в диалоговом режиме.
-- winapp.cpp
BOOL CMyApp::InitInstance()
{
// ...... //
CString strRichEdit = _T("Msftedit.dll");
m_hMsfteditDll = AfxLoadLibrary(strRichEdit);
if (m_hMsfteditDll == NULL)
{
CString str;
str.Format(_T("Error: Cannot find Rich Edit component %s"), strRichEdit);
AfxMessageBox(str);
return FALSE;
}
return TRUE;
}
int CRegexFormatApp::ExitInstance()
{
if (m_hMsfteditDll != NULL)
AfxFreeLibrary(m_hMsfteditDll);
return CWinAppEx::ExitInstance();
}
// =========================
-- .rc
CONTROL "",IDC_RICH_EDIT,"RICHEDIT50W",WS_VSCROLL | WS_HSCROLL,40,15,148,28
-- Dlg.h
CRichEditCtrl m_RichEdit;
-- Dlg.cpp
void Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_RICH_EDIT, m_RichEdit); // Use .rc setting to Create/Attach
}
BOOL Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
CreateAndSetRichFont(); // Code shown above
m_RichEdit.SetWindowTextW(...);
}
прекрасно работает в Wordpad.exe, он также использует этот элемент управления. Вы должны показать нам. –
Хорошо, у меня есть задержка, вам придется показать источник через некоторое время. – sln
Можем ли мы увидеть код, в котором вы создаете, и назначить шрифт для управления? – IInspectable