windows第十八章 菜单、工具栏、状态栏

news2025/5/17 19:42:34

文章目录

  • 创建框架窗口
  • 菜单
    • 菜单的风格
    • 通过资源创建菜单
    • 菜单的各种使用
    • 通过代码创建菜单
    • 在鼠标位置右键弹出菜单
  • CMenu常用函数介绍
    • 工具栏
      • 方式一,从资源创建工具栏
      • 方式二,代码创建
    • 状态栏
      • 状态栏基础
      • 创建状态栏

创建框架窗口

手动创建一个空项目,仿照MFC的写法,其他文件都抄一遍,下图箭头指向的文件需要修改
在这里插入图片描述

  1. 创建一个HelloFrameWnd类继承自CFrameWnd
    在这里插入图片描述
  2. App.cpp里改成如下
    在这里插入图片描述
  3. 搭建成功,点击运行
    在这里插入图片描述
  4. 也可以和win32一样,写注册窗口类
#include "testApp.h"
#include "HelloFrameWnd.h"
BOOL CTestApp::InitInstance()
{
	//框架窗口
	HelloFrameWnd* pFrame = new HelloFrameWnd;

	WNDCLASS wc = { 0 };
	wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//背景色
	wc.hCursor = LoadCursor(IDC_ARROW);//鼠标指针
	wc.hIcon = LoadIcon(IDI_WENDI_ICON);//图标
	wc.hInstance = AfxGetInstanceHandle();
	wc.lpszClassName = _T("HelloFrameWndClass");
	wc.lpfnWndProc = DefWindowProc;
	wc.style = CS_HREDRAW | CS_VREDRAW;

	AfxRegisterClass(&wc);

	pFrame->Create(L"HelloFrameWndClass", _T("这是我的框架窗口"));//创建窗口,参数为窗口类名和窗口标题,注意窗口类名必须与注册的窗口类名一致
	m_pMainWnd = pFrame;//设置主窗口
	pFrame->UpdateWindow();
	pFrame->ShowWindow(SW_SHOW);
	return TRUE;
}

CTestApp theApp;

在这里插入图片描述
5. 简化一下上述注册窗口类

#include "testApp.h"
#include "HelloFrameWnd.h"
BOOL CTestApp::InitInstance()
{
	//框架窗口
	HelloFrameWnd* pFrame = new HelloFrameWnd;

	//注册窗口类
	LPCTSTR lpClassName = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, LoadCursor(IDC_ARROW), CreateSolidBrush(RGB(0, 0, 255)), LoadIcon(IDI_WENDI_ICON));

	pFrame->Create(lpClassName, _T("这是我的框架窗口"));//创建窗口,参数为窗口类名和窗口标题,注意窗口类名必须与注册的窗口类名一致
	m_pMainWnd = pFrame;//设置主窗口
	pFrame->UpdateWindow();
	pFrame->ShowWindow(SW_SHOW);
	return TRUE;
}

CTestApp theApp;

菜单

菜单的风格

菜单风格分为弹出式菜单和下拉式菜单两个类型

通过资源创建菜单

  1. 新建菜单,右键添加资源,新建Menu
    在这里插入图片描述
  2. 把菜单资源加入窗口
    在这里插入图片描述
  3. 使用类向导在HelloFrameWnd中添加onCreate消息
    在这里插入图片描述
    启用菜单项, 在oncreate()里添加
	m_bAutoMenuEnable = FALSE;// 启用菜单项

在这里插入图片描述

  1. 右键菜单项,添加事件处理程序,类选择HelloFrameWnd
    在这里插入图片描述
void HelloFrameWnd::OnNew()
{
	MessageBox(L"New");
}

菜单的各种使用


	m_bAutoMenuEnable = FALSE;// 启用菜单项

	CMenu* pMenu = GetMenu();// 获取菜单
	//标记菜单项
	CMenu* pNewMenu = pMenu->GetSubMenu(0);// 获取第一个菜单项,即新建选项
	pNewMenu->CheckMenuItem(0, MF_CHECKED | MF_BYPOSITION);// 将新建选项设置为选中状态
	pNewMenu->CheckMenuItem(IDM_SAVE, MF_CHECKED);// 也可以根据Id
	//设置默认项
	pNewMenu->SetDefaultItem(0, TRUE);// 将新建选项设置为默认项
	//给菜单项前面加图标
	static CBitmap ubmp;
	static CBitmap bmp;
	ubmp.LoadBitmap(IDB_NOTOPEN_BITMAP);
	bmp.LoadBitmap(IDB_OPEN_BITMAP);
	pNewMenu->SetMenuItemBitmaps(0, MF_BYPOSITION, &ubmp, &bmp);//第三个参数是未选中的图片,第四个参数是选中的图片
	pNewMenu->CheckMenuItem(0, MF_CHECKED | MF_BYPOSITION);// 将新建选项设置为选中状态
	//获取默认菜单大小
	int x = GetSystemMetrics(SM_CXMENUCHECK);// 获取菜单项的宽度
	int y = GetSystemMetrics(SM_CYMENUCHECK);// 获取菜单项的高度
	CString str;
	str.Format(L"菜单项大小为%d,%d", x, y);
	SetWindowText(str);
	//禁用菜单
	pNewMenu->EnableMenuItem(0, MF_GRAYED | MF_BYPOSITION);// 禁用新建选项
	//销毁菜单
	//pNewMenu->DestroyMenu();

通过代码创建菜单

	//创建顶层菜单
	CMenu* pTopMenu = new CMenu;
	pTopMenu->CreateMenu();
	pTopMenu->AppendMenu(MF_STRING, 40001, L"菜单项1");
	pTopMenu->AppendMenu(MF_STRING, 40002, L"菜单项2");
	pTopMenu->AppendMenu(MF_STRING, 40003, L"菜单项3");
	//设置菜单到主窗口
	SetMenu(pTopMenu);
	//创建子菜单
	CMenu* pSubMenu = new CMenu;
	pSubMenu->CreatePopupMenu();
	pSubMenu->AppendMenu(MF_STRING, 40004, L"子菜单项1");
	pSubMenu->AppendMenu(MF_STRING, 40005, L"子菜单项2");
	pSubMenu->AppendMenu(MF_STRING, 40006, L"子菜单项3");

	pTopMenu->AppendMenu(MF_POPUP, (UINT_PTR)pSubMenu->m_hMenu, L"子菜单");//子菜单在顶层菜单的子菜单选项弹出

在这里插入图片描述

在鼠标位置右键弹出菜单

void HelloFrameWnd::OnRButtonDown(UINT nFlags, CPoint point)
{
	//创建子菜单
	CMenu* pSubMenu = new CMenu;
	pSubMenu->CreatePopupMenu();
	pSubMenu->AppendMenu(MF_STRING, 40004, L"子菜单项1");
	pSubMenu->AppendMenu(MF_STRING, 40005, L"子菜单项2");
	pSubMenu->AppendMenu(MF_STRING, 40006, L"子菜单项3");

	//把鼠标转换成Client坐标
	ClientToScreen(&point);

	pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);

	CFrameWnd::OnRButtonDown(nFlags, point);
}

CMenu常用函数介绍

工具栏

方式一,从资源创建工具栏

  1. 定义个成员函数CToolBar m_ToolBar
  2. 右键资源,添加资源Toolbar,如下图,可以选择工具对按钮进行编辑
    在这里插入图片描述
  3. 把工具栏按钮的ID设成要响应的菜单ID,比如我刚才新建文件的菜单项是IDM_NEW,就把这个也设为IDM_NEW
    在这里插入图片描述
int HelloFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	m_bAutoMenuEnable = FALSE;// 启用菜单项

	m_ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP);// 创建工具栏
	m_ToolBar.LoadToolBar(IDR_TOOLBAR);// 加载工具栏
	m_ToolBar.EnableDocking(CBRS_ALIGN_ANY);// 允许工具栏停靠
	EnableDocking(CBRS_ALIGN_ANY);// 允许框架窗口停靠

	return 0;
}

在这里插入图片描述

方式二,代码创建

	m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_SIZE_DYNAMIC | CBRS_GRIPPER);
	CToolBarCtrl& toolBarCtrl = m_ToolBar.GetToolBarCtrl();//获取工具栏控件
	toolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
	m_ImageList.Create(24, 24, ILC_COLOR24 | ILC_MASK, 0, 1);//创建图像列表,大小为24*24,颜色为24位,带掩码 ,1个图像	  
	CBitmap ubmp;
	CBitmap bmp;
	ubmp.LoadBitmap(IDB_NOTOPEN_BITMAP);//加载位图
	bmp.LoadBitmap(IDB_OPEN_BITMAP);
	m_ImageList.Add(&ubmp, RGB(255, 255, 255));//添加位图到图像列表
	m_ImageList.Add(&bmp, RGB(255, 255, 255));
	toolBarCtrl.SetImageList(&m_ImageList);//设置图像列表
	UINT nID[] = { IDM_NEW, 0, IDM_EXIT };//工具栏按钮ID
	m_ToolBar.SetButtons(nID, 3);//设置按钮

在这里插入图片描述

状态栏

状态栏基础

状态栏是位于应用程序窗口底部的一个水平区域,用于显示应用程序的当前状态信息。这些信息可以包括程序的运行状态、操作提示、鼠标位置、文档状态等。
状态栏分为两部分:左边最长的叫做提示行,右边3个窗口,主要显示caps lock, num lock 和scroll lock键状态

创建状态栏

  1. 定义成员变量
    在这里插入图片描述

3.资源,添加String Table
在这里插入图片描述
由于改ID会莫名导致卡死,这里就不改了

  1. 添加代码
int HelloFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	m_bAutoMenuEnable = FALSE;// 启用菜单项

	//创建状态栏
	m_StatusBar.Create(this);
	UINT indicators[] = { ID_SEPARATOR,//分隔符
		IDS_STRING107,//时间
		IDS_STRING108//进度
	};//状态栏指示器

	m_StatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT));//设置状态栏指示器
	m_StatusBar.SetPaneInfo(1, IDS_STRING107, SBPS_NORMAL, 150);//设置状态栏面板信息
	m_StatusBar.SetPaneInfo(2, IDS_STRING108, SBPS_NORMAL, 150);

	CStatusBarCtrl& statusBarCtrl = m_StatusBar.GetStatusBarCtrl();//获取状态栏控件
	statusBarCtrl.SetMinHeight(20);//设置状态栏最小高度

	SetTimer(1, 1000, NULL);//设置定时器
	return 0;
};

void HelloFrameWnd::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == 1)
	{
		//获取当前时间
		CTime time = CTime::GetCurrentTime();
		CString strTime = time.Format(L"%Y-%m-%d %H:%M:%S");

		m_StatusBar.SetPaneText(1, strTime);//设置状态栏面板文本

	}

	CFrameWnd::OnTimer(nIDEvent);
}

void HelloFrameWnd::OnMouseMove(UINT nFlags, CPoint point)
{
	CString str;
	str.Format(L"鼠标位置:X=%d,Y=%d", point.x, point.y);
	m_StatusBar.SetPaneText(2, str);

	CFrameWnd::OnMouseMove(nFlags, point);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EMC电源端传导干扰预测试

本实验需要在微波暗室里面进行,隔离外界干扰。 1.EMI接收机和人工电源网络的电源线都插在隔离变压器上面,隔离变压器的电源插在AC220上面 2.被测设备EUT的电源线接在人工电源网络上: 人工电源网络的信号输出端连接EMI接收机。 EMI接收机前面…

94二叉树中序遍历解题记录

怎么说呢,以为这道题不用记录了,菜得吓到了自己。起因是这个遍历的递归一般是写两个函数完成,如下: func inorder(root *TreeNode, res *[]int) {if root nil {return}inorder(root.Left, res)*res append(*res, root.Val) // …

java项目之基于ssm的亚盛汽车配件销售业绩管理系统(源码+文档)

项目简介 亚盛汽车配件销售业绩管理系统实现了以下功能: 亚盛汽车配件销售业绩管理系统根据调研,确定管理员管理客户,供应商,员工,管理配件和配件的进货以及出售信息。员工只能管理配件和配件的出售以及进货信息&…

Spring Initializr搭建spring boot项目

介绍 Spring Initializr 是一个用于快速生成 Spring Boot 项目结构的工具。它为开发者提供了一种便捷的方式,可以从预先定义的模板中创建一个新的 Spring Boot 应用程序,从而节省了从头开始设置项目的大量时间。 使用 Spring Initializr,你…

第十二章:补充介绍pip与配置及Python结构层次

一、pip介绍pip介绍与配置及Python结构层次 1. pip是什么 pip 是 Python 的一个包管理工具,它允许你安装和管理 Python 库和依赖项。简单来说,pip 就是一个工具,它可以帮助你轻松地安装、更新、卸载 Python 的各种库。 2. pip属于什么层次的…

kotlin,jetpack compose 最简导航(navigation)案例学习

// 添加导航组件依赖,用于支持Compose中的导航功能 implementation ("androidx.navigation:navigation-compose:2.8.9") // 定义包名 package com.example.mynavigation// 导入所需的Android和Compose库 import android.os.Bundle import androidx.activ…

centos 7 LVM管理命令

物理卷(PV)管理命令 pvcreate:用于将物理磁盘分区或整个磁盘创建为物理卷。 示例:sudo pvcreate /dev/sdb1 解释:将 /dev/sdb1 分区创建为物理卷。 pvdisplay:显示物理卷的详细信息,如大小、所属…

鸿蒙前后端项目源码-点餐v3.0-原创!原创!原创!

鸿蒙前后端点餐项目源码含文档ArkTS语言. 原创作品.我半个月写的原创作品,请尊重原创。 原创作品,盗版必究!!!! 原创作品,盗版必究!!!! 原创作…

Unity打包崩溃SRP-URP-管线的问题:Shader::SRPBatcherInfoSetup()

URP build always crash when Use SPR Batcher is ON by default - Bug Reports - Niantic SDK for Unity Community 有点类似这个情况,暂时没有解决方法 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: google/bluejay/blu…

不落因果与不昧因果

在佛教浩瀚的哲学体系中,“因果”是贯穿修行始终的核心命题。而“不落因果”与“不昧因果”这对看似矛盾的概念,恰似明镜的两面,映照出修行者对因果法则的不同认知层次。二者虽仅一字之差,却如天堑般分隔了迷悟两岸,其…

<tauri><rust><GUI>基于rust和tauri,实现一个大寰电爪PGHL(串口设备)定制化控制程序

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 环境配置 系统:windows 10平台:visual studio code语言:rust、javascript库:tauri2.0概述 本文是…

浅谈工商企业用电管理的分布式储能设计

摘要:文章设计了一种新的用于工商业用电管理的分布式储能系统。由于储能系统硬件置换成本高,选择在传统储能系统的硬件框架基础上,对控制软件进行优化设计,建立分布式储能系统模型,分析发电量、储电量及损失电量三者之…

项目代码第10讲【数据库运维知识——如何优化数据库查询效率?】:各种日志查看;主从复制;分库分表(MyCat);读写分离;区别数据分区、分表、分库

01. 运维-课程介绍_哔哩哔哩_bilibili 一、各种日志查看 二、主从复制 三、分库分表(MyCat) 四、读写分离 五、区别数据分区、分表、分库 1、数据库分区 上图中的ibd文件,是分区表的数据文件,可以分布在不同的物理设备上&…

H5DS编辑器教程——H5页面触发动画实战指南

在 H5 页面设计中,触发动画通过动态交互提升用户体验,成为吸引注意力的关键手段。H5DS 编辑器作为一款高效的可视化工具,提供了丰富的动画制作功能,即使是零基础用户也能轻松实现专业级效果。 使用工具:H5DS编辑器 触…

小程序语音识别功能 wx.createInnerAudioContext

页面样式htmlcss <view class"recorder_content"><view class"result_content"><view class"r_title">语音识别结果显示:</view><view class"r_h_input"><text wx:if"{{resultDetails.result}…

Web网页内嵌福昕OFD版式办公套件实现在线预览编辑PDF、OFD文档

PDF&#xff0c;即Portable Document Format&#xff0c;用于以一种独立于应用程序、硬件、操作系统的方式共享和查看文档&#xff1b;OFD&#xff0c;即Office Open Document Format for Document&#xff0c;是一种在政府公文和法律文件等领域广泛应用的电子文件格式&#xf…

ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件

作者的话 近期发现有些兄弟的ICE-2000仿真器链接DSP报错&#xff0c;然后test第四步不通过&#xff0c;我就拿我的仿真器也试了一下&#xff0c;发现ADI悄咪咪的在线升级仿真器固件&#xff0c;有些兄弟不会操作&#xff0c;就会导致仿真器升级失败&#xff0c;连不上目标板&a…

第十一章:Python PIL库-图像处理

一、PIL库简介 PIL&#xff08;Python Imaging Library&#xff09;是一个功能强大的图像处理库&#xff0c;它提供了丰富的图像处理功能&#xff0c;包括图像的打开、处理和保存等操作。PIL支持多种图像文件格式&#xff0c;如JPEG、PNG、BMP等&#xff0c;并且可以完成对图像…

python项目整体文件和依赖打包

python项目整体文件和依赖打包 python项目整体文件和依赖打包 python项目整体文件和依赖打包 准备工作&#xff1a;扫描项目中必要的依赖包 pip install pipreqs pipreqs . 会有一些警告包&#xff0c;需要pip list进行版本修正,这里是三个包第一步&#xff1a;在虚拟环境中安…

logstash收集数据

防止ES的的I/O的压力过大&#xff0c;使用redis/kafka进行缓冲。 对redis的要求 Redis input plugin | Logstash Reference [8.17] | Elastic 一般企业要求的架构 我实现的架构 filebeat把数据传给logstash 配置好filebeat把收集到的数据输入到redis 然后执行命令&#xff0…