Я извиняюсь, неправильно: С WinCE 5 и CompactFramework v 2.0 управление, такими как Textbox поддерживает RicghtToLeft свойства (см также http://www.danielmoth.com/Blog/rtl-problem.aspx). Поэтому вы должны убедиться, что используете CF> = 2.0 и базовый SDK WinCE 5 (то есть Windows Mobile 6.x).
Ознакомившись с помощью класса Textbox, RightToLeft отмечен как НЕ ДОСТУПНЫЙ для Compact Framework.
Таким образом, вы должны написать свой собственный класс DrawText, который разделяет слова и позиционирует их справа налево.
Уроженец DrawText API поддерживает DT_RTLREADING флаг uFormat (в соответствии с интерактивной справке для Windows CE 5 Platform Builder):
DT_RTLREADING Компоновка в справа налево порядок чтения для двунаправленного текста когда шрифт выбранный в hdc - это иврит или арабский шрифт. Порядок чтения по умолчанию для всего текста слева направо.
Существует также опция DT_WORDBREAK, которую я бы выбрал для многострочного текста и достаточно большого прямоугольника рисования.
НО, что дает следующий результат, используя два прямоугольника и два размеров шрифта, чтобы заставить wordbreak:
Как я не могу читать, что я не уверен, но я предполагаю, что флаг wordbreak делает не работает правильно. Я предполагаю, что вторая строка в верхней части тоже должна начинаться справа.
Native Код для выше:
...
#define ARABIC_TEXT L"اسمي مصير الطفل. من أي بلد أنت"
#define MulDiv(a,b,c) (((a)*(b))/(c))
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
LOGFONT lf;
HFONT hFontNew, hFontOld;
...
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
// Clear out the lf structure to use when creating the font.
memset(&lf, 0, sizeof(LOGFONT));
wsprintf(lf.lfFaceName,L"Arial Unicode MS");
GetClientRect(hWnd, &rect);
hFontNew = CreateFontIndirect(&lf);
hFontOld = (HFONT) SelectObject(hdc, hFontNew);
rect.bottom=rect.bottom/2;
lf.lfHeight=-MulDiv(16, GetDeviceCaps(hdc, LOGPIXELSY), 72);
if(DrawText(hdc, ARABIC_TEXT, -1, &rect, DT_RTLREADING | DT_WORDBREAK)==0){
DEBUGMSG(1, (L"DrawText failed with %i\n", GetLastError()));
}
GetClientRect(hWnd, &rect);
lf.lfHeight=-MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
hFontNew = CreateFontIndirect(&lf);
hFontOld = (HFONT) SelectObject(hdc, hFontNew);
rect.top=rect.bottom/2;
if(DrawText(hdc, ARABIC_TEXT, -1, &rect, DT_RTLREADING | DT_WORDBREAK)==0){
DEBUGMSG(1, (L"DrawText failed with %i\n", GetLastError()));
}
EndPaint(hWnd, &ps);
SelectObject(hdc, hFontOld);
DeleteObject(hFontNew);
break;
Я использую compactframework 3.5 с Wince 6.0. Тем не менее, я не могу найти никакого права собственности. – Ytan
@josef Возможно, ваш выход просто нуждается в 'DT_RIGHT', верно? Также я думаю, что символы отображаются раздельно, потому что ваш WinCE не построен с полной поддержкой арабского скрипта. +1, хотя это, насколько мне известно, единственный способ отобразить арабский текст на WinCE. –
DT_RIGHT может быть ошибкой, так как он выравнивается по правому краю, но нам нужно чтение справа налево (RTL). Нет поддержки «с полным арабским», есть только Unicode, и это по умолчанию с WinCE. Одна из проблем - иметь ttf с полной арабской поддержкой. С другой стороны: я не знаю, какие параметры компоновщика плат необходимы, за исключением RTL и Unicode, чтобы получить «полный арабский дизайн» образа ОС Windows CE. BTW: редактирование ARABIC_TEXT в VS было проблемой, поскольку VS признал язык RTL и ведет себя странно с BACKSPACE, END и POS1. Хороший опыт. – josef