List Control

// List Control初始化,下面代码需要放在OnInitDialog()函数里面
// 设置扩展风格:正行选中
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
// 添加标题
m_list.InsertColumn(, _T("名称"), LVCFMT_CENTER, );
m_list.InsertColumn(, _T("PID"), LVCFMT_CENTER, );
m_list.InsertColumn(, _T("文件所在位置"), LVCFMT_CENTER, );
// ------------------------------
// 先插入一个item到列表
m_list.InsertItem(dwIndex, L"");
// 将进程名插入到item第0列
m_list.SetItemText(dwIndex, 0, pe.szExeFile);
// 将进程PID插入到item第1列
str.Format(_T("%d"), pe.th32ProcessID);
m_list.SetItemText(dwIndex, 1, str);

 // 需要用到列表里面的内容的时候,会用到下面的代码

 if (m_list.GetSelectedCount() == 1)
 {
  POSITION pos_s;
  pos_s = m_list.GetFirstSelectedItemPosition();
  int item = m_list.GetNextSelectedItem(pos_s);

  CString m_exeName;
  m_exeName = m_list.GetItemText(item, 1);
 }

如何让MFC窗口的Esc键和Enter键失效?

// 重写PreTranslateMessage函数,让程序主窗口的Enter键和Esc键失效
BOOL CFileDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_KEYDOWN)
{
int nKey = (int)pMsg->wParam;
if (nKey == VK_RETURN || nKey == VK_ESCAPE)
{
return true;
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}

如何加载菜单

CMenu m_Menu; // 最好写为类的成员变量
m_Menu.LoadMenuW(IDR_MENU1);
SetMenu(&m_Menu);
// 实现主菜单的子菜单前面的图标
CBitmap m_Bmp[2]; // 最好写为类的成员变量
m_Bmp[0].LoadBitmap(IDB_EXIT);
m_Bmp[1].LoadBitmap(IDB_ABOUT);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_Bmp[0], &m_Bmp[0]);
GetMenu()->GetSubMenu(1)->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_Bmp[1], &m_Bmp[1]);

列表右键弹出菜单

// 定义下面要用到的cmenu对象
CMenu menu, *pSubMenu;
// 装载自定义的右键菜单
menu.LoadMenu(IDR_MENU2);
// 获取子菜单项
pSubMenu = menu.GetSubMenu();
// 实现右键菜单前面的图标
pSubMenu->SetMenuItemBitmaps(, MF_BYPOSITION, &m_subBmp[], &m_subBmp[]);
pSubMenu->SetMenuItemBitmaps(, MF_BYPOSITION, &m_subBmp[], &m_subBmp[]);
// 代表没有列表项被选中,则禁用结束进程的功能
if (pNMItemActivate->iItem == -)
{
  pSubMenu->EnableMenuItem(ID_32774, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
// 获取第一个弹出菜单,所以第一个菜单必须有子菜单
// 定义一个用于确定光标位置的位置
CPoint oPoint;
//获取当前光标的位置,以便使得菜单可以跟随光标
GetCursorPos(&oPoint);
// 弹出子菜单
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, oPoint.x, oPoint.y, this);

点击按钮弹出对话框

CAbout dlg(this);
dlg.DoModal();

点击按钮打开一个选择文件对话框

// 1、打开一个文件夹选择对话框
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK)
{
CString path = dlg.GetFolderPath();
// 2、获取选择的文件的后缀名,判断是否是DLL
CString path1 = dlg.GetFileName();
PCTSTR FileType = PathFindExtension(path1);
if (wcscmp(FileType, L".dll") != )
{
m_Edit2.SetWindowText(L"");
return;
}
// 3、将文件路径显示到编辑框
m_Edit2.SetWindowText(path + L"\\" + path1);
}

Tab Control 第一种方法

  CProcess* pDlg = new CProcess;
CMyPE* peDlg = new CMyPE;
CMyFunction* fDlg = new CMyFunction;
CMySCMManager* sDlg = new CMySCMManager;
m_tab.AddTab(L"进程", pDlg);
m_tab.AddTab(L"PE", peDlg);
m_tab.AddTab(L"功能", fDlg);
m_tab.AddTab(L"服务", sDlg); CRect rt;
GetClientRect(rt);
rt.top += ;
rt.left += ;
rt.right -= ;
rt.bottom -= ;
// 显示进程子窗口
pDlg->MoveWindow(rt);
pDlg->ShowWindow(SW_SHOW);
// 隐藏pe子窗口
peDlg->ShowWindow(SW_HIDE);
// 隐藏功能子窗口
fDlg->ShowWindow(SW_HIDE);
// 隐藏服务窗口
sDlg->ShowWindow(SW_HIDE) // 要自定义下面的类 和函数

class CMyTabCtrl :
public CTabCtrl
{
public:
CMyTabCtrl();
~CMyTabCtrl();
// 保存tab对应的子窗口
std::vector<CWnd*> m_SubWnd;
void AddTab(const CString& title, CWnd* pSubWnd);
DECLARE_MESSAGE_MAP()
afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);
};

// 添加控件处理函数
void CMyTabCtrl::AddTab(const CString& title, CWnd* pSubWnd)
{
// 调用父类的添加选项卡的函数
CTabCtrl::InsertItem(m_SubWnd.size(), title);
m_SubWnd.push_back(pSubWnd);
// 将子窗口的父窗口设置为本窗口(选项卡)
pSubWnd->ShowWindow(SW_SHOW);
pSubWnd->SetParent(this);

CRect rt;
GetClientRect(rt);
rt.top += 20;
rt.left += 1;
rt.right -= 1;
rt.bottom -= 1;
// 显示当前选项卡对应的子窗口
if (pSubWnd != NULL)
{
pSubWnd->MoveWindow(rt);
}
}

// 切换控件处理函数
void CMyTabCtrl::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
// 获取当前选中项
DWORD dwIndex = this->GetCurSel();
// 遍历所有窗口,将子窗口都隐藏起来
for (auto&i : m_SubWnd)
{
if (i != NULL)
{
i->ShowWindow(SW_HIDE);
}
}

CRect rt;
GetClientRect(rt);
rt.top += 20;
rt.left += 1;
rt.right -= 1;
rt.bottom -= 1;
// 显示当前选项卡对应的子窗口
if (m_SubWnd[dwIndex] != NULL)
{
m_SubWnd[dwIndex]->MoveWindow(rt);
m_SubWnd[dwIndex]->ShowWindow(SW_SHOW);
}
}

Tab Control 第二种方法

CTabCtrl m_tab;
CFileview *m_fileview;
CFiletrans *m_filetrans;
// 设置Tab控件前面的图标
m_imagetab.Create(, , ILC_COLOR24 | ILC_MASK, , );
// 文件查看
m_imagetab.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON7)));
// 文件传输
m_imagetab.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON6)));
m_tab.SetImageList(&m_imagetab); // Tab控件插入两个节点
m_tab.InsertItem(, _T("文件查看"), );
m_tab.InsertItem(, _T("文件传输"), ); // 显示文件查看对话框
m_fileview = new CFileview(this, m_sock);
m_fileview->Create(IDD_FILEVIEW, &m_tab);
CRect m_rect;
// 获取Tab控件客户区大小到m_rect
m_tab.GetClientRect(m_rect);
// 缩小m_rect的大小
m_rect.DeflateRect(, , , );
// 移动窗口
m_fileview->MoveWindow(m_rect); // 显示文件传输对话框
m_filetrans = new CFiletrans(this, m_sock);
m_filetrans->Create(IDD_FILETRANS, &m_tab);
m_tab.GetClientRect(m_rect);
m_rect.DeflateRect(, , , );
m_filetrans->MoveWindow(m_rect); // 默认显示文件查看对话框
m_fileview->ShowWindow(SW_SHOW);
// Tab控件切换处理函数
void CFileDlg::OnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码 // 获取所选择的焦点ID
int sel = m_tab.GetCurFocus();
switch (sel)
{
case :
{
m_fileview->ShowWindow(SW_SHOW);
m_filetrans->ShowWindow(SW_HIDE);
}
break;
case :
{
m_fileview->ShowWindow(SW_HIDE);
m_filetrans->ShowWindow(SW_SHOW);
}
break;
}
*pResult = ;
}

状态栏

// 初始化状态栏
CStatusBar m_statusbar;
BOOL hbar = m_statusbar.Create(this);
UINT b[] = { , };
// 设置分栏的个数和每个分栏的ID
hbar = m_statusbar.SetIndicators(b, );
// 设置分栏的宽度
m_statusbar.SetPaneInfo(, b[], SBPS_NORMAL, );
m_statusbar.SetPaneInfo(, b[], SBPS_NORMAL, );
// 设置分栏的文本
m_statusbar.SetPaneText(, _T(""));
m_statusbar.SetPaneText(, _T(""));
// 显示状态栏
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,

MFC基础笔记的更多相关文章

  1. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  2. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  3. php代码审计基础笔记

    出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...

  4. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

  5. MYSQL基础笔记(五)- 练习作业:站点统计练习

    作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...

  6. MYSQL基础笔记(四)-数据基本操作

    数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...

  7. MYSQL基础笔记(三)-表操作基础

    数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...

  8. MYSQL基础笔记(二)-SQL基本操作

    SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...

  9. MYSQL基础笔记(一)

    关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...

随机推荐

  1. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_24-CMS前端页面查询开发-使用钩子方法实现立即查询

    进入页面默认就去查询数据 这要用到vue的钩子函数,每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听. 编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. ...

  2. ios 自动去重

      //resultArrM 数据原//_indexArray 过滤后的数据//MYSelectAreaModel 模型 /* 重定义索引 */ - (void)sy_indexArray{ /* 索 ...

  3. js的event详解

    event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定的事件有意义.比如,fromElement ...

  4. RESTful架构(Representational State Transfer资源表现层状态转换)

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  5. Java工程师学习指南第4部分:Java并发编程指南

    本文整理了微信公众号[Java技术江湖]发表和转载过的Java并发编程相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧. [纯干货]Java 并发进阶常见面试题总结 [Java基本功] ...

  6. SQL中有关DQL、DML、DDL、DCL的概念与区别?

    SQL(Structure Query Language)结构化查询语言是数据库的核心语言,是高级的非过程化编程语言.它功能强大,效率高,简单易学易维护.SQL语言基本上独立于数据库本身.使用的机器. ...

  7. TensorFlow.ZC尝试

    1.资料: https://github.com/protocolbuffers/protobuf/releases https://pythonprogramming.net/introductio ...

  8. MySQL中的日期和时间:使用和说明,以及常用函数

    1.首先需要注意: 1.1 MySQL中把日期和时间是分开的. 以字符串2007-12-31 00:59:59为例: 日期部分:2007-12-31.这部分也可以叫做一个日期表达式. 时间部分:00: ...

  9. 使用nginx构建限频、限速、限并发的应用保护层

    使用nginx构建限频.限速.限并发的应用保护层 nginx本身提供了基础的限频.限速.限并发连接等能力. 限频 基于uri等限制某一个客户端,某类客户端持续时间段内建立连接的次数. 限速 限制客户端 ...

  10. SQL SERVER ISDATE函数

    定义: ISDATE函数判断指定字符串是否是有效日期. 语法: ISDATE(date) 参数: ①date是需要判定是否是有效日期的字符串 返回值: int型数据 例:  声明:本文是本人查阅网上及 ...