---
tags: MFC, C++, C
---
# MFC 中的 .rc 與 .rc2 檔案
rc和rc2都是资源文件,包含了应用程序中用到的所有的资源。它们两指向的是同一个资源。
两者不同在于:rc2文件中的资源可以直接在VS集成环境中以可视化的方法进行编辑和修改;
而rc中的资源是根据需要手工地进行编辑。
# 用意
1. 類似config、ini,等等的檔案
2. vs架構都有類似統一資源管理的文件 ex: resource manager
3. 用外部檔案方式,有時會出錯[這裡](https://blog.csdn.net/fevershen/article/details/71479973?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-71479973-blog-45643813.pc_relevant_multi_platform_whitelistv6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-71479973-blog-45643813.pc_relevant_multi_platform_whitelistv6&utm_relevant_index=6)
4. **重複利用設計不錯的視窗(dialog)**
# rc文件
```
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文 (繁體,台灣) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
#pragma code_page(950)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#ifndef APSTUDIO_INVOKED\r\n"
"#include ""targetver.h""\r\n"
"#endif\r\n"
"#include ""afxres.h""\r\n"
"#include ""verrsrc.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT)\r\n"
"LANGUAGE 4, 1\r\n"
"#include ""res\\ATLAgent45.rc2"" // 非 Microsoft Visual C++ 編輯過的資源\r\n"
"#include ""l.CHT\\afxres.rc"" // 標準元件\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\LOGO.ico"
IDI_MAIN_ICON ICON "LOGO.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDR_MAINFRAME BITMAP "res\\Toolbar.bmp"
/////////////////////////////////////////////////////////////////////////////
//
// Toolbar
//
IDR_MAINFRAME TOOLBAR 16, 15
BEGIN
BUTTON ID_EDIT_CUT
BUTTON ID_EDIT_COPY
BUTTON ID_EDIT_PASTE
SEPARATOR
BUTTON ID_APP_ABOUT
END
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MAINFRAME MENU
BEGIN
POPUP "檔案(&F)"
BEGIN
MENUITEM "結束(&X)", ID_APP_EXIT
END
POPUP "編輯(&E)"
BEGIN
MENUITEM "復原(&U)\tCtrl+Z", ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "剪下(&T)\tCtrl+X", ID_EDIT_CUT
MENUITEM "複製(&C)\tCtrl+C", ID_EDIT_COPY
MENUITEM "貼上(&P)\tCtrl+V", ID_EDIT_PASTE
END
POPUP "檢視(&V)"
BEGIN
MENUITEM "工具列(&T)", ID_VIEW_TOOLBAR
END
POPUP "說明(&H)"
BEGIN
MENUITEM "關於 ATLAgent45(&A)...", ID_APP_ABOUT
END
END
IDR_POPUP_MENU MENU
BEGIN
POPUP "POPUP"
BEGIN
MENUITEM "自訂選項 ...", ID_APP_Options
MENUITEM "顯示執行記錄", ID_APP_ShowLog
MENUITEM "版本說明", ID_APP_ABOUT
MENUITEM SEPARATOR
MENUITEM "重新啟動", ID_APP_Restart
MENUITEM SEPARATOR
MENUITEM "結束", ID_APP_EXIT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDR_MAINFRAME ACCELERATORS
BEGIN
"C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT
VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT
VK_F6, ID_NEXT_PANE, VIRTKEY, NOINVERT
VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT, NOINVERT
VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT
"X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 163
TOPMARGIN, 7
BOTTOMMARGIN, 55
END
IDD_SHOWLOG, DIALOG
BEGIN
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// LOCALHOST
//
IDR_LOCAL_CERT LOCALHOST "localhost.crt"
IDR_LOCAL_KEY LOCALHOST "localhost.key"
/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//
IDD_ABOUTBOX AFX_DIALOG_LAYOUT
BEGIN
0
END
IDD_SHOWLOG AFX_DIALOG_LAYOUT
BEGIN
0
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDP_OLE_INIT_FAILED "OLE 初始化失敗。請確認 OLE 程式庫的版本是否正確。"
IDP_SOCKETS_INIT_FAILED "Windows 通訊端安裝失敗。"
END
STRINGTABLE
BEGIN
IDR_MAINFRAME "ATLAgent45"
END
STRINGTABLE
BEGIN
AFX_IDS_APP_TITLE "ATLAgent45"
AFX_IDS_IDLEMESSAGE "就緒"
END
STRINGTABLE
BEGIN
ID_INDICATOR_EXT "EXT"
ID_INDICATOR_CAPS "CAP"
ID_INDICATOR_NUM "NUM"
ID_INDICATOR_SCRL "SCRL"
ID_INDICATOR_OVR "OVR"
ID_INDICATOR_REC "REC"
END
STRINGTABLE
BEGIN
ID_APP_ABOUT "顯示程式資訊、版本號碼及著作權\n關於"
ID_APP_EXIT "結束應用程式; 提示使用者儲存文件\n結束"
END
STRINGTABLE
BEGIN
ID_NEXT_PANE "切換至下一窗格\n下一個窗格"
ID_PREV_PANE "切換至上一個窗格\n上一個窗格"
END
STRINGTABLE
BEGIN
ID_WINDOW_SPLIT "將使用中視窗切割成窗格\n分割視窗"
END
STRINGTABLE
BEGIN
ID_EDIT_CLEAR "清除選取範圍\n清除"
ID_EDIT_CLEAR_ALL "清除所有的項目\n全部清除"
ID_EDIT_COPY "複製選取項目並放到剪貼簿\n複製"
ID_EDIT_CUT "剪下選取項目並放到剪貼簿\n剪下"
ID_EDIT_FIND "尋找指定的文字\n尋找"
ID_EDIT_PASTE "插入剪貼簿的內容\n貼上"
ID_EDIT_REPEAT "重複上次的動作\n重複"
ID_EDIT_REPLACE "用不同的文字取代指定文字\n取代"
ID_EDIT_SELECT_ALL "選取整份文件\n全選"
ID_EDIT_UNDO "復原上次的動作\n復原"
ID_EDIT_REDO "取消復原上次的動作\n取消復原"
END
STRINGTABLE
BEGIN
ID_VIEW_TOOLBAR "顯示或隱藏工具列\n切換工具列"
END
STRINGTABLE
BEGIN
AFX_IDS_SCSIZE "變更視窗大小"
AFX_IDS_SCMOVE "變更視窗位置"
AFX_IDS_SCMINIMIZE "將視窗縮成一個圖示"
AFX_IDS_SCMAXIMIZE "將視窗放到最大"
AFX_IDS_SCNEXTWINDOW "切換至下一個文件視窗"
AFX_IDS_SCPREVWINDOW "切換至上一個文件視窗"
AFX_IDS_SCCLOSE "關閉使用中視窗並提示使用者儲存文件"
END
STRINGTABLE
BEGIN
AFX_IDS_SCRESTORE "將視窗還原成標準大小"
AFX_IDS_SCTASKLIST "啟動工作清單"
END
#endif // 中文 (繁體,台灣) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHT)
LANGUAGE 4, 1
#include "res\ATLAgent45.rc2" // 非 Microsoft Visual C++ 編輯過的資源
#include "l.CHT\afxres.rc" // 標準元件
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
```
# 規範
1. 你不可能同时打开这俩个文件,必须要关闭其中一个,才能打开另一个
![](https://i.imgur.com/vLaLKU6.png)
2. 你创建了rc文件后,系统会创建Resource.h头文件,它把每一个资源都定义一个整数值
```
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 產生的 Include 檔案。
// 由 ATLAgent45.rc 使用
//
#define IDD_ABOUTBOX 100
#define IDP_OLE_INIT_FAILED 100
#define IDP_ALREADY_EXISTS_FAILED 101
#define IDP_SOCKETS_INIT_FAILED 104
#define IDR_MAINFRAME 128
#define IDR_ATLAgent3TYPE 130
#define IDR_LOCAL_CERT 311
#define IDR_LOCAL_KEY 312
#define IDR_POPUP_MENU 313
#define IDD_SHOWLOG 318
#define IDI_MAIN_ICON 327
#define IDC_LOG 1000
#define IDC_ClearLog 1001
#define IDC_CopyLog 1002
#define IDC_VerInfo 1007
#define ID_APP_Restart 32773
#define ID_APP_Options 32775
#define ID_APP_ShowLog 32777
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 313
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 310
#endif
#endif
```
3. 资源与cpp文件相关联
![](https://i.imgur.com/lka6TJZ.png)