【MFC】tab控件 仿任务管理器 枚举窗口和进程

界面和关联变量设置

创建一个基于对话框的MFC项目,给主对话框添加一个tab控件(设置关联变量 类型:CTabCtrl 名称:m_tab),添加两个子对话框(IDC_PAGE1和IDC_PAGE2),给子对话框添加一个list control控件(设置关联变量 类型:CListCtrl 名称:m_list),并将子对话框的边框属性设置为None,窗口样式设为child
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在资源视图界面右击对话框给IDC_PAGE1和IDC_PAGE2添加对话框类,类名分别为CPage1,CPage2。
在这里插入图片描述

CTabCtrl类

主窗口界面

C任务管理器Dlg类中添加CPage1和CPage2类型的变量page1和page2。
要通过这两成员来创建子窗口。不要忘记在pch.h中包含"CPage1.h","CPage2.h"头文件。
这个时候运行程序,结果如下
在这里插入图片描述

tab添加选项卡

C任务管理器Dlg类的OnInitDialog()方法中添加如下代码

m_tab.InsertItem(0, L"窗口名");
m_tab.InsertItem(1, L"进程");

这个时候运行程序tab控件上就有选项卡了
在这里插入图片描述

添加子窗口

	CRect rect;m_tab.GetClientRect(&rect);//Create函数通过资源ID和所属的父窗口对象创建一个无模式对话框//创建的对话框如果要显示需要通过ShowWindow(SW_SHOW)显示page1.Create(IDD_PAGE1, &m_tab);page2.Create(IDD_PAGE2, &m_tab);rect.top += 22;rect.left += 1;rect.right -= 3;rect.bottom -= 2;page1.MoveWindow(&rect);page2.MoveWindow(&rect);page1.ShowWindow(SW_SHOW);page2.ShowWindow(SW_HIDE);

获取tab控件的窗口大小并把子对话框显示在tab控件合适的位置。
运行效果如下
在这里插入图片描述
这个时候tab的选项卡还不能切换显示对应的对话框。需要通过类向导添加TCN_SELCHANGE消息的响应函数

TCN_SELCHANGE消息

在这里插入图片描述

void C任务管理器Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{// TODO: 在此添加控件通知处理程序代码int sel = m_tab.GetCurSel();switch (sel){case 0:page1.ShowWindow(SW_SHOW);page2.ShowWindow(SW_HIDE);break;case 1:page2.ShowWindow(SW_SHOW);page1.ShowWindow(SW_HIDE);break;}*pResult = 0;
}

注意
这里有两个命令TCN_SELCHANGE和TCN_SELCHANGING,选项卡改变是先执行TCN_SELCHANGING,后执行TCN_SELCHANGE,在执行TCN_SELCHANGING的时候,选项卡还未最终完成切换,在这个时候m_tab.GetCurSel()得到的是原来那个选项卡。所以在进行选项卡切换的时候响应的是TCN_SELCHANGE消息

可以在TCN_SELCHANGING的响应函数中加入这段代码简单的验证一下

int sel = m_tab.GetCurSel();
CString str;
str.Format(L"%d", sel);
MessageBox(str);

运行程序发现实现了选项卡切换的功能,但是如果拉大主窗口,tab控件和子对话框的大小不会变。这个时候要响应WM_SIZE消息使主窗口在变化的时候对话框和tab控件也进行相应的变化。在子对话框中的list control控件也要如此
在这里插入图片描述

控件和子对话框适应主窗口的大小变化

	//GetSafeHwnd()用来判断...是否存在CRect rect;if (m_tab.GetSafeHwnd()){m_tab.MoveWindow(0, 0, cx, cy);m_tab.GetClientRect(&rect);}rect.top += 22;rect.left += 1;rect.right -= 3;rect.bottom -= 2;if (page1.GetSafeHwnd() && page2.GetSafeHwnd()){page1.MoveWindow(&rect);page2.MoveWindow(&rect);}

子对话框界面

CPage1

通过类向导添加OnInitDialog()

BOOL CPage1::OnInitDialog()
{CDialogEx::OnInitDialog();m_list.ModifyStyle(0,LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_VSCROLL | WS_BORDER);m_list.InsertColumn(0, L"序号", LVCFMT_LEFT, 50);m_list.InsertColumn(1, L"窗口标题", LVCFMT_LEFT,200);m_list.InsertColumn(2, L"窗口句柄", LVCFMT_LEFT, 200);m_list.InsertColumn(3, L"窗口类", LVCFMT_LEFT, 200);int i = 0;CWnd*pwnd=AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);while (pwnd){CString str;str.Format(L"%d", i + 1);m_list.InsertItem(i,str);pwnd->GetWindowTextW(str);//获取窗口标题m_list.SetItemText(i, 1, str);str.Format(L"%x", pwnd->m_hWnd);//获取窗口句柄m_list.SetItemText(i, 2, str);TCHAR name[256];GetClassName(pwnd->m_hWnd, name, 256);//获取窗口类名m_list.SetItemText(i, 3, name);pwnd = pwnd->GetWindow(GW_HWNDNEXT);i++;}return TRUE;  // return TRUE unless you set the focus to a control
}

在OnInitDialog()中实现枚举所有的窗口并显示,枚举窗口的流程是
获取主窗口(AfxGetMainWnd())-》获取和主窗口平级的第一个窗口(GetWindow(GW_HWNDFIRST))-》循环获取下一个窗口(GetWindow(GW_HWNDNEXT))

添加WM_SIZE消息响应

if (m_list.GetSafeHwnd())m_list.MoveWindow(0, 0, cx, cy);

在这里插入图片描述

CPage2

通过类向导添加OnInitDialog()

枚举进程要在CPage2类中加上头文件#include <tlhelp32.h>

BOOL CPage2::OnInitDialog()
{CDialogEx::OnInitDialog();m_list.ModifyStyle(0,LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_VSCROLL | WS_BORDER);m_list.InsertColumn(0, L"进程名", LVCFMT_LEFT, 300);m_list.InsertColumn(1, L"进程ID", LVCFMT_LEFT, 100);//枚举进程//获取当前进程的快照HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);PROCESSENTRY32 pe = { 0 };pe.dwSize = sizeof(pe);//获取快照中的第一个进程bool b=Process32First(hSnapshot, &pe);int i = 0;while (b){m_list.InsertItem(i, pe.szExeFile);DWORD id=pe.th32ProcessID;CString str;str.Format(L"%d", id);m_list.SetItemText(i, 1, str);//获取快照中的下一个进程b = Process32Next(hSnapshot, &pe);i++;}return TRUE;  // return TRUE unless you set the focus to a control}

枚举进程的流程,获取系统快照-》获取快照中第一个进程-》循环获取下一个进程

添加WM_SIZE消息响应

void CPage2::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);if (m_list.GetSafeHwnd()){m_list.MoveWindow(0, 0, cx, cy);}
}

运行效果
在这里插入图片描述

源码

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

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

相关文章

【数据结构】树的基础知识及三种存储结构

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【Python】爬虫基础

爬虫是一种模拟浏览器实现&#xff0c;用以抓取网站信息的程序或者脚本。常见的爬虫有三大类&#xff1a; 通用式爬虫&#xff1a;通用式爬虫用以爬取一整个网页的信息。 聚焦式爬虫&#xff1a;聚焦式爬虫可以在通用式爬虫爬取到的一整个网页的信息基础上只选取一部分所需的…

SEO百度优化基础知识全解析(了解百度SEO标签作用)

百度SEO优化的作用介绍&#xff1a; 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化&#xff0c;提升网站在百度搜索结果中的排名&#xff0c;从而提高网站的曝光率和流量。通过百度SEO优化&#xff0c;可以让更多的潜在用户找到你的网站&…

redis持久化、主从和哨兵架构

一、redis持久化 1、RDB快照&#xff08;snapshot&#xff09; redis配置RDB存储模式&#xff0c;修改redis.conf文件如下配置&#xff1a; # 在300s内有100个或者以上的key被修改就会把redis中的数据持久化到dump.rdb文件中 # save 300 100# 配置数据存放目录&#xff08;现…

数据结构:树的概念和结构

文章目录 1. 树的概念2. 树的结构3. 树的相关概念4. 树的表示孩子表示法双亲表示法孩子兄弟表示法 5. 树在实际中的应用5. 树在实际中的应用 1. 树的概念 树是一种非线性的数据结构,它是由 n (n > 0)个有限结点组成一个具有层次关系的. 把它叫做树是因为它看起来像一棵倒挂的…

学会用命令行创建uni-app项目并用vscode开放项目

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 创建 uni-app 项目 命令行创建 uni-app 项目 编译和运行 uni-app 项目&#xff1a; 用 VS Code 开发 uni…

机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上] 引言总体介绍回顾&#xff1a;线搜索下降算法收敛速度的衡量方式线性收敛范围高阶收敛范围 二次终止性朴素算法&#xff1a;坐标轴交替下降法最速下降法(梯度下降法)梯度下降法的特点 针对最速下降法缺…

自动创建设备结点:udev机制的实现过程

什么是udev&#xff1f; 在Linux系统中&#xff0c;/dev目录是用来存放设备文件的&#xff0c;每个文件指向一个系统设备文件&#xff0c;用户的程序可以通过使用这些文件来对真实硬件进行设备操作&#xff0c;但是在2.4内核时代&#xff0c;/dev下保存了所有kernel可以支持的硬…

Prometheus+Grafana可视化监控【MySQL状态】

文章目录 一、Prometheus监控MySQL二、Grafana添加MySQL监控模板 PrometheusGrafana部署请参考上篇文章: PrometheusGrafana部署: 一、Prometheus监控MySQL 1、创建MySQL监控用户 mysql> create user "prometheus""%" identified by NTQ34tg*19VF; m…

Sharding-JDBC分库分表-分布式事务-5

分布式事务 Sharding JDBC事务介绍 分库分表必然会涉及到分布式事务的问题&#xff0c;关于这方面&#xff0c;sharding JDBC为用户提供了两种分布式事务解决方案&#xff1a;XA事务和BASE事务&#xff0c;这两个的区别是&#xff1a;XA事务&#xff0c;追求强一致性&#xf…

Linux——环境变量

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——环境变量 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作…

Redis优化 RDB AOF持久化

---------------------- Redis 高可用 ---------------------------------------- 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境…