?? mfc學(xué)習(xí)進(jìn)階06.txt
字號:
這一次我們主要的任務(wù)是“創(chuàng)建和管理運(yùn)用程序資源”,前面我們已經(jīng)初步了解了一下資源,用自己的話來描述就是,凡是運(yùn)用程序要用到數(shù)據(jù)就叫資源。我們還初步了解了怎么把資源嵌入程序框架中,還記不記得有Skeleton.rc和Resource.h這兩個(gè)文件。
我們下面的任務(wù)是:
1。了解資源的類型(我想用的地方不一樣,類型就不同吧!估計(jì)不同類型的資源數(shù)據(jù)
類型不同才這樣分的)
2。如何創(chuàng)建資源腳本。(資源腳本難道就是包含資源數(shù)據(jù)的文件,那么Skeleton.rc也是喲??)
3。如何使用資源。(這當(dāng)然是我們最關(guān)心的)
書上先介紹了資源的任務(wù),看看資源是干嗎的?
我曾聽到過這樣的一句話“程序就是數(shù)據(jù)和算法”。書上說這個(gè)數(shù)據(jù)包括兩個(gè)部分,一個(gè)是程序啟動(dòng)后,傳遞給運(yùn)用程序的(是我們看得最明顯的); 另一部分是在創(chuàng)建運(yùn)用程序的過程當(dāng)中,用來構(gòu)建圖形用戶界面的,如菜單,圖標(biāo)等等。(也是哈,按照時(shí)間的先后分)這個(gè)另一部分就是指的資源了。
資源是被鏈入運(yùn)用程序當(dāng)中的,但我們有時(shí)候看不見資源,只有一個(gè)exe文件,這是因?yàn)橘Y源已經(jīng)被鏈入可執(zhí)行文件中去了,也就是說,資源被編譯為二進(jìn)制文件,像源文件一樣被鏈接為可執(zhí)行文件.有時(shí)候是編譯到DLL中了.
資源是怎么被編譯的呢?其過程如下:
資源(RC,BMP,JCO)------資源編譯器-------編譯過的資源文件(.RES)-----------鏈入運(yùn)用程序中
注意:.RC的文件是資源腳本文件,所有的資源都是在其中定義,資源也支持預(yù)編譯,如:#DEFINE和#INCLUDE
在MFC實(shí)踐中,是在一個(gè)叫RESOURCE.H的文件中定義資源常量.任何與資源有關(guān)的文件都引用這個(gè)文 件
有的人會奇怪,為什么一定要編譯進(jìn)去?原因有二.
1.如果不編譯,資源文件被破壞,程序就會癱瘓.
2.編譯后速度會很快
進(jìn)入第二個(gè)主題:資源類型
需要提出的是:WIN32和MFC依賴的是相同的資源.
主要有:加速鍵,位圖,光標(biāo),圖標(biāo),菜單,對話框,字符串表
下面一一介紹這些資源:
1.加速鍵
加速鍵就是我們常說的快捷鍵,用戶可以定義一個(gè)和菜單命令綁定的鍵來創(chuàng)建加速鍵.清單如下:
IDR_MYAPP ACCELERATIONS //ACCELERATION是加速鍵列表標(biāo)識,不同的資源是不同的標(biāo)識
BEGIN
"X", ID_EDIT_CUT, VIRTKEY,CONTROL //ID_EDIT_CUT是標(biāo)準(zhǔn)菜命令"剪切"的標(biāo)識符
"C", ID_EDIT_COPY, VIRTKEY,CONTROL //"C"表示組合基本鍵,CONTROL表示另一個(gè)
"V", ID_EDIT_PASTE, VIRTKEY,CONTROL //VIRTKEY表示這是一個(gè)對應(yīng)關(guān)系
END(這里我們要能舉一反三,要了解shift要怎么表示,還有些什么命令?)
2.位圖
位圖最多是用來為 工具欄的按鈕 存貯圖像.與加速鍵不同的是位圖是從外部文件存取.下面是一個(gè)定義位圖資源的例子.
IDR_MYIMAGE BITMAP "MyImage.bmp"//用了IDR_MYIMAGE(IDR_MYIMAGE是在Resource.h 中定義的標(biāo)識符) 標(biāo)識資源,BITMAP標(biāo)識資源是一個(gè)位圖,文件名為"MyImage.bmp"
3.光標(biāo)
光標(biāo)是一個(gè)簡單的可替換的鼠標(biāo),其實(shí)就是一個(gè)小的位圖,不同的是光標(biāo)有一個(gè)熱點(diǎn)用來標(biāo)識其位 置.光標(biāo)也是要一個(gè)獨(dú)立的文件(.CUR)中.下面是一個(gè)光標(biāo)的定義:
IDR_MYAPP CURSOR "MyApp.cur"
其含義跟位圖的差不多.
4.圖標(biāo)
圖標(biāo)是用來標(biāo)識最小化了的應(yīng)用程序的一個(gè)小位圖,其大小為所欲為32*32或16*16.圖標(biāo)存入一個(gè)獨(dú)立文件(.ICO)中.下面是一個(gè)圖標(biāo)的定義:
IDR_MYAPP ICON "MyApp.ico"
5.菜單
菜單包含一系列命令,每一個(gè)菜單命令都有一個(gè)標(biāo)識符與之對應(yīng),如上面我們看到的ID_EDIT_CUT等,在資源腳本中定義的菜單有時(shí)是作為菜單模板存儲的.下面是一個(gè)菜單模板的例子:
IDR_MYAPP MENU//MENU表明這是個(gè)菜單資源
BEGIN
POPUP"&File" //POPUP用來標(biāo)識子菜單
BEGIN
MENUITEM "&New\tCtrl+N", ID_FILE_NEW //MENTITEM標(biāo)識菜單項(xiàng)
MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN
MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE,GRAYED //GRAYED標(biāo)識菜單開始為灰色
MENUITEM "Save&As...", ID_FILE_SAVE_AX,GRAYED//GRAYED開始不能用
MENUITEM SEPARATON //SEPARATON 表明此菜單項(xiàng)作為上下菜單的分界線
MENUITEM "E&xit", ID_APP_EXIT
END
POPUP"&Help"
BEGIN
MENUITEM "About MyApp...", ID_APP_ABOUT
END
END
菜單項(xiàng)的命名格式:
其格式為菜單名加上每一項(xiàng)的加速鍵.&用來指定在項(xiàng)目的哪一個(gè)字母下加下劃線,也決定了與"ALT"綁定的鍵."\t"用于向加速文本中插入標(biāo)簽.菜單項(xiàng)屬性選擇可以為菜單項(xiàng)指定初使?fàn)顟B(tài),以下是菜單的屬性:
CHECKED 菜單項(xiàng)被選中時(shí)顯示一選中標(biāo)記,只對菜單項(xiàng)有效.
GRAYED 置不活動(dòng)狀態(tài)
INACTIVE 不更改菜單項(xiàng)內(nèi)文本,使菜單項(xiàng)的頂端菜單為不活動(dòng)狀態(tài)
以上定義的菜單項(xiàng)其實(shí)不用再在Resource.h中定義了,因?yàn)檫@些都在AfxRes.h中定義過了,這個(gè)文件同Resource.h一起包含到資源腳中了.
6.對話框
對話框是比較復(fù)雜的,這里只給出一個(gè)直觀的代碼.
IDD_ABOUTBOX DIALOG 0,0,217,55
VAPTION "About MyApp"
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
FONT 8,"MS Sans Serif"
BEGIN
ICON IDR_MYAPP,IDC_STATIC,11,17,20,20
LTEXT "MyApp version .0",
IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "Copyright(c) 1998 Michael Morrison",
IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "OK",IDOK,178,7,32,14,WS_GROUP
END
我的體會是DIALOG肯定是表明這是一個(gè)對話框資源,VAPTION是用來標(biāo)識對話框標(biāo)題的,STYLE是用來干什么的,我猜不出來了,FONT標(biāo)識字體,ICON 標(biāo)識圖標(biāo),后面的數(shù)字表示大小的嗎?LTEXT表示左對齊的顯示文本,DEFPUSHBUTTON標(biāo)識確定按鈕,以上是我的看法.錯(cuò)誤的請?zhí)岢鰜?
7.字符串表
字符串表我們在前面介紹過,它主要用來讓字符串與應(yīng)用程序分離.具體的請看上一次的.寫一個(gè)簡單的吧:
STRINGTABLE
BEGIN
AFX_IDS_APP_TITLE "MyApp"
END
這次就到這兒了,現(xiàn)在我會少量多次.好,拜!
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -