Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多行中正确打印阿拉伯字符串_C#_Compact Framework_Windows Ce - Fatal编程技术网

C# 在多行中正确打印阿拉伯字符串

C# 在多行中正确打印阿拉伯字符串,c#,compact-framework,windows-ce,C#,Compact Framework,Windows Ce,目前我需要在我的项目中处理阿拉伯语字符串(。如果字符串显示在单行中,则显示正确 但是,当字体大得多时,显示(我使用的是标签)是错误的 字符串从第二行开始打印。我发现在.Net框架上,我们可以将drawstring与StringFormatFlags.DirectionRightToLeft结合使用。然而,这在紧凑型框架中是不可用的。那个么,我怎么能把阿拉伯字符串打印成多行呢?非常感谢您的建议。很抱歉,以下内容不正确: 因为WinCE 5和CompactFramework V2.0控件(如Te

目前我需要在我的项目中处理阿拉伯语字符串(。如果字符串显示在单行中,则显示正确

但是,当字体大得多时,显示(我使用的是标签)是错误的


字符串从第二行开始打印。我发现在.Net框架上,我们可以将drawstringStringFormatFlags.DirectionRightToLeft结合使用。然而,这在紧凑型框架中是不可用的。那个么,我怎么能把阿拉伯字符串打印成多行呢?非常感谢您的建议。

很抱歉,以下内容不正确: 因为WinCE 5和CompactFramework V2.0控件(如Textbox)支持richtToLeft属性(另请参阅)。因此,您应该确保您使用的是CF>=2.0和WinCE 5基本sdk(即Windows Mobile 6.x)

查看Textbox类的帮助,RightToLeft被标记为不适用于Compact Framework

因此,您需要编写自己的DrawText类,将单词从右向左进行拆分和定位

本机DrawText API支持uFormat标志DT_RTLREADING(根据Windows CE 5 Platform Builder的联机帮助):

DT_RTLREADING 当hdc中选择的字体为希伯来文或阿拉伯文字体时,双向文本以从右到左的阅读顺序进行布局。所有文本的默认阅读顺序为从左到右

还有一个选项DT_WORDBREAK,我会为多行文本和足够大的绘图矩形选择它

但是,使用两个矩形和两种字体大小强制分词会产生以下结果:

因为我不能阅读,所以我不确定,但我假设wordbreak标志不能正确工作。我想上半部分的第二行也必须从右边开始

上述的本机代码:

...
#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;

很抱歉,以下内容不正确: 因为WinCE 5和CompactFramework V2.0控件(如Textbox)支持richtToLeft属性(另请参阅)。因此,您应该确保您使用的是CF>=2.0和WinCE 5基本sdk(即Windows Mobile 6.x)

查看Textbox类的帮助,RightToLeft被标记为不适用于Compact Framework

因此,您需要编写自己的DrawText类,将单词从右向左进行拆分和定位

本机DrawText API支持uFormat标志DT_RTLREADING(根据Windows CE 5 Platform Builder的联机帮助):

DT_RTLREADING 当hdc中选择的字体为希伯来文或阿拉伯文字体时,双向文本以从右到左的阅读顺序进行布局。所有文本的默认阅读顺序为从左到右

还有一个选项DT_WORDBREAK,我会为多行文本和足够大的绘图矩形选择它

但是,使用两个矩形和两种字体大小强制分词会产生以下结果:

因为我不能阅读,所以我不确定,但我假设wordbreak标志不能正确工作。我想上半部分的第二行也必须从右边开始

上述的本机代码:

...
#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;

下面的表单是从C#调用
DrawText
(参见约瑟夫的回答)的示例:

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
菜单=空;
DrawText(例如,图形,字体,ClientRectangle);
}
私有void DrawText(图形g、字符串文本、字体、矩形)
{
IntPtr dc=g.GetHdc();
RECT RECT=(RECT)矩形;
IntPtr hFont=IntPtr.0;
IntPtr previousFont=IntPtr.Zero;
尝试
{
hFont=font.ToHfont();
previousFont=选择对象(dc、hFont);
DrawText(dc,text,text.Length,ref-rect,DrawTextFlags.RightToLeft | DrawTextFlags.Right | DrawTextFlags.WordBreak);
}
最后
{
如果(以前的字体!=IntPtr.Zero)
{
选择对象(dc,以前的字体);
}
if(hFont!=IntPtr.Zero)
{
删除对象(hFont);
}
g、 释放HDC(dc);
}
}
[StructLayout(LayoutKind.Sequential)]
内部结构矩形
{
内部int左;
内部int Top;
内部权利;
内部内底;
公共静态显式运算符RECT(矩形RECT)
{
返回新的RECT()
{
左=矩形左,
顶部=矩形顶部,
右=右,
底部=矩形底部
};
}
}
[DllImport(“coredll.dll”,CharSet=CharSet.Unicode)]
内部静态外部int DrawText(IntPtr hdc、字符串lpStr、int nCount、ref RECT lpRect、DrawTextFlags);
[DllImport(“coredll.dll”,EntryPoint=“DeleteObject”)]
[返回:Marshallas(UnmanagedType.Bool)]
内部静态外部bool DeleteObject([In]IntPtr hObject);
[DllImport(“coredll.dll”)]
内部静态外部IntPtr SelectObject(IntPtr hdc、IntPtr hgdiobj);
[旗帜]
公共枚举DrawTextFlags:uint
{
/// 
///使用默认值。
/// 
无=0x00000000,
/// 
///将文本对齐到矩形的顶部。
/// 
Top=0x00000000,
/// 
///将文本向左对齐。
/// 
左=0x00000000,
/// 
///文本在矩形中水平居中。
/// 
中心=0x00000001,
/// 
///将文本向右对齐。
/// 
右=0x00000002,
/// 
///文本垂直居中。此值仅用于wi
private void processArabic(string arabicString)
{
   string[] stringArray = new string[2];

   double index = 0.8 * arabicString.Length;
   index = Math.Ceiling(index);
   int Index = (int)index;

   for (int i = Index; i != 0; i--)
   {
       if (Char.IsWhiteSpace(arabicString, i))
       {
          stringArray[1] = arabicString.Substring(0, Index + 1);
          stringArray[0] = arabicString.Substring(Index + 1, arabicString.Length - (Index + 1));
          break;
       }
   }

        label1.Text = stringArray[0];
        label1.Text += "\n";
        label1.Text += stringArray[1];
}