(八)树控件(Tree Control),标签控件(tab control)

树控件

基于对话框创建工程

// 01_TreeCtrlDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "01_TreeCtrl.h"
#include "01_TreeCtrlDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

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

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// CMy01_TreeCtrlDlg 对话框

CMy01_TreeCtrlDlg::CMy01_TreeCtrlDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMy01_TreeCtrlDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMy01_TreeCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_TREE1, m_treeCtrl);
}

BEGIN_MESSAGE_MAP(CMy01_TreeCtrlDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()

// CMy01_TreeCtrlDlg 消息处理程序

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

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

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

    // TODO:  在此添加额外的初始化代码

    //加载图标
    HICON icon[3];
    icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
    icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
    icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);

    //图像列表,程序完毕不能释放, 创建
    //30, 30: 图片的宽度和高度
    //ILC_COLOR32:样式
    // 3, 3: 有多少图片写多少
    m_imageList.Create(30, 30, ILC_COLOR32, 3, 3);

    //给图像列表添加图片
    for (int i = 0; i < 3; i++)
    {
        //图片列表加载图标
        m_imageList.Add(icon[i]);
    }

    //树控件设置图片列表
    m_treeCtrl.SetImageList(&m_imageList, TVSIL_NORMAL);

    //给树创建节点
    //根节点,父节点,子节点
    HTREEITEM root = m_treeCtrl.InsertItem(TEXT("根节点"), 0, 0, NULL);

    HTREEITEM fathter = m_treeCtrl.InsertItem(TEXT("父节点"), 1, 1, root);

    HTREEITEM son = m_treeCtrl.InsertItem(TEXT("子节点"), 2, 2, fathter);

    HTREEITEM root2 = m_treeCtrl.InsertItem(TEXT("根节点"), 0, 0, NULL);

    HTREEITEM fathter2 = m_treeCtrl.InsertItem(TEXT("父节点"), 1, 1, root2);

    HTREEITEM son2 = m_treeCtrl.InsertItem(TEXT("子节点"), 2, 2, fathter2);

    //设置某个节点被选中
    m_treeCtrl.SelectItem(fathter);

    m_treeCtrl.SelectItem(son2);

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

void CMy01_TreeCtrlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

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

void CMy01_TreeCtrlDlg::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 CMy01_TreeCtrlDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}
// 01_TreeCtrlDlg.h : 头文件
//

#pragma once
#include "afxcmn.h"

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

// 对话框数据
    enum { IDD = IDD_MY01_TREECTRL_DIALOG };

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

// 实现
protected:
    HICON m_hIcon;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

private:
    CImageList m_imageList; //图像列表
    CTreeCtrl m_treeCtrl;
};

标签控件(tab control)

// CMy02_TabCtrlDlg 消息处理程序

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

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

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

    // TODO:  在此添加额外的初始化代码

    //给tab控件添加对话框
    //对话框设置为子对话框,默认是单独对话框
    m_tabCtrl.AddPage(TEXT("设置"), &dlg1, IDD_DIALOG1);
    m_tabCtrl.AddPage(TEXT("测试"), &dlg2, IDD_DIALOG2);

    //显示tab控件
    m_tabCtrl.Show();

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
// 02_TabCtrlDlg.h : 头文件
//

#pragma once
#include "TabSheet.h"
#include "MyDlg1.h"
#include "MyDlg2.h"

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

// 对话框数据
    enum { IDD = IDD_MY02_TABCTRL_DIALOG };

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

// 实现
protected:
    HICON m_hIcon;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
private:
    CTabSheet m_tabCtrl;

    MyDlg1 dlg1;
    MyDlg2 dlg2;

};

// TabSheet.cpp : implementation file
//

#include "stdafx.h"
//#include "Property5.h"
#include "TabSheet.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTabSheet

CTabSheet::CTabSheet()
{
    m_nNumOfPages = 0;
    m_nCurrentPage = 0;
}

CTabSheet::~CTabSheet()
{
}

BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)
    //{{AFX_MSG_MAP(CTabSheet)
    ON_WM_LBUTTONDOWN()
    ON_WM_HSCROLL()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTabSheet message handlers

BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
    if( MAXPAGE == m_nNumOfPages )
        return FALSE;

    m_nNumOfPages++;

    m_pPages[m_nNumOfPages-1] = pDialog;
    m_IDD[m_nNumOfPages-1] = ID;
    m_Title[m_nNumOfPages-1] = title;

    return TRUE;
}

void CTabSheet::SetRect()
{
    CRect tabRect, itemRect;
    int nX, nY, nXc, nYc;

    GetClientRect(&tabRect);
    GetItemRect(0, &itemRect);

    nX=itemRect.left;
    nY=itemRect.bottom+1;
    nXc=tabRect.right-itemRect.left-2;
    nYc=tabRect.bottom-nY-2;

    m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);
    for( int nCount=1; nCount < m_nNumOfPages; nCount++ )
        m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);

}

void CTabSheet::Show()
{
    int i = 0;
    for( i=0; i < m_nNumOfPages; i++ )
    {
        m_pPages[i]->Create( m_IDD[i], this );
        if (AfxGetMainWnd())
            InsertItem( i, m_Title[i] );
        else
            return;
    }

    m_pPages[0]->ShowWindow(SW_SHOW);
    for( i=1; i < m_nNumOfPages; i++)
        m_pPages[i]->ShowWindow(SW_HIDE);

    SetRect();

}

void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point)
{
    CTabCtrl::OnLButtonDown(nFlags, point);

    if(m_nCurrentPage != GetCurFocus())
    {
        m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);
        m_nCurrentPage=GetCurFocus();
        m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);
//        m_pPages[m_nCurrentPage]->SetFocus();

        //AfxMessageBox("бЁжа"); wbm test
    }

}

int CTabSheet::SetCurSel(int nItem)
{
    if( nItem < 0 || nItem >= m_nNumOfPages)
        return -1;

    int ret = m_nCurrentPage;

    if(m_nCurrentPage != nItem )
    {
        m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);
        m_nCurrentPage = nItem;
        m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);
//        m_pPages[m_nCurrentPage]->SetFocus();
        CTabCtrl::SetCurSel(nItem);
    }

    return ret;
}

int CTabSheet::GetCurSel()
{
    return CTabCtrl::GetCurSel();
}

void CTabSheet::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default

    CTabCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}

TabSheet.cpp

#if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)
#define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TabSheet.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CTabSheet window
#define MAXPAGE 16

class CTabSheet : public CTabCtrl
{
    // Construction
public:
    CTabSheet();

    // Attributes
public:

    // Operations
public:

    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CTabSheet)
    //}}AFX_VIRTUAL

    // Implementation
public:
    int GetCurSel();
    int SetCurSel(int nItem);
    void Show();
    void SetRect();
    BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID);
    virtual ~CTabSheet();

    // Generated message map functions
protected:
    LPCTSTR m_Title[MAXPAGE];
    UINT m_IDD[MAXPAGE];
    CDialog* m_pPages[MAXPAGE];
    int m_nNumOfPages;
    int m_nCurrentPage;
    //{{AFX_MSG(CTabSheet)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)

TabSheet.h

原文地址:https://www.cnblogs.com/xiangtingshen/p/10816929.html

时间: 2024-10-16 16:44:30

(八)树控件(Tree Control),标签控件(tab control)的相关文章

通过编写串口助手工具学习MFC过程&mdash;&mdash;(七)添加Tab Control控件

通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅.做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然.另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008) (七)添加Tab Control控件 要在对话框里添加标签页,点击标签页上

实用的树形菜单控件tree

 jQuery plugin: Treeview 这个插件能够把无序列表转换成可展开与收缩的Tree. jQuery plugin: Treeview  jQuery  jstree jsTree是一个基于jQuery的Tree控件.支持XML,JSON,Html三种数据源.提供创建,重命名,移动,删除,拖\放节点操作.可以自己自定义创建,删除,嵌套,重命名,选择节点的规则.在这些操作上可以添加多种监听事件.  jstree  jQuery UI Widgets  FileTreePanel F

MFC控件编程:Tab Control

Tab控件的使用 1 插入Tab控件的数据项(标签) CTabCtrl::InsertItem 2 以Tab控件为父窗口创建对话框 3 调整对话框大小 4 在Tab控件的SELCHANGE消息处理函数中,根据当前选项的索引设置对话框的显示状态. 新建一个基于对话框的工程,拖放一个Tab Control控件,Ctrl+W 为之绑定一个控件变量m_wndTabCtrl 插入两个对话框资源做为标签页面,注意设置它们的样式为:child 和 无边框 双击对话框资源为他们添加相关类,父类使用默认CDial

在VC++中使用Tab Control控件

系统环境:Windows 7 软件环境:Visual Studio 2008 SP1 本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用 查阅MSDN文档,对于创建Tab Control控件,MSDN上说明如下: To use CTabCtrl directly in a dialog box 1.     In the dialog editor, add a Tab Control to your dialog template resource. Sp

转:Tab Control控件的详细使用

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl.    3. 在对话框的初始化函数OnInitDia

TabHost标签控件

如果在屏幕上要放置很多的控件,可能一个屏放不下,除了使用滚动视图的方式外,还可以使用标签控件对屏幕进行分页显示,当单击标签控件的不同标签时,会显示当前标签的内容,在android系统中一个标签可以是一个View或者是Activity. TabHost是标签控件的核心类,也是一个标签的集合,每一个标签是TabHost.TabSpec对象.通过TabHost类的addTab的方法添加多个TabHost.TabSpec对象. 下面是实列: 在main.xml文件中: 1 <RelativeLayout

atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系

1. 服务器控件是可被服务器理解的标签.有三种类型的服务器控件: 1 1.1. HTML 服务器控件 - 传统的 HTML 标签 1 1.2. Web 服务器控件 - 新的 ASP.NET 标签 1 1.3. Validation 服务器控件 - 用于输入验证 1 2. HTML 服务器控件 1 3. - Web 服务器控件 2 4. 标准服务器控件可分为以下6种类型: 2 4.1. (1)标准控件:主要是指传统的Web窗体控件,例如TextBox.Button.Panel等控件.它们有一组标准

Android 标签控件

版本:1.0 日期:2014.7.24 版权:© 2014 kince 转载注明出处 在有的应用中可能需要设置一些标签来方便用去去查询某些信息,比如手机助手或者购物软件之类都会有一些标签.对于软件开发初期来说,直接使用TextView.Button实现是最为简单的一种方式.但是这种方法也有其局限性,比如不能控制换行.耦合性低等缺点.所以除了解决这些问题之外,最好能够封装一个类库出来,方便以后使用. 首先新建一个Tag类, import java.io.Serializable; public c

Edit Control:控件

//定义控件变量 CEdit sendData; //关联控件与变量.IDC_SendData为Edit Control类型的控件ID DDX_Control(pDX, IDC_SendData, sendData); CString sendBuf; //取得Edit Control类型的控件的输入内容,存储在sendBuf中 sendData.GetWindowText(sendBuf);