.rc文件和.rc2文件
c和rc2都是資源文件,包含了應用程序中用到的所有的資源。
兩者不同在於:rc文件中的資源可以直接在VC集成環境中以可視化的方法進行編輯和修改;
而rc2中的資源不能在VC的集成環境下直接進行編輯和修改, 而是由根據需要手工地進行編輯。
(
// xxx.RC2 - Microsoft Visual C++ 不會直接編輯的資源
)
在下面的地址找到關於RC2文件的描述:
http://msdn.microsoft.com/zh-cn/library/y3sk7e6b(VS.80).aspx
RC2文件:包含項目使用的附加資源的腳本文件。可以在項目的 .rc 文件的頂部包括 .rc2 文件。
.rc2 文件用於存放由多個不同項目使用的資源。不必為不同的項目多次創建相同的資源,而是可以將它們放在一個 .rc2 文件中,然后將該 .rc2 文件包括在主 .rc 文件中。
.rc2 擴展資源文件,當調用到其它project的資源的時候就會產生,用到資源的時候,比如說一個圖片等等……
---------------------
MFC中的.rc文件.
統一資源管理:
在win32編程中,為方便項目中的資源統一管理,提供了一個格式統一的資源文件,對各種資源進行管理。它的擴展名是.rc,在程序編譯時它會被資源編譯器編譯生成一個.res的二進制文件。
rc文件的語法:
1.注釋:注釋方式和 C 語言相通,單行注釋用 // 符號,多行注釋用 /* ... */ 符號。
2.預處理命令:預處理指令包括一些頭文件的引用(使用 #include ,也同 C 語言)。
3.編譯指令:預定義(#define,常量和宏,不支持帶參數的宏) 和 條件編譯(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。
4.資源定義聲明:資源定義的聲明中包括“資源”(Resources),"控件"(Controls) 和 “聲明”(Statements) 3 類。
資源定義聲明:
1.資源(Resources):“資源”具有資源 ID,在程序中可以使用 FindResource ,LoadResource,LoadMenu 等資源相關 API 來操作。常見的定義如下:
(1)從文件導入的資源類型:(BITMAP,ICON,HTML,FONT,CURSOR 等)
- //格式:
- nameID BITMAP filename
- //例子:
- IDI_ICON_MAIN ICON "res\\icon.ico" //ICON RESOURCE
(2) 對話框資源類型:(DIALOG,DIALOGEX 等)(對話框可以包括若干子控件,如菜單,按鈕等,定義語法如下)
//模板
nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]] {control-statements }
//例子
IDD_DIALOG_ABOUT DIALOGEX 0, 0, 290, 59 //DIALOGEX RESOURCE
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog" // CAPTION STATEMENT
FONT 8, "MS Shell Dlg", 400, 0, 0x1 // FONT STATEMENT
BEGIN
LTEXT "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX // CONTROL
LTEXT "Copyright (C) 2008",3002,26,30,119,8 // CONTROL
DEFPUSHBUTTON "OK",IDOK,234,14,32,14,WS_GROUP // CONTROL
DEFPUSHBUTTON "Quit",IDCANCEL,234,31,32,14,WS_GROUP // CONTROL
END
MFC resource.h 和.rc文件的關系。
xx.rc包含了resource.h
我們可以打開xx.rc文件,內容如下:
// Microsoft Visual C++ 生成的資源腳本。 // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // 從 TEXTINCLUDE 2 資源生成。 // #include "afxres.h" #include "verrsrc.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "#include ""verrsrc.h""\r\n" "\0" END
.
resource.h就是.rc文件的頭文件
.rc文件里的常量全在resource.h定義
.rc文件包含了整個工程的所有資源信息,包括對話框、位圖、菜單、圖標、工具欄以及字符串等資源;他們
的大小,風格,字體等屬性信息,都包含在其中;
一般情況下不用你去寫和修改
vc會幫你寫和改
但是如果你想用以前的.rc中的資源比如你以前做的對話框
你只需復制粘貼就行了
就象下面這段
IDD_JK_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "jk"
FONT 9, "宋體"
BEGIN
PUSHBUTTON "學號",IDC_BUTTON1,25,75,62,22
PUSHBUTTON "姓名",IDC_BUTTON2,179,75,64,24
EDITTEXT IDC_EDIT1,105,75,57,24,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT2,261,75,46,24,ES_AUTOHSCROLL
END
你可以復制到你新的工程里去。
方法是用記事本打開.rc文件然后粘貼進去
但是vc可能會提示IDD_JK_DIALOG IDC_BUTTON1,IDC_BUTTON2,IDC_EDIT1,IDC_EDIT2沒有定義
這時你只需要用記事本打開resource.h
在里面加
#define IDD_JK_DIALOG 102
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
#define IDC_EDIT1 1002
#define IDC_EDIT2 1003
如果你需要做一個有很多控件的對話框
但是以前做過一個一樣的對話框
這時你就可以使用這種方法
---------------------
找不到資源的解決辦法
沒有包含資源文件,在這個對話框的頭文件首位包含:#include “resource.h”可以解決
參考:
https://www.cnblogs.com/wenluderen/p/4331846.html
error MSB6006: “rc.exe”已退出,代碼為 1:
\Microsoft.CppCommon.targets(1267,5): error MSB6006: “rc.exe”已退出,代碼為 1
原因在與xx.rc文件中引用了#include "targetver.h" 。
但是我把這個targetver.h文件移除了。
VC 中clw、ncb、aps文件的作用
.clw文件記錄了類的信息,如果classView中某個類不見了,重新生成該文件就可以了,方法:刪除此文件,點擊“建立類向導”,根據提示輸入工程名稱就可以了;
.ncb文件記錄了類的提示信息,如果類的成員函數和變量的提示不見了,重新生成該文件即可,方法同上;
.aps文件記錄了資源信息,要利用現成的資源,需要修改3個文件,.rc文件,Resource.h文件和.aps文件,.aps直接刪除后,進入程序,VC會自動生成。
有時候我們改了rc不生效,直接 刪除.aps文件重新打開即可。
vs中資源管理器刪除控件:
刪除控件(如static),不會自動更新resource.h,而且修改static控件id,會在resource.h中同時記錄修改前后的兩個id,但后面的數值(1072)是相同的,下圖:
驗證,手動從窗體上刪除static控件 ,resource.h並不會自動更新。這樣就有個風險就是,resourc.h中的控件ID在代碼中農工仍然是可以被使用的,需要注意!
有次,手動刪除新添加的static后,編譯居然報錯了,查了下,還是因為id修改的原因,屏蔽掉resource.h中的定義就好了。
vc6 報錯:
“old DIB in res XXX.ico; pass it through SDKPAINT”錯誤
VC中使用圖標發生的一個錯誤的解決辦法:
錯誤提示類似於:
old DIB in res XXX.ico; pass it through SDKPAINT
這個錯誤通常發生在你用你自己的圖標替換了原來的資源文件中的圖標之后,據說是因為256色的圖標和真彩色的圖標之間的區別造成的。
解決辦法也很簡單:用 IconWorkshop 或者vs2010也可以直接編輯,刪除256X256以上大小的圖形類型就可以了,將出錯的圖標中的256色以上的“子圖標”全部刪除(眾所周知,一個圖標文件是包含N個子圖標的,不同的大小,不同的色深),再保存,然后再在VC中重新編譯,就應該可以通過了。
打開xx.rc經常顯示 資源視圖--顯示在另一個編輯器中打開
一般是有一些xx.rc文件已經打開了,關閉這個。我有時候關閉這個經常不起作用,這時候選擇【關閉所有文檔】,然后再點擊xx.rc就可以打開了。
resource.h id重復問題
我們知道,通過MFC中工具欄拖動一個控件到相應的容器(比如對話框)上時,MFC會自動生成它的一個不重復的ID。但是我們自定義一個ID,如何保證自己的ID不會和MFC生成的ID重復呢,通過對Resource.h文件分析可得出非常有用的信息,對如何自定義一個與MFC不沖突的ID值非常有指導意義。
-
/一個典型的resource.h文件
{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by DlgTest20150528.rc // #define IDM_ABOUTBOX 0x0010 #define IDD_ABOUTBOX 100 #define IDS_ABOUTBOX 101 #define IDD_DLGTEST20150528_DIALOG 102 #define IDS_MY_BTN 102 #define IDR_MAINFRAME 128 #define IDC_TREE1 1000 #define IDC_TREE2 1002 #define IDC_BUTTON1 1003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 //下一個資源ID(插入的一些對話框、圖片、圖標等) #define _APS_NEXT_COMMAND_VALUE 32771 //下一個命令ID(主菜單、彈出菜單等) #define _APS_NEXT_CONTROL_VALUE 1004 //下一個控件ID(各種控件ID) #define _APS_NEXT_SYMED_VALUE 101 //狀態欄、工具欄上所用控件與標簽 //ID_(菜單項) IDI_(圖標) IDM_(菜單項) IDS_(字符串) IDC_(對話框控件) IDW_(鼠標) #endif #endif
有時候我們為了方便生成自己想要的id,可以修改
_APS_NEXT_CONTROL_VALUE
這個值。
關於Resource.h文件重復定義的問題,只要注意一些關鍵點,重復是沒有問題的,嚴格來說這個是有條件的重復,資源ID的唯一性是相對來說的,比如
1. 在一個對話框內的所有同類型控件ID是不可以重復的
2. 在一個工程內所有的DIALOG ID是不可以重復. 但是不同DIALOG中的控件ID 值可以重復
3.菜單與DIALOG 的ID 是可以重復的
4.不同類型的控件ID可以重復,
除此以外,若無意中設置到相同的ID,注意觀察編譯連接時警告或錯誤,如:
"type:GROUP_ICON, name:149, language:0x0804"
關於Resource文件的信息描述,下面是摘抄的一部分內容:
找到了其中宏定義的含義,知道了這些,控件ID就可以隨便改啦。
_APS_NEXT_RESOURCE_VALUE is the next symbol value that will be used for a dialog resource, menu resource, and so on. The valid range for resource symbol values is 1 to 0x6FFF.
下一個對話框或菜單等資源的ID,1----0x6FFF
_APS_NEXT_COMMAND_VALUE is the next symbol value that will be used for a command identification. The valid range for command symbol values is 0x8000 to 0xDFFF.
下一個命令的ID,0x8000---0xDFFF
_APS_NEXT_CONTROL_VALUE is the next symbol value that will be used for a dialog control. The valid range for dialog control symbol values is 8 to 0xDFFF.
下一個對話框控件的ID,8---0xDFFF
_APS_NEXT_SYMED_VALUE is the next symbol value that will be issued when you manually assign a symbol value using the New command in the Symbol Browser.
在符號瀏覽器中使用新增命令里的預置ID