荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: cay (忧郁的年头), 信区: Program
标  题: 『VC++技术内幕』学习笔记(8)  作者 雷神
发信站: 荔园晨风BBS站 (Thu Jan 10 10:45:06 2002), 转信

原作者姓名 雷神
文章原始出处 http://www.ai361.com
正文
『VC++技术内幕』学习笔记(8)
雷神
第八篇:颜色和字体

由于种种原因,雷神有4、5天没有看一眼VC++了,所以在开始之前我又把前几篇笔
记仔细的看了一遍,使自己能够进入最佳的学习状态。因为学习状态的好坏直接影
响学习的效率,有时候我看一天的书,可实际掌握的内容却很少,不知大家是否和
我一样?今天要学的是颜色和字体。终于要进入多彩的世界了,这是一件令人兴奋
的事情,本人向来对用程序做出漂亮的界面、画面和用程序发出悦耳的声音很感兴
趣,因为我的目标是做游戏程序。
标准的VGA显示卡使用的是8位颜色寄存器,所以它可以表示出262144种颜色,然而
由于视频内存的限制、标准的VGA只能采用4位颜色代码,一次只能同时显示16种标
准纯色。太少了不是吗?如何获得更加丰富的色彩呢,面向颜色的GDI函数可以使
我们获得更多的颜色。每一种WINDOWS的颜色都是通过8位RGB值的组合来表示,面
向颜色的GDI函数可以接收32位的COLORREF参数,这种类型的参数包含了8位的红、
绿、蓝颜色值。WINDOWS的RGB宏可以将8位的红绿蓝值转化成COLORREF参数,经过
模糊处理可以得到更多的颜色。我们可以这样创建刷子:
CBrush brush(RGB(128,128,192));
看个例子:
//*****************************
// 例子8-1
//
void CMy81View::OnDraw(CDC* pDC)
{
    pDC->SetBkColor (RGB(255,0,0));
    pDC->SetTextColor (RGB(198,198,198));
    pDC->TextOut (10,10,"雷神祝大家在新的一年万事如意!");
}
在OnDraw(CDC* pDC)函数中设定文本的背景色和前景色,我们试着改变RGB宏的数
值,会发现SetBkColor和SetTextColor函数并不总是显示模糊色,如果模糊色过于
复杂,它们会选择与之相近的纯色来显示。书上是这样说的。以目前的硬件设备来
说我们可以在1024X768的方式下获得24位真彩色,这意味着我们可以通过RGB宏获
得任何我们想要的颜色,其实我们的肉眼已经不能分辨它们的区别了。其实256色
已经足够作出很精美的画面了,光荣的三国志系列栩栩如生的人物就是256色绘制
的,在这点不得不佩服日本的漫画水平。
下面我们来看看字体。字体是GDI对象,和其他GDI对象一样它可以按比例缩放,被
裁剪,可以被选进设备环境,并可以被释放和删除。书上对于字体部分描述实在令
我不愿意读,我想大家可能也是这样的心情。那好我们便不去读它,直接用一个例
子来理解字体。
例子8-2:
1、建立一个新MFC AppWizard(exe)项目“82”,除选择单文档外其余全用默认项。

2、重载My82View类的OnPrepareDC函数
void CMy82View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
    pDC->SetMapMode (MM_ANISOTROPIC);//应该还记得此种映射模式是X,Y的比
例因子可以独立变化
    pDC->SetWindowExt (1440,1440);//将映射模式设置成逻辑twips即一个逻辑
单位等于1/1440逻辑英寸。
    pDC->SetViewportExt (pDC->GetDeviceCaps (LOGPIXELSX),
-pDC->GetDeviceCaps (LOGPIXELSY));
    //用SetWindowExt和SetViewportExt定义比例GetDeviceCaps函数可以获得各
种显示参数,典型的参数如下:
/*
在640X480分辨率下:
HORZSIZE    物理宽度(毫米)        320
VERTSIZE    物理高度(毫米)        240
HORZRES    象素宽度            640
VERTRES    象素高度            480
LOGPIXEXSX    每逻辑英寸的水平点数    96
LOGPIXEXSY    每逻辑英寸的垂直点数    96
*/
}
3、加入一个Private类型的辅助函数ShowFont用来显示文本。可以用Add Member
Function的方法加入,也可以直接修改代码
在82View.h中加入
class CMy82View : public CView
{
private:
    void ShowFont(CDC* pDC, int& nPos, int nPoints);
    //以下为原生成代码,不需改变
    ......
}
在82View.cpp中加入
void CMy82View::ShowFont(CDC* pDC, int& nPos, int nPoints)
{
    TEXTMETRIC tm;
    /*
    TEXTMETRIC结构包含字体的所有逻辑单位信息原型如下:
    typedef struct tagTEXTMETRIC {  /* tm */
        int  tmHeight;
        int  tmAscent;
        int  tmDescent;
        int  tmInternalLeading;
        int  tmExternalLeading;
        int  tmAveCharWidth;
        int  tmMaxCharWidth;
        int  tmWeight;
        BYTE tmItalic;
        BYTE tmUnderlined;
        BYTE tmStruckOut;
        BYTE tmFirstChar;
        BYTE tmLastChar;
        BYTE tmDefaultChar;
        BYTE tmBreakChar;
        BYTE tmPitchAndFamily;
        BYTE tmCharSet;
        int  tmOverhang;
        int  tmDigitizedAspectX;
        int  tmDigitizedAspectY;
    } TEXTMETRIC;
    */
    CFont      fontText;
    CString    strText;
    CSize      sizeText;
    fontText.CreateFont(-nPoints * 20, 0, 0, 0, 400, FALSE, FALSE, 0,
                        ANSI_CHARSET, OUT_DEFAULT_PRECIS,
                        CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                        DEFAULT_PITCH | FF_ROMAN, "Tahoma");
    //调用CFont::CreateFont函数,建立GDI的字体对象,参数1和2是字体的高
度和宽度,最后一个参数是字体的名称
    CFont* pOldFont = (CFont*) pDC->SelectObject(&fontText);
    //将新字体选进设备,并返回指向前一次被选对象的指针。作用保存原来的对
象,以便完成任务时恢复它
    pDC->GetTextMetrics(&tm);
    //参数是指向TEXTMETRIC结构的指针,得到当前字体的属性,
    strText.Format("%d磅 WINDOWS 中文字体范例 1234567890", nPoints);
    sizeText = pDC->GetTextExtent(strText);
    pDC->TextOut(0, nPos, strText);
    pDC->SelectObject(pOldFont);
    //恢复原来的对象
    nPos -= tm.tmHeight + tm.tmExternalLeading;

}

4、编辑CMy82View::OnDraw函数
void CMy82View::OnDraw(CDC* pDC)
{
    int nPosition = 0;
    for (int i = 12; i <= 24; i += 2) {
        ShowFont(pDC, nPosition, i);
    }
}
5、编译运行,可以看到7行逐渐放大的同字体字符串。
书上还有一个例子大家应该也实际运行一下,雷神就不废话了,关于颜色和字体就
说到这吧。下面将进入对话框和控件,利用它们我们便可以做一些小的应用了。

未完待续
下一篇:模式对话框和通用控件



--

        放弃是最容易的事

        Email: caiji@163.net          QQ: 80123

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.168]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店