MFC基础笔记

List Control

// List Control初始化,下面代码需要放在OnInitDialog()函数里面
//
设置扩展风格:正行选中 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 添加标题 m_list.InsertColumn(0, _T("名称"), LVCFMT_CENTER, 150); m_list.InsertColumn(1, _T("PID"), LVCFMT_CENTER, 100); m_list.InsertColumn(2, _T("文件所在位置"), LVCFMT_CENTER, 325);
// ------------------------------
// 先插入一个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(0);
// 实现右键菜单前面的图标
pSubMenu->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_subBmp[0], &m_subBmp[0]);
pSubMenu->SetMenuItemBitmaps(1, MF_BYPOSITION, &m_subBmp[1], &m_subBmp[1]);
// 代表没有列表项被选中,则禁用结束进程的功能
if (pNMItemActivate->iItem == -1)
{
  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") != 0)
    {
        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 += 20;
    rt.left += 1;
    rt.right -= 1;
    rt.bottom -= 1;
    // 显示进程子窗口
    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(16, 16, ILC_COLOR24 | ILC_MASK, 1, 0);
// 文件查看
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(0, _T("文件查看"), 0);
m_tab.InsertItem(1, _T("文件传输"), 1);

// 显示文件查看对话框
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(0, 20, 0, 0);
// 移动窗口
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(0, 20, 0, 0);
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 0:
    {
        m_fileview->ShowWindow(SW_SHOW);
        m_filetrans->ShowWindow(SW_HIDE);
    }
    break;
    case 1:
    {
        m_fileview->ShowWindow(SW_HIDE);
        m_filetrans->ShowWindow(SW_SHOW);
    }
    break;
    }
    *pResult = 0;
}

状态栏

// 初始化状态栏
CStatusBar m_statusbar;
BOOL hbar = m_statusbar.Create(this);
UINT b[3] = { 1009, 1010 };
// 设置分栏的个数和每个分栏的ID
hbar = m_statusbar.SetIndicators(b, 2);
// 设置分栏的宽度
m_statusbar.SetPaneInfo(0, b[0], SBPS_NORMAL, 200);
m_statusbar.SetPaneInfo(1, b[1], SBPS_NORMAL, 200);
// 设置分栏的文本
m_statusbar.SetPaneText(0, _T(""));
m_statusbar.SetPaneText(1, _T(""));
// 显示状态栏
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, 
原文地址:https://www.cnblogs.com/duxie/p/10857765.html