VC++60 第九章 在窗体上写字

第九章 在窗体上写字

从前面的例程中我们看到,要在视窗式的应用程序中显示文字可用静态文本、编辑框和弹出消息框等方法。另外的一种方法是直接在窗口面版上写字,用这种方法还可以自由设置字体、大小和颜色。在窗体上写字实际上是“画”字,需要先创建一个可以“画”的对象——CPaintDC对象。

 

本章要点

1 用CFont类和创建字体
2 如何在窗体上写字?
3 单选按钮组的用法
4 利用列表框进行选择

 

9.1 CFont类简介

 

要设置字体需要创建一个CFont类对象,然后利用它的CreateFont()函数来设置当前字体。CreateFont()有14个参数,下面我们用代码加注释的方法简要介绍,详情可查阅MSDN连机帮助文档,参看MFC库手册。

        CFont myFont;             //创建一个字体对象
        myFont.CreateFont(
           16,                   //1.字体高度。
            0,                    //2. =0 表示保持纵横比
            0, 0,                 //3.4.角度
            400,                  //5.线的宽度,400为正常  
            FALSE, FALSE, 0,      //6.7.8.斜体,下划线,删除线(否)
            ANSI_CHARSET,         //9.字符集
            OUT_DEFAULT_PRECIS,       //10.精度
            CLIP_DEFAULT_PRECIS,      //11.
            DEFAULT_QUALITY,          //12.质量
            DEFAULT_PITCH|FF_SWISS,   //13.强度和家族 
            "Arial"                  //14.字体名称
            );

这14个参数中第一个和最后一个最重要。第一个表示字体高度,它决定了字符的大小,数值16表示字符举行的高为16个点,字体大小与你在本文中看到的差不多。而第二个参数=0 表示保持纵横比,这就字体的宽度了。最后一个字体名称用字符串表示,你的机器上有些什么字体好用,你打开记事本程序就可以查到。

9.2 MyFont.exe程序的界面和功能

本例程我们设计一个应用程序可以不同大小和颜色的字体来显示用户任意输入的字符串。

VC++60 <wbr>第九章 <wbr>在窗体上写字
图chap09-01

 

当你在下面的编辑框中输入一行文字后,窗口内会同时显示两行文本。你可以用左边的单选按钮选择字体大小,文本大小会立即改变。你可以在左下角的列表框中选择文本的颜色,但要点击[设置]按钮后才生效。
输入文字后的界面如图02。

VC++60 <wbr>第九章 <wbr>在窗体上写字
图chap09-02

 

9.3 设计MyFont程序的界面

 

按照图1和参考下列属性表设计界面。

控件 标题 ID 其它属性
编辑框 - IDC_DATA_EDIT  
按钮 设置 IDC_SET_BUTTON  
按钮 EXIT ID_EXIT_BUTTON Styles:默认按钮
组框 Size IDC_STATIC  
单选按钮组 8,16,24... IDC_SIZE_RADIO0
IDC_SIZE_RADIO1 ...
 
列表框 - IDC_COLOR_LIST 选择方式=simple;Border选中
主对话框 MyFont IDD_MYFONT_DIALOG  

 

9.4 编写在窗体上写字的代码

 

给编辑框引进CString类的变量m_DataEdit。
为了在窗体上显示一行提示语,我们在OnPaint()函数中用默认字体来写字。

        CPaintDC dc(this); //
        UpdateData(TRUE); //Allow draw onto the panal
        dc.SetBkMode(TRANSPARENT);
        dc.TextOut(100,10,"请输入一行文本,Input a text please.");

语句1创建一个绘画的设备环境变量(对象)dc。语句2用TRUE允许更新。语句3设置北京模式为透明的。语句4用函数TextOut()输出文字,起始位置在坐标(100,0)处,窗口的左上角为坐标原点(0,0)。
下面紧接着创建新字体并用编辑框的输入信息来画字,代码如下:

        dc.TextOut(100,60,m_DataEdit);
        CFont myFont;
        myFont.CreateFont(16, 0, 0, 0 ,400,
            FALSE, FALSE, 0,
            ANSI_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH|FF_SWISS,
            "Arial");
        //Use new Font, store old font
        CFont* pOldFont = dc.SelectObject(&myFont);
        dc.TextOut(100,120,m_DataEdit);
        dc.SelectObject(pOldFont);

语句dc.TextOut(...)的前一语句的功能是,创建一个CFont对象pOldFont来寄存老字体,函数SelectObject()的功能是设置由参数指定的字体为当前字体。你立马就会明白,后一语句的功能就是恢复老字体为当前字体了。

为了让编辑框的输入能够写出来,就必须在编辑框有输入时让窗口重新画一遍。这需要给编辑框添加消息映射EN_CHANGE,在自动生成的OnChangeDataEdit()函数中加入语句:
   
      Invalidate();
它会调用OnPaint()函数重画窗口。
给[EXIT]按钮写好退出代码,保存、编译、连接和运行,输入文字已经能够显示了。

 

9.5 设计单选按钮组和列表框

 

单选按钮组的功能是:点击某个按钮就改变字体的大小重画窗体。为此,需要把这六个单选按钮归并为一组。方法是把第一个按钮IDC_SIZE_RADIO0设置为组属性,就是选中Group选项。但是,其他几个单选按钮的组属性必须为“不选中”。
VC++60 <wbr>第九章 <wbr>在窗体上写字
图chap09-03

 

这样,这组控件就是一个整体,选择某一个,就返回它的索引号,按钮IDC_SIZE_RADIO0的索引号是0,下一个是1,2...等。我们只要给第一个按钮IDC_SIZE_RADIO0设置变量m_Size,它就代表这个组。

现在来修改代码,把ONPaint()函数中创建字体的语句中的“字体高度”修改一下就行:
        myFont.CreateFont(8+ 8*m_Size, 0, 0, 0 ,400,
我们设定每个单选按钮相隔8点,因为第一个按钮的索引号是0,所以H的值是8,下一个是24,...。
为了在点击某个单选按钮时发出消息要求窗体重画,需要给每个单选按钮引进BN_ONCLICK事件,给响应函数添加要求重画的代码 Invalidate()。例如,按钮IDC_SIZE_RADIO0的函数为:,
void CMyFontDlg::OnSizeRadio1()
{
    // TODO: Add your control notification handler code here
    Invalidate();
}
操作时,你只要双击改按钮,就弹处确认对话框,当你[确定]后,就添加了响应函数并定位到那里可,可立即输入代码了。
现在再编译和运行,观看改变字体大小的效果。

编写列表框选择颜色的代码
设计时列表框的“选择方式”必须是单一选择,即simple,因为我们只能使用一种颜色啊。对列表框的、选择结果也是通过返回的索引号来识别的。在列表框中显示的项不能在设计时给定,需要在初始化函数OnInitDialog()中用代码来实现:
    m_Size = 0 ;
    UpdateData(TRUE);
    m_Color_List.AddString("黑色");
    m_Color_List.AddString("红色");
    m_Color_List.AddString("绿色");
    m_Color_List.AddString("蓝色");

在OnPaint()函数中需要增加设置颜色的语句。设置文本颜色用dc.SetTextColor(RGB(255,0,0))函数,其中参数RGB(255,0,0)是颜色类型RGB的构造函数,数值表示红色。一般格式是RGB(red,green,blue),取值0~255。为了列表框的成员函数来返回用户选择的索引号,需要引进列表框控件型变量m_Color_List,于是用m_Color_List.GetCaretIndex()就获得了索引号,根据索引号设置颜色,代码如下:
        switch(m_Color_List.GetCaretIndex())
        {
        case 0 : dc.SetTextColor(RGB(0, 0, 0));
            break;
        case 1 : dc.SetTextColor(RGB(255,0,0));
            break;
        case 3 : dc.SetTextColor(RGB(0,255,0));
            break;
        case 2 : dc.SetTextColor(RGB(0,0,255));
            break;
        default : dc.SetTextColor(RGB(0, 0, 0));
            break;
        }

这些代码都要在语句
    dc.TextOut(100,120,m_DataEdit);
之前。最后,要让[设置]按钮使用颜色生效,还要加入能够重画的语句Invalidate()。重新编译和运行后,就可以用不同的颜色和大小的字体来写字了。

9.6 附录 OnPaint()函数全文

为了方便读者使用,下面把OnPaint()函数全部复制下来,着色部分是我们自己的代码。

void CMyFontDlg::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
    {
      //My code start from here
        CPaintDC dc(this); //
        UpdateData(TRUE); //Allow draw onto the panal

        dc.SetBkMode(TRANSPARENT);
        dc.TextOut(100,10,"请输入一行文本,Input a text please.");
        dc.TextOut(100,60,m_DataEdit);
        //Create a new font
        CFont myFont;
        myFont.CreateFont(16+ 8*m_Size, 0, 0, 0 ,400,
            FALSE, FALSE, 0,
            ANSI_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH|FF_SWISS,
            "Arial");
        //Use new Font, store old fomt
        CFont* pOldFont = dc.SelectObject(&myFont);
        //Set textcolor
        switch(m_Color_List.GetCaretIndex())
        {
        case 0 : dc.SetTextColor(RGB(0, 0, 0));
            break;
        case 1 : dc.SetTextColor(RGB(255,0,0));
            break;
        case 3 : dc.SetTextColor(RGB(0,255,0));
            break;
        case 2 : dc.SetTextColor(RGB(0,0,255));
            break;
        default : dc.SetTextColor(RGB(0, 0, 0));
            break;
        }
        dc.TextOut(100,120,m_DataEdit);
        //Restore old Font
        dc.SelectObject(pOldFont);
        //My code end
        CDialog::OnPaint();
    }
}

练习和思考

1 单选按钮组没有一个是被选择的,这不符合常规。如何修改使得显示第一个按钮是选中状态?
2 设计一个弹出对话框,其中有一个列表框提供4-5种字体(含两种汉字字体)。利用它来改变主窗口显示的字体(FaceFont)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值