22 分页控件

news2024/11/24 7:03:52

文章目录

  • 界面设置
  • 初始化
    • 主对话框
    • 子页面初始化
  • 页面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/747310.html

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

相关文章

举例说明单层神经网络的工作原理

假设我们有一个简单的单层神经网络&#xff0c;用于解决一个简单的问题&#xff1a;根据一个人的年龄&#xff08;x&#xff09;来预测其收入&#xff08;y&#xff09;。在这个例子中&#xff0c;输入数据只有一个特征&#xff08;年龄&#xff09;&#xff0c;因此我们可以用…

Can转以太网网关can协议转以太网协议

YC-ETH-CAN-2 是一款用来把 CAN 总线数据转为网口数据的设备。网口支持 TCP Sever、TCP Client、UDP Sever、UDP Client、UDP Broadcast 模式&#xff0c;可以通过软件配置和网页配置。 设备提供两路 CAN 接口&#xff0c;两路 CAN 可分别配置为不同的工作模式&#xff0c;独立…

[QT编程系列-4]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:信号、槽函数、对象之间的通信

目录 2. QT程序的运行框架 2.4 设计界面元素的行为&#xff1a;信号、槽函数、对象之间的通信 2.4.1 对象之间的通信 2.4.2 信号槽与消息队里区别 2.4.3 预定义信号与默认槽函数 2.4.4 预定义信号与默认槽函数&#xff1a;案例2 2.4.5 预定义信号与自定义槽函数&#xff…

【JVM系列】类加载机制和双亲委派机制(一)

使用java8 一、类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。 package jvmdemo;public class Math {public static final int initData 666;public static User user new User();public int comput…

立创EDA(专业版)电路设计与制作快速入门

1.新建工程的时候 &#xff08;要注意用版本控制&#xff0c;项目名&#xff0c;日期&#xff0c;版本&#xff09; 2.原理图设计环境设置 3.电源转换电路 电源是一般是5v转3.3v电路 电源主要的可以选择LLDO来降压的或者是DCDC减压 这个电路主要是用LDO来降压的 AMS1117降…

操作系统Linux—day01

编程 网页 软件 网站项目 知识点&#xff1a; 前端页面&#xff1a;HTML css JavaScript JQuery VUE 数据库&#xff1a;Oracle MySQL 服务器&#xff1a;服务器的操作系统Linux Http://115.159.96.174:8090/EasyBuy/ www.baidu.com>http://180.101.49.12/ 后台技术…

【iOS】消息传递

Objective-C是一种动态语言&#xff0c;因此其很多行为是在运行时决定的。对于静态语言来说&#xff0c;函数的调用在编译时就已经确定。动态语言则不然&#xff0c;动态语言通过一些巧妙的机制使得函数的真实调用是在运行时决定的&#xff0c;即动态语言的特点是将一些决定性的…

2、常用基本命令-文件

Shell 可以看作是一个命令解释器&#xff0c;为我们提供了交互式的文本控制台界面。我们可以 通过终端控制台来输入命令&#xff0c;由 shell 进行解释并最终交给内核执行。 本章就将分类介绍 常用的基本 shell 命令。 7.1 帮助命令 7.1.1 man 获得帮助信息 1&#xff09;基本…

大于100万行数据如何转换坐标、格网生成和裁剪、低格网数据提取

在工作过程中&#xff0c;对于100万以下的数据&#xff0c;我们一般使用EXCEL进行操作&#xff0c;但对于大于1百万行的数据&#xff0c;EXCEL也无能为力。此时&#xff0c;解决办法有三种&#xff1a;&#xff08;1&#xff09;拆分成几个小于100万的文件&#xff0c;再用EXCE…

机器学习原理

此次主要是由分类来引出 由于宝可梦的图片比较简洁&#xff0c;而数码宝贝的图片就显得比较复杂&#xff0c;我们计算出他们的轮廓&#xff0c;求出白色数量的多少。 e的函数会计算线条的复杂程度。当得出的线条的复杂程度&#xff0c;小于h。我们认为其是宝可梦&#xff0c;反…

Python(七)二进制

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Mac非brew方式安装OpenResty教程

本文版本基于openresty-1.15.8.1和pcre-8.4.4安装。 一、安装前准备 由于openResty本质上还是基于nginx和Lua的高性能Web平台&#xff0c;安装openResty前需要先安装好openssl和pcre。 小编的机器因为之前安装过nginx&#xff0c;所以openssl和pcre已经有了。openssl的安装目…

Python(六)转义字符和原字符

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

包管理工具:npm、yarn、cnpm、npx、pnpm

yarn&#xff1a;  yarn是由Facebook(react)、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具&#xff1b;  yarn 是为了弥补早期npm 的一些缺陷而出现的&#xff1b;  早期的npm存在很多的缺陷&#xff0c;比如安装依赖速度很慢、版本依赖混乱等等一系列…

【LeetCode: 1911. 最大子序列交替和 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【C#】设置输入法,解决扫描枪在中文状态下识别异常问题

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

【Redis】特殊数据类型 Stream (流)

&#x1f3af;前言 除了五中基本的数据类型外&#xff0c;Redis还支持两种特殊的数据类型&#xff0c;第一种 Geo (地理位置)&#xff1a;用于存储地理位置相关的数据&#xff0c;例如经纬度、距离等。第二种 Stream (流)&#xff1a;是一个高级的列表类型&#xff0c;支持对列…

学习系统编程No.30【多线程控制实战】

引言&#xff1a; 北京时间&#xff1a;2023/7/7/9:58&#xff0c;耳机正在充电中&#xff0c;所以刚好让我们先把引言写一写&#xff0c;昨天睡觉前听了一会小说&#xff0c;听小说的好处就在于&#xff0c;它可以让你放下手机&#xff0c;快速睡觉&#xff0c;并且还有一定的…

python批量检测网站是否能打开

import requestsif __name__ "__main__":file_name input() #读取文件名fp1 open(file_name, "r") #以只读&#xff0c;打开文件for line in fp1.readlines(): #readlines 按行读取文件&#xff0c;会保留\n&#xff0c;返回一个(文…

3. MySQL - 数据类型 选项约束

目录 回顾 1. 命令行下的 MySql 客户端 2. 图形化界面的 MySQL-Client 3. 数据库概述 3.1 数据库管理系统是什么 3.2 工作模式 3.3 RDBMS 管理数据的结构 3.4 客户端连接服务器的信息 4. MySQL 中的数据类型 4.1 整型类型 4.2 字符串 4.3 日期/时间 5. MySQL 每个字…