win32下绘制多行文本

1、创建字体

LOGFONT lf = { 0 };
::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
_tcsncpy(lf.lfFaceName, fontName, LF_FACESIZE);
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfHeight = -fontHeight;
lf.lfWeight += FW_BOLD;
HFONT hFont = ::CreateFontIndirect(&lf);


fontName为字体名称,例如,“宋体”;字符集采用默认字符集;FW_BOLD表示加粗显示;lf.lfHeight表示字体高度,设置时是负数。

2、绘制文本

SelectObject(hdc, hFont);
::DrawText(hdc, text, -1, &r, DT_NOPREFIX|DT_LEFT);
DeleteObject(hFont);


3、绘制多行文本

void DrawMultiLine(HDC hdc,CString str, int* pos, LPCTSTR fontName,int fontHeight)
{   
	int comsumed = 0;
	int len;
	RECT r;
	str.Trim();
	len = str.GetLength();
    
	LOGFONT lf = { 0 };
	::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
	_tcsncpy(lf.lfFaceName, fontName, LF_FACESIZE);
	lf.lfCharSet = DEFAULT_CHARSET;
	lf.lfHeight = -fontHeight;
	HFONT hFont = ::CreateFontIndirect(&lf);
	if( hFont == NULL ) return;
	SelectObject(hdc, hFont);
	while(comsumed < len)
	{   
		r.top = *pos;
		r.left = page_left, r.right = mWidth;
		r.bottom = *pos + text_height + TEXT_BOTTOM;

		DRAWTEXTPARAMS drawParams;  
		ZeroMemory(&drawParams, sizeof(DRAWTEXTPARAMS));  
		drawParams.cbSize = sizeof(DRAWTEXTPARAMS);  

		str = str.Right(len - comsumed);
		DrawTextEx(hdc,str.GetBuffer(), str.GetLength(), &r,   
			DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK | DT_EXTERNALLEADING | DT_NOPREFIX, &drawParams);  

		comsumed += drawParams.uiLengthDrawn;

		*pos += TEXT_HEIGHT + TEXT_BOTTOM;
	}
	DeleteObject(hFont);
}

DRAWTEXTPARAMS drawParams 这个参数获取当前行绘制了多少字符,mWidth为行宽。如果字符串没有绘制完,继续下一行。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值