注册 登录
编程论坛 C++教室

关于“按指定大小的区域自适应显示字符”问题

鸿蒙之灵 发布于 2019-11-26 18:07, 1751 次点击
问题模型描述:

现在已知有一个固定的区域
CRect rect;
rect.SetRect(left, top, right, bottom);


有一个字符串,该字符串可能较长,且由中文和字母组成,需要根据该区域进行字符串的显示,其问题点在于如何规范分割换行点,遇到需要分割换行时,区分汉字和字母,以确保不乱码;

目前需要一个函数能够实现此功能,希望得到答疑解惑:


程序代码:

/*绘制文本(以区域为基准):textcolor-文字颜色,bkcolor-背景色,left,top,right,bottom-区域,size-字体大小*/
void CDrawJM::DrawTextAboutRect(CDC *pDC, COLORREF textcolor, COLORREF bkcolor, CString m_strText, unsigned int left, unsigned int top, unsigned int right, unsigned int bottom, unsigned int size)
{
        CFont *oldFont;
    CFont m_textFont;
    m_textFont.CreateFont(size, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS,
        CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH | FF_SWISS, _T("宋体"));   //size-字体大小
    oldFont = pDC->SelectObject(&m_textFont);
    pDC->SetTextColor(textcolor);   //设置字体颜色
    pDC->SetBkColor(bkcolor);   //设置字体背景色


        
//该部分为实现区域自适应显示字符串功能代码,文字显示可使用库函数   pDC->TextOut(a,b,str);

        pDC->SelectObject(oldFont);
    m_textFont.DeleteObject();
}


[此贴子已经被作者于2019-11-26 18:13编辑过]

5 回复
#2
rjsp2019-11-26 18:22
用 DrawText 函数,注意最后一个参数
#3
鸿蒙之灵2019-11-26 21:25
回复 2楼 rjsp
可以了,但是输出的效果不太满意,最后一个参数有哪个属性是两侧对齐的,就是说前面的行左右边界相同,最后一行靠左,类似WPS里面的两侧对齐,现在的效果是这样的





只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2019-11-26 21:35编辑过]

#4
rjsp2019-11-26 22:42
回复 3楼 鸿蒙之灵
没有,
但你可以试试 最后一个参数加上DT_WORDBREAK | DT_EDITCONTROL的效果
#5
鸿蒙之灵2019-11-27 08:55
回复 4楼 rjsp
不行,还是右边对不齐,这个是不是用最后一个参数实现不了啊
#6
鸿蒙之灵2019-11-29 12:53
总结:该问题最终经过查找资料等途径,了解到MFC中无关于区域两端对齐输出字符串的样式,故该问题最终解决方案为:

1.先根据区域绘制等长等宽的背景矩形,因为该分割后右边最多差1.5个字符的位置(汉字两个字符位置),差距不会很大,故直接使用字体背景色会显得右边对不齐特别明显;

2.再设置文本背景色为透明,此时用到上面版主提供的GDI函数进行文本输出显示即可;

在此,感谢版主的热心解答!
1