MFC 状态栏梳理

这篇具有很好参考价值的文章主要介绍了MFC 状态栏梳理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MFC状态栏梳理

MFC状态栏,觉得挺简单的,但是用的时候总是不得劲,梳理了一下代码。理解通透些。
MFC 状态栏梳理

先说状态栏窗口怎么来的

在MainFrame里面会有一个成员变量,状态栏 m_wndStatusBar

protected:  // 控件条嵌入成员
	CMFCMenuBar       m_wndMenuBar;
	CMFCToolBar       m_wndToolBar;
	CMFCStatusBar     m_wndStatusBar; //状态栏窗口
	CMFCToolBarImages m_UserImages;
	CFileView         m_wndFileView;
	CClassView        m_wndClassView;
	COutputWnd        m_wndOutput;
	CPropertiesWnd    m_wndProperties;

在创建的时候,好好仔细的创建出来,大意是根据数组指示器,将状态栏分为指示器数组个数窗口,每一个窗口的含义由指示器指定,可以自己分状态栏。

static UINT indicators[] =
{
	ID_SEPARATOR,           // 状态行指示器
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

创建的时候其实很关键,在create函数里面有一个资源的id,状态栏运行机制其实全靠这个资源id来实现,而由于create函数资源id又是默认参数,导致看代码的时候死活有转不过弯,信息是如何发送到状态栏的。

	if (!m_wndStatusBar.Create(this))
	{
		TRACE0("未能创建状态栏\n");
		return -1;      // 未能创建
	}
	m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

关键的最后一个参数,函数声明太长,还显示不出来,我调整一下

BOOL Create(CWnd* pParentWnd, 
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, 
UINT nID = AFX_IDW_STATUS_BAR);

BOOL CreateEx(CWnd* pParentWnd,
 DWORD dwCtrlStyle = 0, 
 DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, 
 UINT nID = AFX_IDW_STATUS_BAR);

MFC运行通过资源ID AFX_IDW_STATUS_BAR 来操作状态栏
典型的函数就是

CWnd* CFrameWnd::GetMessageBar()
{
	return GetDescendantWindow(AFX_IDW_STATUS_BAR, TRUE);
}

就是如此,通过在子孙窗口里面一通乱找,反正有资源ID就能找到对应的创建的窗口,最后就能设置信息了。

说一下这个就绪怎么来的

如果你在多文档程序里面想在程序搞定以后设置一个准备好了,你会发现非常诡异的总是显示就绪,好坑爹。

比如你在mainframe的创建函数里面,不管你是直接设置
SetMessageText 还是POSTMessage 还是SendMessage都不好使
这里面有一个设置时机的问题。

int CFrameWnd::OnCreateHelper(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	if (CWnd::OnCreate(lpcs) == -1)
		return -1;

	// create special children first
	if (!OnCreateClient(lpcs, pContext))
	{
		TRACE(traceAppMsg, 0, "Failed to create client pane/view for frame.\n");
		return -1;
	}

	// post message for initial message string
	PostMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);

	// make sure the child windows have been properly sized
	RecalcLayout();

	return 0;   // create ok
}

AFX_IDS_IDLEMESSAGE就是 【就绪字符串】
通过梳理代码我们可以知道,在CFrameWnd::OnCreateHelper每次都会发送设置状态信息,就绪。那就可以知道了。
由于子框架也是继承CFrameWnd,那么他也会发送设置状态信息。
所以时机应该在子框架设置完以后再设置就可以实现。
不能改MFC的原代码吧,可以改字符串,但是得知道怎么回事。

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	PostMessage(WM_SETMESSAGESTRING, 0, (LPARAM)"准备好了");
	return 0;
}

MFC 状态栏梳理

这里面还有一个坑爹的是需要发送消息来设置

由于在MFC框架源代码里面是发送消息,而且是POST,那么我们也只能POST,不然你搞定以后,MFC框架代码在处理的时候又来设置一顿,是不是白搞了。
哈,那就是这样子了。

主要就是解决两个疑惑:
1 问:MFC如何通过SetMessageText之类的函数来设置状态信息的?
答:通过一个叫AFX_IDW_STATUS_BAR 的标准资源ID来找到状态栏窗口再操纵他设置信息。

2 问 多文档程序中在MainFrame的Create函数里面设置状态信息,为什么不起作用。
答:因为子框架的create函数里面会重新设置一番,覆盖了。如果程序启动没有子框架是不会覆盖的。文章来源地址https://www.toymoban.com/news/detail-472047.html

到了这里,关于MFC 状态栏梳理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC 单文档 静态分割窗口 m_wndSplitter 状态栏

    MFC 单文档 静态分割窗口 VC++图形编程之状态栏和进度条,源码在VC6.0下测试编译通过。 第4章 状态栏与进度条/扩展实例1 带进度条的状态栏 第4章 状态栏与进度条/扩展实例2 带位图的状态栏 第4章 状态栏与进度条/扩展实例3 在状态栏中显示时间 第4章 状态栏与进度条/扩展实例

    2024年02月06日
    浏览(33)
  • 【MFC】实现简单UDP通信

    创建一个基于对话框的MFC项目(名称为UDP),高级功能选中Windows套接字 这个时候在CUDP类的InitInstance()方法中就会出现这样的代码用来初始化套接字 如果没有选中,手动添加也是可以的。 控件ID 关联变量名 类型 作用 IDC_EDIT1 m_edit CEdit 显示接收到的信息 IDC_EDIT2 m_msg CString 保存

    2024年02月09日
    浏览(38)
  • C++学习| MFC简单入门

    前言:因为接手了C++MFC的程序,所以需要对MFC编程方面有所了解。 MFC(Microsoft Foundation Classes微软基础类库):微软公司提供的一个 类库 ,以C++类的形式封装了Windows API,并且包含一个应用程序框架,减少应用程序开发人员的工作量。 WIN32程序和MFC程序生成的都是Windows应用程

    2024年02月13日
    浏览(39)
  • 使用MFC绘制一些简单图形

    目录 一、画直线 更改画笔样式 二、使用画刷画一个矩形 透明矩形 自定义颜色填充矩形 自定义图形填充矩形 四、实现一个画笔 五、画扇形 六、画椭圆 七、画圆 八、输出文本     画一条直线需要一个起点和一个终点,当鼠标按下时记录为起点坐标,鼠标弹起时记录为终点

    2024年02月07日
    浏览(54)
  • MFC网络编程简单例程

     网址:学名叫URL(Uniform Resource Locator),统一资源定位符。URL的各种形式如下图所示。  尽管URL有各种不同的写法,但他们有一个共同点,就是URL开头的文字,即“http:”“ftp:”“file:”\\\"mailto:\\\"这部分文字标识浏览器应当使用的访问方法。比如当访问Web服务器时应当使用

    2024年02月11日
    浏览(38)
  • MFC简单字符串压缩程序

    一个mfc简单字符串压缩程序;按以下情况进行压缩; 1 仅压缩连续重复出现的字符。比如”abcbc”无连续重复字符,压缩后还是”abcbc”。 2 压缩的格式为”字符重复的次数+字符”。例如,”xxxyyyyyyz”压缩后就成为”3x6yz”。

    2024年02月07日
    浏览(43)
  • vs2019(MFC)--简单登录系统(1)

    (接上一条ado连接数据库)(关于ado接数据库的使用,见登录程序) 1.建立数据库access   2.在mfc对话框中添加控件  (我这里选择的是每个按钮登录到对应界面,也可以添加限制条件,通过一个按钮转到对应身份的对应界面,道理一样) 关于身份编辑框中下拉框内容的设置

    2024年02月09日
    浏览(38)
  • python超简单小游戏代码,python小游戏代码能用的

    大家好,小编来为大家解答以下问题,python超简单小游戏代码,python小游戏代码能用的,现在让我们一起来看看吧! 大家好,小编来为大家解答以下问题,python游戏代码大全可复制100行,python游戏代码大全可复制免费,今天让我们一起来看看吧! python有趣的编程代码 class 

    2024年03月14日
    浏览(61)
  • MFC一次性开多个线程的简单示例

    为了使用mfc,先包含afxwin.h; afxwin.h是MFC C++类库的必需文件,其中包含如CWin,CStatic,CButton,CString,CEdit等类运行所必需的头文件;它还会调用windows.h,该头文件包含有数据类型的定义、API入口点定义和其它有用的参数信息; Afx前缀是微软MFC一个小组的名称简写,并没有别的

    2024年01月25日
    浏览(63)
  • 相似对角化的性质,实对称矩阵和相似对角化的联系。(简单梳理)

    不同特征值的特征向量一定正交 。 实对称矩阵一定可以相似对角化,并且 可以利用正交矩阵将其相似对角化 。 两实对称矩阵相似充要条件是两个矩阵有相同的特征值。 n阶矩阵n个不同的特征值一定可以相似对角化(不同特征值对应的特征向量线性无关) 。 实对称矩阵一定

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包