MFC - Windows资源

资源是一个文本文件,允许编译器管理图片,声音,鼠标光标,对话框等对象.Microsoft Visual Studio通过提供创建资源文件特别容易在用于编程的相同环境中的必要工具.这意味着,您通常不必使用外部应用程序来创建或配置资源文件.以下是与资源相关的一些重要功能.

  • 资源是向用户提供信息的界面元素.

  • 位图,图标,工具栏和游标都是资源.

  • 某些资源可以被操作执行一个操作,例如从菜单中选择或在对话框中输入数据.

  • 应用程序可以使用彼此独立运行的各种资源,这些资源是分组为具有* .rc扩展名的文本文件.

  • 通过从"添加资源"对话框中选择所需资源,可以创建大多数资源.

Add Resource

  • "添加资源"对话框提供了可根据要求使用的大量资源列表,但如果您需要某些不可用的资源,则可以手动将其添加到执行程序前的e * .rc文件.

标识符

标识符是一个常量整数的符号,其名称通常以ID开头.它由两部分组成;映射到整数值(符号值)的文本字符串(符号名称).

  • 符号提供描述性的引用方式资源和用户界面对象,包括源代码和在资源编辑器中使用它们.

  • 创建新资源时或资源对象,资源编辑器提供资源的默认名称,例如IDC_DIALOG1,并为其指定值.

  • name-plus-value定义存储在Resource.h文件中.

第1步 &减去;让我们看一下我们创建对话框的最后一章中的 CMFCDialogDemo 示例,其ID是 IDD_EXAMPLE_DLG .

CMFCDialogDemo

第2步 : 转到解决方案资源管理器,您将在Header Files下看到resource.h文件.继续在编辑器中打开此文件,您将看到对话框标识符及其整数值.

Identifiers2

图标

图标是用于代表应用程序的窗口的小图片.它用于两个主要场景.

  • 在Window的框架上,它显示在Window名称的左侧在标题栏上.

  • 在Windows资源管理器,桌面,"我的电脑"或"控制面板"窗口中.

如果查看我们的MFCModalDemo示例,您将看到Visual Studio正在使用标题栏的默认图标,如下面的快照所示.

Icons

您可以按照下面给出的步骤创建自己的图标;

第1步 : 右键单击您的项目,然后选择Add → 在资源中,您将看到"添加资源"对话框.

Select Add Resources

第2步 : 选择图标并单击新建按钮,您将看到以下图标.

Icon

第3步 : 在Solution Explorer中,转到Resource View并展开MFCModalDemo>图标.你会看到两个图标. IDR_MAINFRAME是默认值,IDI_ICON1是新创建的图标.

步骤4 : 右键单击新创建的图标,然后选择属性.

步骤5 :  IDI_ICON1是此图标的ID,现在让我们将此ID更改为IDR_MYICON.

步骤6 : 您现在可以根据您的要求在设计器中更改此图标.我们将使用相同的图标.

第7步 : 保存此图标.

步骤8 : 转到CMFCModalDemoDlg.cpp文件中的CMFCModalDemoDlg构造函数,它看起来像下面的代码.

CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent /* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME); 
}

第9步 : 您现在可以看到构造函数中加载了默认图标.让我们将其更改为IDR_ MYICON,如下面的代码所示.

CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent /* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_ MYICON);
}

第10步 : 编译并执行上述代码后,您将看到对话框中显示新图标.

Modal Demo

菜单

菜单允许您以合理且易于查找的方式排列命令.使用菜单编辑器,您可以直接使用与完成的应用程序中的菜单栏非常相似的菜单栏来创建和编辑菜单.要创建菜单,请按照下面给出的步骤&减去;

步骤1 : 右键单击您的项目,然后选择Add → 资源.您将看到"添加资源"对话框.

Add Resources Menu

第2步 : 选择菜单,然后单击新建.您将在菜单栏上看到包含"在此处键入"的矩形.

Type Here on Menu Bar

第3步 : 写一些菜单选项,如文件,编辑等,如下图所示.

Menu Options

第4步 : 如果在资源视图中展开"菜单"文件夹,您将看到菜单标识符IDR_MENU1.右键单击此标识符并将其更改为IDM_MAINMENU.

Menu Identifier

第5步 : 保存所有更改.

第6步 : 我们需要将此菜单附加到对话框中.在解决方案资源管理器中展开Dialog文件夹,然后双击对话框标识符.

Dialog Folder

第7步 : 您将在"属性"中看到菜单字段.从下拉列表中选择菜单标识符,如上所示.

步骤8 : 运行此应用程序,您将看到以下对话框,其中还包含菜单选项.

Menu Option

工具栏

工具栏是一个Windows控件,允许用户通过单击按钮而不是使用按钮对表单执行某些操作菜单.

  • 工具栏提供了一组方便的按钮,通过将最易于访问的操作作为按钮简化了用户的工作.

  • 工具栏可以让这些常见操作更贴近用户.

  • 工具栏通常显示在主菜单下.

  • 它们可以配备按钮,但有时它们的按钮或某些按钮都有标题.

  • 工具栏还可以配备其他类型的控件.

创建工具栏,以下是步骤.

第1步 : 右键单击您的项目,然后选择Add → 资源.您将看到"添加资源"对话框.

Toolbar

第2步 : 选择工具栏,然后单击新建.您将看到以下屏幕.

Select Toolbar

第3步 : 在设计器中设计工具栏,如下面的屏幕截图所示,并指定ID.

Design Toolbar

第4步 : 在CMFCModalDemoDlg类中添加这两个变量.

 CToolBar m_wndToolBar; 
 BOOL butD;

第5步 : 以下是CMFCModalDemoDlg.h文件中CMFCModalDemoDlg的完整实现 :

class CMFCModalDemoDlg : public CDialogEx {
   // Construction
   public:
      CMFCModalDemoDlg(CWnd* pParent = NULL); // standard constructor
   // Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCMODALDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
   
   // Implementation
   protected:
      HICON m_hIcon;
      CToolBar m_wndToolBar;
      BOOL butD;
   
      // Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
	
   public:
      afx_msg void OnBnClickedOk();
};

第6步 : 更新CMFCModalDemoDlg :: OnInitDialog(),如下面的代码所示.

BOOL CMFCModalDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);       // Set big icon
   SetIcon(m_hIcon, FALSE);      // Set small icon
   
   if (!m_wndToolBar.Create(this)
      || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
      //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
      // WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
      // CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
      // !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) {
         TRACE0("Failed to Create Dialog Toolbar\n");
         EndDialog(IDCANCEL);
      }
      butD = TRUE;
      CRect rcClientOld; // Old Client Rect
      CRect rcClientNew; // New Client Rect with Tollbar Added
		
      // Retrive the Old Client WindowSize
      // Called to reposition and resize control bars in the client area of a window
      // The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.
      // And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.
      
      GetClientRect(rcClientOld);
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNew);
      // All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
      // Offest to move all child controls after adding Tollbar 
      CPoint ptOffset(rcClientNew.left - rcClientOld.left, rcClientNew.top - rcClientOld.top); 
		 
      CRect rcChild;
      CWnd* pwndChild = GetWindow(GW_CHILD); //Handle to the Dialog Controls
      
      while (pwndChild) // Cycle through all child controls {
         pwndChild -> GetWindowRect(rcChild); // Get the child control RECT
         ScreenToClient(rcChild);
          
         // Changes the Child Rect by the values of the claculated offset
         rcChild.OffsetRect(ptOffset);
         pwndChild -> MoveWindow(rcChild, FALSE); // Move the Child Control
         pwndChild = pwndChild -> GetNextWindow();
      }
       
      CRect rcWindow;
      // Get the RECT of the Dialog
      GetWindowRect(rcWindow);
       
      // Increase width to new Client Width
      rcWindow.right += rcClientOld.Width() - rcClientNew.Width();
       
      // Increase height to new Client Height
       rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
      // Redraw Window
      MoveWindow(rcWindow, FALSE);
       
      // Now we REALLY Redraw the Toolbar
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
       
   // TODO: Add extra initialization here

   return TRUE; // return TRUE unless you set the focus to a control
}

步骤7 : 运行此应用程序.您将看到以下对话框,其中还包含工具栏.

Toolbar4

加速器

访问键是一个字母,允许用户使用键盘而不是鼠标更快地执行菜单操作.这通常更快,因为用户不需要将鼠标放在任何位置,这减少了执行操作所需的时间.

步骤1 : 要创建访问密钥,请键入&符号"&"在菜单项的左侧.

Create an Access Key

第2步 : 对所有菜单选项重复此步骤.运行此应用程序并按Alt键.您将看到所有菜单选项的第一个字母都带有下划线.

Menu Option

快捷键

快捷键是高级用户用来执行操作的键或键组合,否则将对菜单项执行操作.大多数快捷方式是同时按下Ctrl键和字母键的组合.例如,Ctrl + N,Ctrl + O或Ctrl + D.

要创建快捷方式,请在构成菜单标题的字符串右侧,右键单击菜单项目和选择属性.

在标题字段中,键入\t,然后键入所需的组合,如下面的新菜单选项所示.对所有菜单选项重复此步骤.

Shortcut Key

加速器表

加速器表是一个项目列表,其中表的每个项目组合了一个标识符,一个快捷键和一个指定加速键的类型的常数.与其他资源一样,可以在.rc文件中手动创建加速器表.以下是创建加速器表的步骤.

步骤1 : 要创建加速器表,请右键单击解决方案资源管理器中的* .rc文件.

Accelerator Table

第2步 : 选择加速器并单击新建.

Select Accelerator

步骤3 : 单击ID组合框的箭头并选择菜单项.

Accelerator Table

第4步 : 从修改器下拉列表中选择Ctrl.

步骤5 : 单击"密钥"框并为两个菜单选项键入相应的密钥.

我们还将新的菜单项事件处理程序添加到测试中.右键单击"新建"菜单选项.

Event Handler

第6步 : 您可以指定类,消息类型和处理程序名称.现在,让我们保持原样并单击添加和编辑按钮.

Message Type  Handler Name

第7步 : 选择添加事件处理程序.

步骤8 : 现在,您将看到在CMFCModalDemoDlg.cpp文件末尾添加的事件.

void CMFCModalDemoDlg::OnFileNew() {
   // TODO: Add your command handler code here
   MessageBox(L"File > New menu option");
} 
}

第9步 :  现在让我们添加一个显示简单菜单选项消息的消息框.

要在工作中启动加速器表,请添加HACCEL变量和ProcessMessageFilter,如下所示:关注CMFCModalDemoApp.

class CMFCModalDemoApp : public CWinApp {
   public:
      CMFCModalDemoApp();
   
   // Overrides
   public:
      virtual BOOL InitInstance();
      HACCEL m_hAccelTable;
      
      // Implementation

      DECLARE_MESSAGE_MAP()
      virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg); 
};

第10步 : 加载加速器和CMFCModalDemoApp :: InitInstance()中的以下调用.

m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
   MAKEINTRESOURCE(IDR_ACCELERATOR1));

步骤11 : 这是ProcessMessageFilter的实现.

BOOL CMFCModalDemoApp::ProcessMessageFilter(int code, LPMSG lpMsg) {
   if (code >= 0 && m_pMainWnd && m_hAccelTable) {
      if (::TranslateAccelerator(m_pMainWnd -> m_hWnd, m_hAccelTable, lpMsg))
      return TRUE;
   }
   return CWinApp::ProcessMessageFilter(code, lpMsg);
}

第12步 : 编译并执行上面的代码时,您将看到以下输出.

Accelerator Result

步骤13 : 按Alt键,然后按F键,然后按N键或Ctrl + N.您将看到以下消息.

Accelerator Table