CDC求助

clddicky 2003-06-13 09:01:32
如何写彩色的字。
具体代码如下
但是看msdn好像TextOut不管CPen的值,只是CFont有用。
那应该用什么方法。


CDC* pDC = GetDC() ;
CFont rfont , *pOldFont ;
CPen rPen, *pOldPen;

rfont.CreatePointFont( 1000 , "SimSun" ) ;
rPen.CreatePen(0, 0, RGB(255, 0, 0));
pOldFont = pDC->SelectObject( &rfont ) ;
pOldPen = pDC->SelectObject( &rPen);

pDC->SetBkMode( TRANSPARENT ) ;
pDC->SetBkColor( RGB(255, 0, 0) ) ;
pDC->SetTextColor(RGB(255, 0, 0));

CString stxt = "Y" ;
pDC->TextOut( 0 , 0 , stxt ) ;

pDC->SelectObject( pOldFont ) ;
pDC->SelectObject(pOldPen);
ReleaseDC( pDC ) ;
...全文
64 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoyin 2003-06-13
  • 打赏
  • 举报
回复
void CXXXDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDC *dc = GetDC();
DrawTitleInRect(dc,"&VC\n知\n识\n库",CRect(100,10,250,90),1,1,1);
CDialog::OnPaint();
}
}


CRect CXXXDlg::DrawTitleInRect(CDC *pDC, CString szString, LPRECT lpRect,
long lMode, long lHori, long lVert)
{
CRect rcInner(lpRect);

if(rcInner.Width() ==0)
return rcInner;

TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,255));

int tmpWidth=tm.tmAveCharWidth, tmpHeight=tm.tmHeight;

if(lMode==0)
{
rcInner.left+=tmpWidth;
rcInner.right-=tmpWidth;
rcInner.top-=tmpWidth;
rcInner.bottom+=tmpWidth;
}
if(lMode==1)
{
rcInner.left+=tmpWidth;
rcInner.right=rcInner.left+tmpWidth;
rcInner.top-=tmpWidth;
rcInner.bottom+=tmpWidth;
}

pDC->DrawText(szString, rcInner,DT_CALCRECT);

switch(lHori)
{
case 0:
break;
case 1:
{
long xOutCent=(lpRect->right+lpRect->left)/2;
long xInnCent=(rcInner.right+rcInner.left)/2;
rcInner.left+=(xOutCent-xInnCent);
rcInner.right+=(xOutCent-xInnCent);
}
break;
case 2:
{
long lInWidth=rcInner.right-rcInner.left;
rcInner.right=lpRect->right-tmpWidth;
rcInner.left=rcInner.right-lInWidth;
}
break;
default:
break;
}

switch(lVert)
{
case 0:
break;
case 1:
{
long yOutCent=(lpRect->bottom+lpRect->top)/2;
long yInnCent=(rcInner.bottom+rcInner.top)/2;
rcInner.top-=(yInnCent-yOutCent);
rcInner.bottom-=(yInnCent-yOutCent);
}
break;
case 2:
{
long lInHeigh=rcInner.top-rcInner.bottom;
rcInner.bottom=lpRect->bottom+tmpWidth;
rcInner.top=rcInner.bottom+lInHeigh;
}
break;
default:
break;
}

//----------------------------------------------------------------
//功能:根据新、老矩形,重新计算行数,使文字多行显示,jingzhou xu
//----------------------------------------------------------------
//一行中最大字符数
int nMaxLineChar = abs(lpRect->right - lpRect->left) / tmpWidth;
//记录当前行的宽度
short theLineLength=0;
//记录当前行中汉字字节数,以防止将一半汉字分为两行
unsigned short halfChinese=0;

for(int i=0; i<=szString.GetLength()-1; i++)
{
if(((unsigned char)szString.GetAt(i) == 0x0d) && ((unsigned char)szString.GetAt(i+1) == 0x0a))
theLineLength=0;

//大于0xa1的字节为汉字字节
if((unsigned char)szString.GetAt(i) >= 0xA1)
halfChinese++;
theLineLength++;

//如果行宽大于每行最大宽度,进行特殊处理
if(theLineLength > nMaxLineChar)
{
//防止将一个汉字分为两行,回溯
if(halfChinese%2)
{
szString.Insert(i,(unsigned char)0x0a);
szString.Insert(i,(unsigned char)0x0d);
}
else
{
szString.Insert(i-1,(unsigned char)0x0a);
szString.Insert(i-1,(unsigned char)0x0d);
}

theLineLength = 0;
}
}

//重新计算矩形边界范围
// int tmpLine = int(abs(szString.GetLength()*tmpWidth / abs(lpRect->right - lpRect->left)-0.5));
// tmpLine += (szString.GetLength()*tmpWidth % abs(lpRect->right - lpRect->left))? 1 : 0;
// if(tmpLine == 0)
// tmpLine = 1;
if(rcInner.bottom < lpRect->bottom)
rcInner.bottom = lpRect->bottom;
if(rcInner.top > lpRect->top)
rcInner.top = lpRect->top;

//------------------------------------------------------------------------------

if(lHori==0)
pDC->DrawText(szString, rcInner, DT_WORDBREAK|DT_LEFT);
else if(lHori==1)
pDC->DrawText(szString, rcInner, DT_WORDBREAK|DT_CENTER);
else if(lHori==2)
pDC->DrawText(szString, rcInner, DT_WORDBREAK|DT_RIGHT);

return rcInner;
}
common_man 2003-06-13
  • 打赏
  • 举报
回复
用drawtext试试

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧