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);
}
}
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++;
}
}
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++;
}
}