23 分页控件

news2024/11/23 17:15:56

文章目录

  • 界面设置
  • 初始化
    • 主对话框
    • 子页面初始化
  • 页面1枚举窗口
  • 页面2枚举进程
  • 全部代码

界面设置

ui 设置
在这里插入图片描述>创建CTablCtrl
在这里插入图片描述> 创建页控件(子窗口),style设置成为chlid
在这里插入图片描述添加类
在这里插入图片描述在这里插入图片描述页面中加入listCtrl 控件
在这里插入图片描述添加变量
在这里插入图片描述分别添加初始化函数
在这里插入图片描述

初始化

主对话框

BOOL CManagerDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	//插入
	m_table.InsertItem(0, L"窗口");
	m_table.InsertItem(0, L"进程");

	m_page1.Create(IDD_PAGE1_DLG,&m_table);//创建页
	m_page2.Create(IDD_PAGE2_DLG,&m_table);

	//调整位置
	CRect rect;
	m_table.GetClientRect(&rect);
	rect.top = 22;
	rect.left = 2;
	rect.right -= 2;
	rect.bottom -= 3;
	m_page1.MoveWindow(&rect);
	m_page2.MoveWindow(&rect);

	m_page1.ShowWindow(SW_SHOW);
	m_page2.ShowWindow(SW_HIDE);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

设置样式选择改变
在这里插入图片描述

切换窗口

void CManagerDlg::OnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
{
	int nSel=m_table.GetCurSel();//0选择成功1选择失败
	switch (nSel)
	{
	case 0:
		m_page1.ShowWindow(SW_SHOW);
		m_page2.ShowWindow(SW_HIDE);
		break;
	case 1:
		m_page1.ShowWindow(SW_HIDE);
		m_page2.ShowWindow(SW_SHOW);
		break;

	}
	*pResult = 0;
}

请添加图片描述

改变页面大小
在这里插入图片描述

void CManagerDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	if (m_table.GetSafeHwnd())
	{
		m_table.MoveWindow(15, 12, cx-30, cy-24);
		CRect rect;
		m_table.GetClientRect(&rect);
		rect.top = 22;
		rect.left = 2;
		rect.right -= 2;
		rect.bottom -= 3;
		m_page1.MoveWindow(&rect);
		m_page2.MoveWindow(&rect);
	}
}

子页面初始化

页面1

BOOL CPage1Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	m_list.InsertColumn(0, L"窗口名", LVCFMT_LEFT, 120);
	m_list.InsertColumn(0, L"状态", LVCFMT_LEFT, 120);

	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

页面2

BOOL CPage2Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	m_list.InsertColumn(0, L"进程名", LVCFMT_LEFT, 120);
	m_list.InsertColumn(0, L"PID", LVCFMT_LEFT, 120);

	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

改变页面大小
在这里插入图片描述

void CPage2Dlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);
	if (m_list.GetSafeHwnd())//判断窗口是否存在
	{
		m_list.MoveWindow(0, 0, cx, cy);
	}
}

请添加图片描述

页面1枚举窗口

void CPage1Dlg::EnunWindows()
{
	CWnd* pWnd = GetParent()->GetParent();
	//CWnd* pWnd=GetDesktopWindow();//获取桌面
	pWnd=pWnd->GetWindow(GW_HWNDFIRST);
	int i = 0;
	while (pWnd)
	{
		//获取标题
		CString str;
		pWnd->GetWindowText(str);
		m_list.InsertItem(i,str);
		pWnd=pWnd->GetWindow(GW_HWNDNEXT);
		i++;
	}
}

页面2枚举进程

void CPage2Dlg::EnumProcess()
{
	//创建进程快照
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	//返回进程列表
	PROCESSENTRY32 pe32{ sizeof(PROCESSENTRY32) };//枚举驻留的进程
	BOOL b = Process32First(hSnapshot, &pe32);
	int i = 0;
	while (b)
	{
		m_list.InsertItem(i, pe32.szExeFile);
		CString str;
		str.Format(L"%d", pe32.th32ParentProcessID);
		m_list.SetItemText(i, 1, str);
		b = Process32Next(hSnapshot, &pe32);//获取下一个进程
		i++;
	}
}

请添加图片描述

全部代码

// ManagerDlg.h: 头文件

//

#pragma once
#include "CPage1Dlg.h"
#include "CPage2Dlg.h"

// CManagerDlg 对话框
class CManagerDlg : public CDialogEx
{
// 构造
public:
	CManagerDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MANAGER_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CTabCtrl m_table;
	CPage1Dlg m_page1;
	CPage2Dlg m_page2;
	afx_msg void OnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnSize(UINT nType, int cx, int cy);
};

// ManagerDlg.cpp: 实现文件

//

#include "pch.h"
#include "framework.h"
#include "Manager.h"
#include "ManagerDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CManagerDlg 对话框



CManagerDlg::CManagerDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MANAGER_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CManagerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TAB1, m_table);
}

BEGIN_MESSAGE_MAP(CManagerDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CManagerDlg::OnSelchangeTab)
	ON_WM_SIZE()
END_MESSAGE_MAP()


// CManagerDlg 消息处理程序

BOOL CManagerDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	//插入
	m_table.InsertItem(0, L"窗口");
	m_table.InsertItem(0, L"进程");

	m_page1.Create(IDD_PAGE1_DLG,&m_table);//创建页
	m_page2.Create(IDD_PAGE2_DLG,&m_table);

	//调整位置
	CRect rect;
	m_table.GetClientRect(&rect);
	rect.top = 22;
	rect.left = 2;
	rect.right -= 2;
	rect.bottom -= 3;
	m_page1.MoveWindow(&rect);
	m_page2.MoveWindow(&rect);

	m_page1.ShowWindow(SW_SHOW);
	m_page2.ShowWindow(SW_HIDE);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CManagerDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CManagerDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CManagerDlg::OnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
{
	int nSel=m_table.GetCurSel();//0选择成功1选择失败
	switch (nSel)
	{
	case 0:
		m_page1.ShowWindow(SW_SHOW);
		m_page2.ShowWindow(SW_HIDE);
		break;
	case 1:
		m_page1.ShowWindow(SW_HIDE);
		m_page2.ShowWindow(SW_SHOW);
		break;

	}
	*pResult = 0;
}


void CManagerDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	if (m_table.GetSafeHwnd())
	{
		m_table.MoveWindow(15, 12, cx-30, cy-24);
		CRect rect;
		m_table.GetClientRect(&rect);
		rect.top = 22;
		rect.left = 2;
		rect.right -= 2;
		rect.bottom -= 3;
		m_page1.MoveWindow(&rect);
		m_page2.MoveWindow(&rect);
	}
}

// CPage1Dlg 对话框

class CPage1Dlg : public CDialogEx
{
	DECLARE_DYNAMIC(CPage1Dlg)

public:
	CPage1Dlg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CPage1Dlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PAGE1_DLG };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	CListCtrl m_list;
	virtual BOOL OnInitDialog();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	void EnunWindows();
};

// CPage1Dlg.cpp: 实现文件

//

#include "pch.h"
#include "Manager.h"
#include "CPage1Dlg.h"
#include "afxdialogex.h"


// CPage1Dlg 对话框

IMPLEMENT_DYNAMIC(CPage1Dlg, CDialogEx)

CPage1Dlg::CPage1Dlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE1_DLG, pParent)
{

}

CPage1Dlg::~CPage1Dlg()
{
}

void CPage1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_list);
}


BEGIN_MESSAGE_MAP(CPage1Dlg, CDialogEx)
	ON_WM_SIZE()
END_MESSAGE_MAP()


// CPage1Dlg 消息处理程序


BOOL CPage1Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	m_list.InsertColumn(0, L"窗口名", LVCFMT_LEFT, 120);
	m_list.InsertColumn(0, L"状态", LVCFMT_LEFT, 120);
	EnunWindows();
	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}


void CPage1Dlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	if (m_list.GetSafeHwnd())//判断窗口是否存在
	{
		m_list.MoveWindow(0, 0, cx, cy);
	}
}

void CPage1Dlg::EnunWindows()
{
	CWnd* pWnd = GetParent()->GetParent();
	//CWnd* pWnd=GetDesktopWindow();//获取桌面
	pWnd=pWnd->GetWindow(GW_HWNDFIRST);
	int i = 0;
	while (pWnd)
	{
		//获取标题
		CString str;
		pWnd->GetWindowText(str);
		m_list.InsertItem(i,str);
		pWnd=pWnd->GetWindow(GW_HWNDNEXT);
		i++;
	}
}

// CPage2Dlg 对话框

class CPage2Dlg : public CDialogEx
{
	DECLARE_DYNAMIC(CPage2Dlg)

public:
	CPage2Dlg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CPage2Dlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PAGE2_DLG };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	CListCtrl m_list;
	virtual BOOL OnInitDialog();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	void EnumProcess();
};

// CPage2Dlg.cpp: 实现文件

//

#include "pch.h"
#include "Manager.h"
#include "CPage2Dlg.h"
#include "afxdialogex.h"
#include "tlhelp32.h"

// CPage2Dlg 对话框

IMPLEMENT_DYNAMIC(CPage2Dlg, CDialogEx)

CPage2Dlg::CPage2Dlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE2_DLG, pParent)
{

}

CPage2Dlg::~CPage2Dlg()
{
}

void CPage2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_list);
}


BEGIN_MESSAGE_MAP(CPage2Dlg, CDialogEx)
	ON_WM_SIZE()
END_MESSAGE_MAP()


// CPage2Dlg 消息处理程序


BOOL CPage2Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	m_list.InsertColumn(0, L"进程名", LVCFMT_LEFT, 120);
	m_list.InsertColumn(0, L"PID", LVCFMT_LEFT, 120);

	EnumProcess();


	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}


void CPage2Dlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);
	if (m_list.GetSafeHwnd())//判断窗口是否存在
	{
		m_list.MoveWindow(0, 0, cx, cy);
	}
}

void CPage2Dlg::EnumProcess()
{
	//创建进程快照
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	//返回进程列表
	PROCESSENTRY32 pe32{ sizeof(PROCESSENTRY32) };//枚举驻留的进程
	BOOL b = Process32First(hSnapshot, &pe32);
	int i = 0;
	while (b)
	{
		m_list.InsertItem(i, pe32.szExeFile);
		CString str;
		str.Format(L"%d", pe32.th32ParentProcessID);
		m_list.SetItemText(i, 1, str);
		b = Process32Next(hSnapshot, &pe32);//获取下一个进程
		i++;
	}
}

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

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

相关文章

3ds Max 建模基础教程:创建棕榈植物

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 嘿伙计们&#xff0c;在本教程中&#xff0c;我们将学习如何使用其花盆创建棕榈植物&#xff0c;首先我们将对花盆进行建模&#xff0c;然后设置叶子和纹理&#xff0c;我从谷歌搜索中找到了纹理&#xff0…

常用的k8s管理命令

Kubernetes 是一个由主节点和工作节点组成的容器编排工具。它只允许通过作为控制平面核心组件的 API 服务器进行通信。API 服务器公开了一个 HTTP REST API&#xff0c;允许内部组件&#xff08;如用户和集群&#xff09;和外部组件之间的通信。 你可以将 API 服务器视为 Kuber…

RestClient操作索引库

一、初始化RestClient 分为三步&#xff1a; 1&#xff09;引入es的RestHighLevelClient依赖&#xff1a; <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dep…

字节面试:连接一个不存在的 IP 地址,会发生什么?

分享两个字节面试题&#xff0c;都是基于场景问的网络问题。 Q1&#xff1a;客户端连接一个不存在的 IP 地址&#xff0c;会发生什么&#xff1f; Q2&#xff1a;客户端连接一个存在的 IP 地址但是端口不存在&#xff0c;会发生什么&#xff1f; PS&#xff1a;这里的「连接…

leetcode:2395. 和相等的子数组(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的整数数组 nums &#xff0c;判断是否存在 两个 长度为 2 的子数组且它们的 和 相等。注意&#xff0c;这两个子数组起始位置的下标必须 不相同 。 如果这样的子数组存在&#xff0c;请返回 true&#xff0c;否则返回 false 。 子数…

快消品行业企业如何选择适合自己的订单管理系统源码

快消品行业企业在选择适合自己的订单管理系统源码时&#xff0c;需要考虑以下五个方面&#xff1a; 首先&#xff0c;企业需要考虑订单管理系统的功能是否能够满足自身的需求。订单管理系统应该具备订单录入、订单查询、订单处理、订单跟踪、进销存管理、临期提醒等基本功能&am…

创业大赛,助力AI创业团队加速发展

AI产业投资人认为&#xff0c;参加AI大模型大赛的企业&#xff0c;无论是大厂还是创业团队&#xff0c;在技术、资本和产品等方面都面临全方位的竞争。特别对于创业团队而言&#xff0c;早期的问题是缺乏资金和技术支持&#xff0c;这让很多创业团队犹豫不决。 大型模型的研发…

2.MySQL- Linux 常见指令

目录 回顾&#xff1a;Linux 常见命令 一、创建目录 make directory (mkdir) 二、创建一个空白的文本文件 (touch) 练习 三、查看文本文件内容相关的指令&#xff08;cat head tile...&#xff09; 3.1 cat 3.2 head & tail 3.3 wc -l 3.4 grep 3.5 less & …

电脑城要倒闭?“泰酷辣”

电脑城要倒闭&#xff1f;“泰酷辣” &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1…

走进Linux世界【一、Linux概述】

第一章 Linux概述 1、操作系统 ​ 定义&#xff1a;操作系统(Operating System&#xff0c;简称OS)是管理计算机硬件与软件资源的计算机程序 ​ 作用&#xff1a;是把计算机系统中对硬件设备的操作封装起来&#xff0c;供应用软件调用&#xff0c;也是提供一个让用户与系统交…

I2C(IIC)总线 物理层

2C 通信设备常用的连接方式如下图&#xff1a; ①它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C 通讯总线中&#xff0c;可连接多个I2C 通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 ②一个I2C 总线只使用两条总线线路&#xff0c;一条双向串…

Windows 操作系统架构介绍

Windows 操作系统架构介绍 4 种基本类型的用户模式进程用户进程服务进程系统进程环境子系统服务进程Windows 内核模式组件 重要的系统组件环境子系统和子系统 DLL子系统的启动Windows 子系统Windows 10 和 Win32k.sys 其他子系统执行体内核内核对象内核处理器控制区&#xff08…

掌握这些写简历投简历的“黑魔法”,告别简历已读不回!

“哎&#xff0c;我还能找到工作吗&#xff1f;” 这是最近加我微信的好友&#xff0c;问的最多的一句话。 太卷了 最近加我微信的朋友很多&#xff0c;我都很奇怪&#xff0c;最近也没怎么发文章&#xff0c;怎么会有这么多人加我。 大概就是因为太卷了&#xff0c;之前写的…

右键pdf文件没有打印

问题描述 右键点pdf文件&#xff0c;弹出的菜单找不到打印选项。网上找了很多办法&#xff0c;然并卵啊。还是得靠自己慢慢摸索。 原因分析 新安装的win11系统&#xff0c;pdf文件默认可以用windows自带的edge浏览器打开。但是edge浏览器没有能力提供右键打印功能。 解决办法…

(一)ESP32基于MicroPython平台——环境搭建

一. 获取固件 我们要使用MicroPython平台进行ESP32程序的编写&#xff0c;您需要做的第一件事是下载最新的 MicroPython 固件.bin 文件以加载到您的 ESP32 设备上。您可以从 &#xff1a;MicroPython固件链接下载它 。从这里&#xff0c;您有 3 个主要选择&#xff1a; 稳定的…

STM32与RS485

单片机应用实践篇之RS485通信及MODBUS通信协议——MODBUS通信协议简介_哔哩哔哩_bilibili RS485基本认识 1&#xff1a;RS485用于工业控制&#xff0c;与我们使用的USART不同&#xff0c;无法直接与单片机的RXD和TXD直接相连&#xff0c;需要使用转化芯片&#xff0c;将TTL电平…

Halcon——C#中在HWindow上显示字符串遇见的问题及解决方案

Halcon——C#中在HWindow上显示字符串遇见的问题及解决方案 前言一、HWindow上显示字符串的两种方式1. DispText函数2. WriteString函数 二、DispText函数与WriteString函数的区别三、遇见的问题及解决方案“HALCON error #5123: Wrong window type in operator disp_text”“H…

带你【玩转Linux命令】➽ cat chattr 每天2个day01

带你【玩转Linux命令】➽ cat & chattr 每天2个day01 &#x1f53b; 一、文件管理命令1.1 cat-打印输出文件内容1.2 chattr-改变文件属性 &#x1f53b; 总结—温故知新 &#x1f448;【上一篇】 &#x1f496;The Begin&#x1f496; 点点关注&#xff0c;收藏不迷路&am…

驱动程序设计 驱动程序函数、驱动控制LED闪烁 7.7

驱动函数 .read() .write() ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);驱动程序 /** 文件名称&#xff1a;mod.c* 创 建 者: memories* 创建日期&#xff1a;2023…

GPU调研之TensorFlow Benchmarks测试GPU

目录 1. 查看服linux服务器信息 2. Linux系统安装pip详细步骤 3. Centos安装python3 4. 安装TensorFlow 5. TensorFlow测试结果解读 6. 参考文档 gpu的占用率为99%&#xff0c;是一种比较正常的使用状态。 gpu是图形处理器的简称&#xff0c;又称显示核心、视觉处理器、…