程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> 『VC++技術內幕』學習筆記(8)

『VC++技術內幕』學習筆記(8)

編輯:VC++

 

第八篇:顏色和字體

  由於種種原因,雷神有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行逐漸放大的同字體字符串。

  書上還有一個例子大家應該也實際運行一下,雷神就不廢話了,關於顏色和字體就說到這吧。下面將進入對話框和控件,利用它們我們便可以做一些小的應用了。

未完待續

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved