『VC++技术内幕』学习笔记(8)

2016-02-19 12:58 1 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享『VC++技术内幕』学习笔记(8)的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】

    第八篇:颜色和字体

   由于种种原因,雷神有4、5天没有看一眼VC++了,所以在开始之前我又把前几篇笔记仔细的看了一遍,使自己能够进入最佳的学习状态。因为学习状态的好坏直接影响学习的效率,有时候我看一天的书,可实际掌握的内容却很少,不知大家是否和我一样?今天要学的是颜色和字体。终于要进入多彩的世界了,这是一件令人兴奋的事情,本人向来对用程序做出漂亮的界面、画面和用程序发出悦耳的声音很感兴趣,因为我的目标是做游戏程序。

   标准的VGA显示卡使用的是8位颜色寄存器,所以它可以表示出262144种颜色,然而由于视频内存的限制、标准的VGA只能采用4位颜色代码,一次只能同时显示16种标准纯色。太少了不是吗?如何获得更加丰富的色彩呢,面向颜色的GDI函数可以使我们获得更多的颜色。每一种WINDOWS的颜色都是通过8位RGB值的组合来表示,面向颜色的GDI函数可以接收32位的COLORREF参数,这种类型的参数包含了8位的红、绿、蓝颜色值。WINDOWS的RGB宏可以将8位的红绿蓝值转化成COLORREF参数,经过模糊处理可以得到更多的颜色。我们可以这样创建刷子:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

CBrush brush(RGB(128,128,192));

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

看个例子:

例子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行逐渐放大的同字体字符串。

   书上还有一个例子大家应该也实际运行一下,雷神就不废话了,关于颜色和字体就说到这吧。下面将进入对话框和控件,利用它们我们便可以做一些小的应用了。

来源:https://www.tulaoshi.com/n/20160219/1602663.html

延伸阅读
第七章:无模式对话框 和 Windows通用对话框类 1,[无模式对话框]在它处于激活状态下还允许用户在(同一个应用程序中)其它地方工作。    [通用对话框]则是C++和一组Windows的实用对话框之间的程序设计借口,包括File Open,Page Setup,Color等等,它们都是通过COMDLG32.DLL来实现的。 2,两种发送Windows消息: CWnd::SendMessag...
第六章:模式对话框和Windows通用控件 1,对话框也是窗口,它不当可以接受消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图操作。 2,模式对话框在被关闭之前,用户无法在同一应用程序的其它地方进行工作。模式对话框更易于编程。 无模式对话框在它仍保留在屏幕的同时,用户还可以在应用程序的其它窗口进行工作。 3,对话框...
第一章:Microsoft Windows 和 Visual C++ 1,Windows应用程序中一定要有WinMain函数,用来完成某些特殊的任务,其中最主要的是创建应用次序的主窗口。 2,DOS下,所有次序的目标模块在创建过程中都被静态连接起来。而Windows允许动态连接,即一些特定结构的库(DLL)可以在运行过程中被装入和连接,并且被多个应用程序共享。 3,项目是一些相...
第四章:基本事件处理、映射模式和滚动视图 1,消息映射:如在视窗中按下鼠标做键,会自动发送WM_LBUTTONDOWN消息,如果要对这消息有所反应的话,需 //{{AFX_MSG(CEx04aView)  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//头文件声明消息响应函数原型。 /
去年的时候,由于某种原因,我需要将一个文件的二进制形式以文本的格式输出到一个文本文件中,类似下面这个样子:   4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00   B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00...

经验教程

683

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部