字体设置

1、MFC提供了CFont类专门用来设置字体,包括:CreateFont/CreateFontIndirect/CreatePointFont/CreatePointFontIndirect

  例: 

CFont font;
font.CreatePointFont(300,"黑体",NULL);
CFont *pOldFont=dc.SelectObject(&font);
...
dc.SelectObject(pOldFont);

若要实现功能完整的字处理程序,需利用MFC提供的CEditView/CRichEditView这两个类,后者的功能强于前者;如果让程序的视图窗口类直接派生于这两个类之一的话,程序就默认具备字处理程序的一些基本功能了。

2、字幕变色功能

  int DrawText( const CString& str, LPRECT lpRect, UINT nFormat );

  DrawText函数:在指定的矩形范围内输出文字;将其限制的显示范围覆盖在原位置的完整文本上,不断增加限制范围的宽度,并在限制范围内以不同颜色显示原文本内容,以达到卡拉OK的字幕变色效果:

  在CTextView类的OnCreate函数中设置定时器:

  SetTimer(非0值的定时器标识,定时间隔,NULL);

  //设置定时器

  SetTimer(1,100,NULL)

  给CTextView类添加WM_TIMER消息的响应函数:

  

  

  自动生成的响应函数OnTimer的nIDEvent参数即为定时器的标识,当程序有多个定时器时,可根据判断其标识的不同做不同的处理

  DrawText函数的第二个参数需要设置一个变量值来表示矩形限制范围的宽度,在CTextView类中添加一个成员变量:int m_nWidth,在CTextView类的构造函数中将该变量初始化为0

   

CTextView::CTextView()
{
    // TODO: add construction code here
    m_strLine="";
    m_ptOrigin=0;
    m_nWidth=0;
}

  该矩形限制范围的宽度由m_nWidth变量决定,高度由设备描述表中当前字体的高度决定(即需要显示的文本的高度);当完整文本全部输出完成后,应将矩形限制范围的宽度重置为0后再从新显示:  

void CTextView::OnTimer(UINT nIDEvent) 
{
    if(1==nIDEvent){ //判断定时器所对应的标识
        m_nWidth+=5;  //设置m_nWidth变量的值按5像素点增加

        CClientDC dc(this);
        //获取设备描述表中当前字体的信息
        TEXTMETRIC tm;
        dc.GetTextMetrics(&tm);

        //初始化DrawText函数所要限定的矩形范围
        CRect rect;
        rect.left=0;
        rect.top=200;
        rect.right=m_nWidth;
        rect.bottom=rect.top+tm.tmHeight;
        
        //将设备描述表中文本颜色设置为红色
        dc.SetTextColor(RGB(255,0,0));
        
        //获得要显示的字符串资源
        CString str;
        str.LoadString(IDS_STRING);
        
        dc.DrawText(str,rect,DT_LEFT);  //DT_LEFT/DT_RIGHT/DT_CENTER

        //获取需要显示的字符串的尺寸
        //当限制显示范围的矩形范围宽度超过字符串的宽度时,将该矩形范围宽度设为0,将字符串重新开始输出,并将已输出的文本颜色设为蓝色
        CSize sz=dc.GetTextExtent(str);
        if(m_nWidth>sz.cx){
            m_nWidth=0;
            dc.SetTextColor(RGB(0,0,255));
            dc.TextOut(0,200,str);
        }
    }
    CView::OnTimer(nIDEvent);
}

 

posted @ 2017-05-28 17:33  Autumn_n  阅读(351)  评论(0编辑  收藏  举报
TOP