Visual Studio C++ MFC界面常用参数更改(改变图标,添加控件,调试打印函数等等)
背景
需要使用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++工程中以资源文件存在,所以不要误认为其为控件。以下分为实现菜单栏以及单击菜单产生命令的的两个步骤:
实现菜单
- 创建Menu相关资源文件:在资源视图对应的
.rc
文件内右击添加资源,选择Menu
,将会生成Menu相关文件。 - 编辑菜单栏,直接输入即可,如下图:
- 在要显示该菜单栏的
Dialog
的属性里找到Menu
,选择新添加菜单栏的ID
。 - 编译运行后,则可看到菜单栏在窗口中显示。效果如下图:
- 创建Menu相关资源文件:在资源视图对应的
设置点击某一个菜单栏选项实现对应命令:
- 在对应的菜单栏右击选择
添加事件处理程序
,如下图:
- 左边一栏中的
消息类型
分为两类,一类是Command
,一类是UI
命令,该命令和Command
的不同在于,UI
命令会增加传递一个UI指针
的参数,使该函数内可对UI进行更改。
右边一栏中的类列表
则是对应在哪个窗口类去实现这个命令,毫无疑问,在哪个Dialog
实现则去那个窗口类实现对应的函数。 - 正确选择
消息类型
和类列表
后,则会在对应窗口类实现对应的函数,而我在里面实现了一个消息通知,代码如下:
- 在对应的菜单栏右击选择
void CwzCANDlg::OnChyqAge()
{
// TODO: 在此添加命令处理程序代码
MessageBox((LPCWSTR)L"AGE Error",NULL,MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
}
实现如下函数后,当点击对应的菜单栏,则会弹出一个警告框。
- 至此即完成了菜单栏和相应菜单栏的命令响应。
三、调试打印函数TRACE(...)
在调试程序的时候,时常需要知道一些变量的值,又不愿意将变量添加到监视窗口,此时就可以调用函数TRACE(...),它的使用和printf(...)
函数基本一致,运行程序时进入调试模式,则该函数输出的信息显示在输出
窗口。
四、无法将成员变量添加到ID为IDC_STATIC的控件中解决办法
添加了一个Static Text
的控件,想在运行的时候更改这个文本框的内容,就需要添加变量,然后出现了无法添加的错误。
解决办法既是将ID改成其他的ID即可以添加了。
更多问题,未完待续
参考链接:
- TRACE(...)函数的连接地址;
记录时间:2017-1-20
记录地点:深圳WZ
Visual Studio C++ MFC界面常用参数更改(改变图标,添加控件,调试打印函数等等)的更多相关文章
- VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)
前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon De ...
- VS2010-MFC(Ribbon界面开发:为Ribbon Bar添加控件)
转自:http://www.jizhuomi.com/software/253.html 前面一节为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar ...
- MFC界面库BCGControlBar v30.1——Grid/Report控件
亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.1正式发布!此版本包含themed find ...
- WebApi-路由机制 Visual Studio 2015中的常用调试技巧分享
WebApi-路由机制 一.WebApi路由机制是什么? 路由机制通俗点来说:其实就是WebApi框架将用户在浏览器中输入的Url地址和路由表中的路由进行匹配,并根据最终匹配的路由去寻找并匹配相应 ...
- Visual studio C++ MFC之点击按钮(菜单栏)生成新窗口
背景 当前做的APP有菜单栏,菜单栏有一项需要对下位机相关参数进行设置,则必须弹出一个窗口来实现设置操作.本篇即对点击菜单栏生成新的窗口,在新的窗口内完成相应计划后结束新窗口并返回原窗口的方法进行简述 ...
- Visual studio C++ MFC之列表控件CListCtrl Control
背景 本篇旨在MSDN帮助文档下总结列表控件CListCtrl Control的使用,并列出碰到的具体问题. 正文 列表型控件List Control的类是ClistCtrl,具体成员对象详见链接,以 ...
- Visual studio C++ MFC之树形控件Tree Control
背景 本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题. 正文 树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一 ...
- Visual studio C++ MFC的库函数末尾添加“A”和“W”的意义
背景 在使用Visual studio C++ MFC库函数ModifyMenu(...)函数,在Visual studio自动代码补全里提示没有ModifyMenu(...)这个函数,倒是有Modi ...
- Visual Studio 安装 MFC
**Visual Studio 安装 MFC 库** 打开 Visual Studio Installer //程序 选择对应的版本 (本人 VS2022)->修改 [点击]单个组件 ...
随机推荐
- 在WINDOWS2008 Server 中创建NFS服务器,使用LINUX的MOUNT命令去加载网络盘
1.在WINDOWS服务器中创建NFS SERVER 首先,打开服务管理器,选择添加角色: 选中文件服务,下一步: 出现一个提示,不管它,继续下一步: 在接下来的页面中选中“网 ...
- php使用gd库将文字转换成图片(转)
GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片. <?php header("Content-type: ...
- Android 网络url设置View背景图
imgstr为url网络图片地址,topllay是要设置背景的控件: 方法1.Android Glide设置View背景图 Glide.with(this).load(imgStr).asBitmap ...
- 【UOJ UNR #1】火车管理 可持久化线段树
用可持久化线段树维护每个站的第一辆车和每个站的前一次更新的位置即可. #include<iostream> #include<cstring> #include<cstd ...
- Spring:基于注解的依赖注入的使用
1.什么是pojo?什么是bean? 首先,在之前几篇Spring的介绍文章当中,自己都提到了一个名词叫做POJO类,但是在回顾Spring的注解的使用的时候,去形容java当中的对象还有一个名词是叫 ...
- 【暴力】【推导】bzoj1088 [SCOI2005]扫雷Mine
考虑右侧的一个格子是否放雷,只可能对其左侧的三个格子造成影响. 也就是说,若左侧一个格子旁的两个格子已经放了雷,对第三个格子也就唯一确定了. 因此只枚举前两个格子是否放雷,剩下的暴力判断是否合法即可. ...
- Orcale自增/Hibernate 配置
-- 自增 create sequence SEQ_T_APP_USER start with 1 increment by 1; -- 触发器 create trigger DECTUSER_T_ ...
- Telnet环境变量
转:http://www.cnpaf.net/Class/Telnet/200408/2.html 当前位置: 网站首页>>协议大全>>TELNET协议>> Tel ...
- 地图投影与ArcGIS坐标系转换
1. 通常GIS项目涉及到的坐标系 (1)面向局部区域的大比例尺二维平面:高斯投影(横轴墨卡托) 说明:在市一级的小范围区域的GIS系统,比如规划局.国土局.建设局的系统,大都使用高斯投影,以便与地方 ...
- 【spring data jpa】jpa中使用count计数方法
spring data jpa中使用count计数方法很简单 直接在dao层写方法即可 int countByUidAndTenementId(String parentUid, String ten ...