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

文章目录

  • 创建框架窗口
  • 菜单
    • 菜单的风格
    • 通过资源创建菜单
    • 菜单的各种使用
    • 通过代码创建菜单
    • 在鼠标位置右键弹出菜单
  • 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 };//工具栏按钮IDm_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.rhkb.cn/news/42726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

局域网共享失败?打印机/文件夹共享工具

很多时候,在办公或家庭环境中,我们需要进行打印机和文件夹的共享,以便更高效地协作和处理文件。然而,寻找对应版本的共享设置或是不想花费太多时间去进行复杂的电脑设置,总是让人感到头疼。今天,我要向大家…

C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因

文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案:手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集(0条记录)复制到Excel时崩溃的原因及解决方法如下: 原因分析 空记录集…

torchvision中数据集的使用

1、torchvision及其数据集的介绍 1.1 torchvision介绍 torchvision 是 PyTorch 的一个官方库,专门用于计算机视觉任务。它提供了以下核心功能: 预训练模型:如 ResNet、VGG、EfficientNet 等。数据集:内置常用视觉数据集&#xf…

d2025328

一、sql-判断三角形 610. 判断三角形 - 力扣&#xff08;LeetCode&#xff09; 用一下if加上判断条件 select x,y,z,if(xy > z and xz > y and yz > x and x-y < z and x-z < y and y-z < x,Yes,No) as triangle from Triangle 二、按照分类统计薪水 190…

C++20新特性:std::assume_aligned详解

文章目录 一、概述二、函数定义与语法三、使用方法与注意事项1. 使用方法2. 注意事项 四、性能优化原理五、实际应用场景六、编译器支持情况七、总结 一、概述 C20引入了std::assume_aligned&#xff0c;这是一个非常实用的特性&#xff0c;用于告知编译器某个指针所指向的对象…

洛谷P1706 全排列题解

P1706 全排列问题 题目描述 按照字典序输出自然数 1 1 1 到 n n n 所有不重复的排列&#xff0c;即 n n n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n n n。 输出格式 由 1 ∼ n 1 \sim n 1∼n 组成的所有不重复的…

yum install 报错(CentOS换源):

yum instally yum utils device mapper persistent-data lvm2 报错&#xff1a; 排查错误原因&#xff1a;centos7 系统停止维护了 解决方案&#xff1a;换源&#xff08;更换操作系统&#xff09; //1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-…

C语言学习笔记(抱佛脚版)

毕业一年&#xff0c;发现记性是真的差&#xff0c;每次想起之前的知识总是想不全&#xff0c;看别人写的资料也懵懵懂懂。于是我索性自己再学一遍&#xff0c;并且记录一下。希望对你们也有所帮助。 正片开始&#xff01; 前面的什么if for都不难理解&#xff0c;嵌套的话也…

攻破tensorflow,勇创最佳agent(2)---损失(loss) 准确率(accuracy)问题

实战播: 怎么判定一个模型好不好,你设置的值对不对? 需要再看几个值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …

使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)

一、地址&#xff1a; url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数&#xff0c;请帮忙修改一下~ 二、用到的知识点以及代码详解&#xff1a; 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…

ai画图comfyUI 精准定位gligen。允许指定图像中多个对象的位置和大小

基础功能下&#xff0c;outpainting是内容填充&#xff0c;拉近拉远镜头&#xff0c;自动填充旁边物体。嵌入模型也需要单独下载&#xff0c;演示完示例后推荐模型站有更直观效果介绍和用法。选中精确定位。看一眼坐标&#xff0c;直接默认出一张图。然后修改定位&#xff0c;和…

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词&#xff0c; 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…

boost.asio

as&#xff08;async&#xff09;:异步 同步io&#xff1a; reactor (非阻塞)&#xff08;需要注册一次&#xff0c;在等待消息时可以干别的事&#xff09; 阻塞io网络模型 接口&#xff1a;read\accept\connect\write 接口返回时&#xff0c;io完成 异步…

数据库后续

-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…

计算机网络基础:网络流量工程与优化策略

计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…

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

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

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能与机器人学交叉的前沿领域&#xff0c;强调智能体通过身体与环境的动态交互实现自主学习和进化&#xff0c;其核心在于将感知、行动与认知深度融合‌。通俗地讲&#xff0c;就是机器人或者智能系统在物理环境中…

Java实现pdf中动态插入图片

今天接到一个需求&#xff0c;需要在pdf中的签名处&#xff0c;插入签名照片&#xff0c;但签名位置不固定&#xff0c;话不多说上代码&#xff1a; 1、首先引入itextpdf依赖包&#xff1a; <dependency><groupId>com.itextpdf</groupId><artifactId>…

MySQL8.4 InnoDB Cluster高可用集群使用指南

简介 高可用方案 Orchestrator&#xff1a; 可视化 Web 界面管理 MySQL 拓扑结构&#xff0c;并且兼容多种复制架构&#xff08;异步、半同步、GTID&#xff09;&#xff0c;提供自动和手动的故障转移。但是8.0.21后 MySQL 更新了主从复制相关命令&#xff0c;Orchestrator无…