背景

需要使用Visual Studio C++做一些界面。此篇文章既是记录Visual Studio C++在调整界面时常常遇见的问题。

正文

一、如何更改窗体图标,以及生成的.exe图标

  • 更改窗体图标

    首先要有一个.ico的图标文件,然后在解决方案管理器内找到资源文件,然后将想要更改的.ico图标添加至该资源内,添加的类型为Icon。打开Recourse.h文件,该文件供界面文件.rc使用,如下所示:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 wzCAN.rc 使用
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_WZCAN_DIALOG 102
#define IDI_ICON1 129 // 导入图标时,MFC产生的对应宏
#define IDR_MAINFRAME 128 // MFC默认图标对应的宏
#define IDC_CHECK1 1000

注意IDR_MAINFRAME这个宏定义,接着打开wzCANDlg.cpp文件,其中wzCAN为类名,找到如下函数:

CwzCANDlg::CwzCANDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CwzCANDlg::IDD, pParent)
{
// 此段代码既是加载窗体图标
// IDR_MAINFRAME即为默认的窗体显示图标文件
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

将IDR_MAINFRAME改成IDI_ICON1,类窗体显示的既是导入的新图标文件。

  • 更改生成的.exe文件的图标

    经过上述步骤,类窗体图标确实改变了,可是生成的.exe文件却没有改变。原因在于MFC总是默认将宏定义最小值所对应的图标设为.exe图标。在.rc文件内已经说明,如下所示:
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON 'res\\Aplex.ico'
IDR_MAINFRAME ICON 'res\\wzCAN.ico'

因此,只需要将我们导入图标所对应的宏定义值改成最小即可。

#define IDI_ICON1                       128    // 导入图标时,MFC产生的对应宏
#define IDR_MAINFRAME 129 // MFC默认图标对应的宏

二、如何添加菜单栏,并实现相应菜单栏的命令响应

关于菜单栏的操作的更加详细说明已经另外开了一篇博客Visual studio C++ MFC之Menu editor记录。

菜单栏在Visual Studio C++工程中以资源文件存在,所以不要误认为其为控件。以下分为实现菜单栏以及单击菜单产生命令的的两个步骤:

  1. 实现菜单

    • 创建Menu相关资源文件:在资源视图对应的.rc文件内右击添加资源,选择Menu,将会生成Menu相关文件。
    • 编辑菜单栏,直接输入即可,如下图:

    • 在要显示该菜单栏的Dialog的属性里找到Menu,选择新添加菜单栏的ID
    • 编译运行后,则可看到菜单栏在窗口中显示。效果如下图:

  2. 设置点击某一个菜单栏选项实现对应命令:

    • 在对应的菜单栏右击选择添加事件处理程序,如下图:

    • 左边一栏中的消息类型分为两类,一类是Command,一类是UI命令,该命令和Command的不同在于,UI命令会增加传递一个UI指针的参数,使该函数内可对UI进行更改。

      右边一栏中的类列表则是对应在哪个窗口类去实现这个命令,毫无疑问,在哪个Dialog实现则去那个窗口类实现对应的函数。
    • 正确选择消息类型类列表后,则会在对应窗口类实现对应的函数,而我在里面实现了一个消息通知,代码如下:
void CwzCANDlg::OnChyqAge()
{
// TODO: 在此添加命令处理程序代码
MessageBox((LPCWSTR)L"AGE Error",NULL,MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
}

实现如下函数后,当点击对应的菜单栏,则会弹出一个警告框。

  1. 至此即完成了菜单栏和相应菜单栏的命令响应。

三、调试打印函数TRACE(...)

在调试程序的时候,时常需要知道一些变量的值,又不愿意将变量添加到监视窗口,此时就可以调用函数TRACE(...),它的使用和printf(...)函数基本一致,运行程序时进入调试模式,则该函数输出的信息显示在输出窗口。

四、无法将成员变量添加到ID为IDC_STATIC的控件中解决办法

添加了一个Static Text的控件,想在运行的时候更改这个文本框的内容,就需要添加变量,然后出现了无法添加的错误。

解决办法既是将ID改成其他的ID即可以添加了。

更多问题,未完待续

参考链接:

记录时间:2017-1-20

记录地点:深圳WZ

Visual Studio C++ MFC界面常用参数更改(改变图标,添加控件,调试打印函数等等)的更多相关文章

  1. VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

    前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon De ...

  2. VS2010-MFC(Ribbon界面开发:为Ribbon Bar添加控件)

    转自:http://www.jizhuomi.com/software/253.html 前面一节为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar ...

  3. MFC界面库BCGControlBar v30.1——Grid/Report控件

    亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.1正式发布!此版本包含themed find ...

  4. WebApi-路由机制 Visual Studio 2015中的常用调试技巧分享

    WebApi-路由机制   一.WebApi路由机制是什么? 路由机制通俗点来说:其实就是WebApi框架将用户在浏览器中输入的Url地址和路由表中的路由进行匹配,并根据最终匹配的路由去寻找并匹配相应 ...

  5. Visual studio C++ MFC之点击按钮(菜单栏)生成新窗口

    背景 当前做的APP有菜单栏,菜单栏有一项需要对下位机相关参数进行设置,则必须弹出一个窗口来实现设置操作.本篇即对点击菜单栏生成新的窗口,在新的窗口内完成相应计划后结束新窗口并返回原窗口的方法进行简述 ...

  6. Visual studio C++ MFC之列表控件CListCtrl Control

    背景 本篇旨在MSDN帮助文档下总结列表控件CListCtrl Control的使用,并列出碰到的具体问题. 正文 列表型控件List Control的类是ClistCtrl,具体成员对象详见链接,以 ...

  7. Visual studio C++ MFC之树形控件Tree Control

    背景 本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题. 正文 树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一 ...

  8. Visual studio C++ MFC的库函数末尾添加“A”和“W”的意义

    背景 在使用Visual studio C++ MFC库函数ModifyMenu(...)函数,在Visual studio自动代码补全里提示没有ModifyMenu(...)这个函数,倒是有Modi ...

  9. Visual Studio 安装 MFC

    **Visual Studio 安装 MFC 库**   打开 Visual Studio Installer //程序   选择对应的版本 (本人 VS2022)->修改   [点击]单个组件 ...

随机推荐

  1. Delphi:对TNotifyEvent的理解

    type TNotifyEvent = procedure (Sender: TObject) of object; 在Delphi中事件也是一个类,类型就是事件类型,不同的事件属于不同的类.TNot ...

  2. 使用 gulp 压缩 JS

    使用 gulp 压缩 JS 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 压缩 js 代码可降低 js 文件大小,提高页面打开速度.在不利用 gulp 时我们需要通过各种工具手动完成 ...

  3. (四)mysql数据类型

    数据类型基本介绍 数值类型 整形类型:tinyint,int,bigint 浮点类型:float,double 字符串类型 char系列:char varchar text系列:text blob系列 ...

  4. php split 和 explode 的区别

    php split 和 explode 的区别 split (PHP   3,   PHP   4   ) split   --   用正则表达式将字符串分割到数组中 说明 array   split ...

  5. Codeforces 891B - Gluttony

    891B - Gluttony 题意 给出一个数字集合 \(a\),要求构造一个数组 \(b\) 为 \(a\) 的某个排列,且满足对于所有下标集合的子集 \(S=\{x_1,x_2,...,x_k\ ...

  6. hdu6071(最短路)

    hdu6071 题意 四个点连接形成一个环,给出相邻两个点的距离,求从点 \(2\) 出发再回到 \(2\) 的路程大于等于 \(K\) 的最小值. 分析 首先我们让 \(w=min(d12, d23 ...

  7. [BZOJ4897][THUSC2016]成绩单(DP)

    4897: [Thu Summer Camp2016]成绩单 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 220  Solved: 132[Subm ...

  8. [BZOJ1559]密码

    数据范围特别小,考虑状压DP 因为要求给定的字符串在母串中出现,所以可以用AC自动机辅助DP 因为AC自动机不能处理模式串互相包含的情况,所以先把互相包含的串去掉(暴力就行,数据范围太小) 因为要状压 ...

  9. python3 开发面试题(%s和format的区别)5.31

    在格式化字符串中有两种方法: 1.%s 2.format 大家常用的是哪一种方法?为什么要用你选的这种方法? 我们先看一个例子: 首先我们定义一个我军需要击杀的恐怖分子的地理坐标为 c=(128,12 ...

  10. 1.1(学习笔记)Servlet简介及一个简单的实例

    一.Servlet简介 Servlet是使用Java语言编写的服务器端程序,可以生产动态的Web界面. 主要运行在服务器端,Servlet可以方便的处理客户端传来的HTTP请求,并返回一个响应. 二. ...