2016-05-16 9 views
6

Последнее обновление: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(...); 
} 
+0

прекрасно работает в Wordpad.exe, он также использует этот элемент управления. Вы должны показать нам. –

+0

Хорошо, у меня есть задержка, вам придется показать источник через некоторое время. – sln

+0

Можем ли мы увидеть код, в котором вы создаете, и назначить шрифт для управления? – IInspectable

ответ

3

Этот код должен работать в проекте Unicode:

BOOL CMyApp::InitInstance() 
{ 
    CWinApp::InitInstance(); 
    LoadLibrary(L"MsftEdit.dll"); 
    ... 
} 

BOOL CMyDialog::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    static CRichEditCtrl redit; 
    CWnd *wnd = &redit; 
    wnd->Create(MSFTEDIT_CLASS, L"ᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎ", 
      WS_CHILD | WS_VISIBLE, CRect(0,0,300,300), this, 1001, 0); 
    ... 
    //redit is not to be mixed up with controls created in dialog editor. 
} 

Edit ----------------

NONCLIENTMETRICS info = { sizeof(info) }; 
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); 
LOGFONT logfont = info.lfMessageFont; 

//CClientDC has automatic cleanup, use it instead of GetDC 
CClientDC dc(this); 
logfont.lfHeight = -MulDiv(abs(logfont.lfHeight), dc.GetDeviceCaps(LOGPIXELSY), 76); 

CFont font; 
font.CreateFontIndirect(&logfont); 
m_RichEdit.SetFont(&font); 

m_RichEdit.SetWindowText(L"ᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎ"); 

m_RichEdit.SetSel(1, 1); 

CString test = L"(Test, ελληνικά)"; 

//Test to make sure we can see Unicode text 
AfxMessageBox(test); 
m_RichEdit.ReplaceSel(test); 

//optional: 
//get default CHARFORMAT 
CHARFORMAT2 charFormat; 
//m_RichEdit.GetSelectionCharFormat(charFormat); 
m_RichEdit.GetDefaultCharFormat(charFormat); 
+0

Я попробую. – sln

+0

Я думаю, что нашел что-то. Если я скопирую (ctrl-c) текст из Hangul из Notepad или CEdit и вставляю в Rich ctrl, я получаю коробки. Если я копирую из MS Word (то есть другой Rich ctrl) и вставляю, я получаю Hangul. ?? Wtf ??. Считаете ли вы, что это связано с многобайтовым или буфером Unicode типа текста? Кроме того, я в основном программирую программно с помощью SetWindowText или SetSel (-1, -1); ReplaceSel (str); 'где str - LPCTSTR (т. Е. Широкие символы).Кроме того, когда я копирую вставляемый текст _box_ из богатого элемента управления в другое место в элементе управления, он появляется Hangul .. – sln

+0

Я думаю, что ваш проект не Unicode. Поэтому иногда это работает, иногда это не так. Вы должны изменить проект на Unicode, если это возможно. Если это не вариант, вы можете принудительно управлять юникодом в проекте ANSI (см. Править). Обратите внимание, что функции MFC всегда будут по умолчанию ANSI в проекте ANSI. Поэтому вам придется использовать WinAPI для доступа к функциям Unicode. Вы не можете использовать «CRichEdit :: ReplaceSel» для отправки текста Unicode в проекте ANSI. Вместо этого вы должны использовать 'SendMessageW (hedit, EM_REPLACESEL ...)' он усложняется ... –