CString _data = "中華人民共和過nbdzt"; // 需要列印的資料
DrawText -->DT_WORDBREAK | DT_EDITCONTROL | DT_LEFT | DT_NOPREFIX 列印方式
目標列印:
中華人民共和過nb
dzt
實際列印結果:
中華人民共和國
nbdzt
待解決問題:如果中文后面有剩余空間,讓英文不提前換行。
前提條件:列印區域固定不調整,字體固定不調整,中英文自動換行且連續
uj5u.com熱心網友回復:
DrawText 使用引數 DT_CALCRECT 的時候,可以回傳需要的繪制區域的大小,可以逐字符增加,計算出一個合適的大小長度,再分段輸出
uj5u.com熱心網友回復:
謝謝版主,不過目前的問題用您說的這種方式去做應該比較麻煩。目前面對的問題: 在一個13mm * 40mm的區域內列印1~7條資料,每一條資料有8~92字符。
列印方案:使用\n拼接每一條資料,然后使用DT_CALCRECT計算出能完整列印資料時的字號,然后一次一條資料列印完整。
但是存在我上面提的問題,就導致列印高度浪費。求解如何能解決上面的問題,或者有什么方式能規避。
uj5u.com熱心網友回復:
那就逐字輸出 自己換行
void CSDI3View::OnDraw(CDC* pDC)
{
CSDI3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString str = _T("中華人民共和國ABCDEFGHIJKLMNOPQRSTUVWXYZ")
_T("\n中華人民共和國ABCDEFGHIJKLMNOPQRSTUVWXYZ");
//邊界
CRect rcBound;
GetClientRect(&rcBound);
//獲取行高屬性
TEXTMETRIC txMetric;
pDC->GetTextMetrics(&txMetric);
int iLineHeight = txMetric.tmHeight;
//開始x,y
int sx=rcBound.left, sy=rcBound.top;
for(int n=0; n<str.GetLength(); n++)
{
CString s; s = str[n];
//強制換行
if(s == _T('\n'))
{
sx = rcBound.left;
sy += iLineHeight;
continue;
}
//計算字符區域
CRect rcTxt(sx, sy, 0, 0);
pDC->DrawText(s, 1, rcTxt, DT_CALCRECT);
//超過下邊界退出繪制
if(rcTxt.bottom > rcBound.bottom)
{
break;
}
//超過右邊界時換行
if(rcTxt.right > rcBound.right)
{
sx = rcBound.left;
sy += iLineHeight;
//下次重新繪制當前字符
n--;
continue;
}
//輸出字符
pDC->TextOut(sx,sy, s, 1);
//修改坐標
sx = rcTxt.right;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/211433.html
標籤:界面
