MFC 常用控件 [转]

MFC 常用控件 [转]

目录

MFC 常用控件 [转]

静态文本框CStatic

普通按钮 CButton

编辑框CEdit

组合框(下拉框) CComboBox 

列表控件 CListCtrl

树控件 CTreeCtrl

添加图标资源(icon)

标签控件 CTabCtrl

静态文本框CStatic

  • 静态文本框是最简单的控件,它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。 
  • 静态文本框的重要属性有:
    • ID:所有静态文本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件)
    • Caption:修改显示的内容

接口

功能

CWnd::SetWindowText

设置控件内容

CWnd::GetWindowText

获取控件内容

CStatic::SetBitmap

设置位图(后缀为bmp的图片)

关联控件变量:

  • 由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量

  •  在主对话框类OnInitDialog()中,完成相应接口测试:

  •  示例1:设置文本
m_text.SetWindowTextW(TEXT("呵呵"));

CString str;
m_text.GetWindowTextW(str);
MessageBox(str);
  • 示例2:显示图片:
//设置静态控件窗口风格为位图居中显示
m_pic.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);

//通过路径获取bitmap句柄
#define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION)

//宽高设置 应该按照 控件的大小取设置
CRect rect;
m_pic.GetWindowRect(rect);

//静态控件设置bitmap
m_pic.SetBitmap(HBMP(TEXT("./1.bmp"), rect.Width(), rect.Height()));

普通按钮 CButton

  •  按钮的主要属性是Caption,来设置在按钮上显示的文本。
  • 命令按钮处理的最多的消息是:BN_CLICKED,双击按钮即可跳转到处理函数。
    • 或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数:

接口

功能

CWnd::SetWindowText

设置控件内容

CWnd::GetWindowText

获取控件内容

CWnd::EnableWindow

设置控件是否变灰

关联控件变量:

  •  在主对话框类OnInitDialog()中,完成相应接口测试
//获取按钮的内容
CString str;
m_button.GetWindowText(str);
MessageBox(str);

//设置按钮内容
m_button.SetWindowText(TEXT("^_^"));

//设置按钮状态为灰色
m_button.EnableWindow(FALSE);
m_button.EnableWindow(TRUE);

编辑框CEdit

  •  常用属性设置:

属性

含义

Number

True只能输入数字

Password

True密码模式

Want return

True接收回车键,自动换行,只有在多行模式下,才能换行

Multiline

True多行模式

Auto VScroll

True 当垂直方向字符太多,自动出现滚动条,同时设置Vertical Scroll才有效

Vertical Scroll

True当垂直方向字符太多,自动出现滚动条,和Auto VScroll配合使用

Horizontal Scroll

True当垂直方向字符太多,自动出现滚动条,和Auto HScroll配合使用

Read Only

True 只读

  • 常用接口:

接口

功能

CWnd::SetWindowText

设置控件内容

CWnd::GetWindowText

获取控件内容

关联控件变量

  •  在主对话框类OnInitDialog()中,完成相应接口测试:
/设置按钮内容
m_edit.SetWindowText(TEXT("this is a test"));

//获取按钮的内容
CString str;
m_edit.GetWindowText(str);
MessageBox(str);

关联基本类型变量

  •  若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。
  • 但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新:
    • 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
    • 若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件

  • 在主对话框类OnInitDialog()中,完成相应代码测试:
m_e1 = 10.11;

UpdateData(FALSE); //FALSE说明把m_e1的值更新到对应的控件中

UpdateData(TRUE); //TRUE说明把控件的值更新到m_e1变量中

组合框(下拉框) CComboBox 

  •  常用属性设置:

属性

含义

data

设置内容,不同内容间用英文的分号“;”分隔

type

显示风格

Sort

True 内容自动排序

  • 常用接口:

CComboBox::AddString

组合框添加一个字符串

CComboBox::SetCurSel

设置当前选择项(当前显示第几项),下标从0开始

CComboBox::GetCurSel

获取组合框中当前选中项的下标

CComboBox::GetLBText

获取指定位置的内容

CComboBox::DeleteString

删除指定位置的字符串

CComboBox::InsertString

在指定位置插入字符串

  • 关联控件变量后,测试接口:

  •  示例:
m_cbx.AddString(TEXT("唐僧"));
m_cbx.AddString(TEXT("孙悟空"));
m_cbx.AddString(TEXT("猪八戒"));
m_cbx.AddString(TEXT("沙僧"));

//设置默认选项
m_cbx.SetCurSel(0);

//插入
m_cbx.InsertString(4, TEXT("白龙马"));

//删除
m_cbx.DeleteString(3);

//获取1号的索引的具体内容
CString str;
m_cbx.GetLBText(1, str);
MessageBox(str);
  • 获取选中下标并显示内容:
//拿到索引位置
int index = m_cbx.GetCurSel();

CString str;
m_cbx.GetLBText(index, str);

MessageBox(str);
  • 组合框常用的事件为:CBN_SELCHANGE,当选择组合框某一项时,自动触发此事件。

void CMFCApplication2Dlg::OnCbnSelchangeCombo1()
{
	// TODO:  在此添加控件通知处理程序代码
}

列表控件 CListCtrl

  •  常用属性设置:view -> Report(报表方式)

  •  常用接口:

接口

功能

CListCtrl::SetExtendedStyle

设置列表风格

CListCtrl::GetExtendedStyle

获取列表风格

CListCtrl::InsertColumn

插入某列内容,主要用于设置标题

CListCtrl::InsertItem

在某行插入新项内容

CListCtrl::SetItemText

设置某行某列的子项内容

CListCtrl::GetItemText

获取某行某列的内容

  • 关联控件变量后,测试接口:

  •  示例:
//设置风格样式
//LVS_EX_GRIDLINES 网格
//LVS_EX_FULLROWSELECT 选中整行
m_list.SetExtendedStyle(m_list.GetExtendedStyle()
	| LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

//插入标题
CString head[] = { TEXT("姓名"), TEXT("年龄"), TEXT("性别") };

//插入列
m_list.InsertColumn(0, head[0], LVCFMT_LEFT, 100);
m_list.InsertColumn(1, head[1], LVCFMT_LEFT, 100);
m_list.InsertColumn(2, head[2], LVCFMT_LEFT, 100);

//插入正文内容,先确定行,再确定列
for (int i = 0; i < 10; i++)
{
	CString str;
	str.Format(TEXT("张三_%d"), i );

	//确定行
	m_list.InsertItem(i, str);

	//设置列
	int j = 0;
	m_list.SetItemText(i, ++j, TEXT("男"));
	m_list.SetItemText(i, ++j, TEXT("23"));
}
  • 程序效果图:

树控件 CTreeCtrl

  •  常用属性设置:

属性

含义

has buttons

True 有展开按钮

has lines

True 有展开线

lines at root

True 有根节点

  • 常用接口:

接口

功能

AfxGetApp()

获取应用程序对象指针

CWinApp::LoadIcon

加载自定义图标

CImageList::Create

创建图像列表

CImageList::Add

图像列表追加图标

CTreeCtrl::SetImageList

设置图形状态列表

CTreeCtrl::InsertItem

插入节点

CTreeCtrl::SelectItem

设置默认选中项

CTreeCtrl::GetSelectedItem

获取选中项

CTreeCtrl::GetItemText

获取某项内容

  • 关联控件变量:

添加图标资源(icon)

  • 把ico资源文件放在项目res文件夹中

  •  资源视图 -> Icon -> 添加资源:

  •  导入ico文件

  •  通过代码加载图标
//1 、设置图标

//准备HICON图标
HICON icons[4];
icons[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
icons[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
icons[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
icons[3] = AfxGetApp()->LoadIconW(IDI_ICON4);

//CImageList list; //必须保存住这个集合 写到.h做成员属性

//创建图片集合
list.Create(30, 30, ILC_COLOR32, 4, 4);
//添加具体的图片
for (int i = 0; i < 4;i++)
{
	list.Add(icons[i]);
}
m_tree.SetImageList(&list, TVSIL_NORMAL);


//2 、设置节点
HTREEITEM root = m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
HTREEITEM parent = m_tree.InsertItem(TEXT("父节点"), 1, 1, root);
HTREEITEM sub1 = m_tree.InsertItem(TEXT("子节点1"), 2, 2, parent);
HTREEITEM sub2 = m_tree.InsertItem(TEXT("子节点2"), 3, 3, parent);

//设置默认选项
m_tree.SelectItem(sub1);
  • 树控件常用事件为:TVN_SELCHANGED,当选择某个节点时,自动触发此事件。

void CMy06CTreeCtrlDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO:  在此添加控件通知处理程序代码
	*pResult = 0;

	//获取当前项
	HTREEITEM item = m_tree.GetSelectedItem();

	CString name = m_tree.GetItemText(item);

	MessageBox(name);
}

标签控件 CTabCtrl

  •  在ui工具箱拖放 Tab Control

  • 把 TabSheet.h和TabSheet.cpp 放在项目文件同级目录,并且添加到工程目录中

  • 给ui上 Tab Control 关联Control类型(CTabSheet)

  •  添加对话框
    • a) 资源视图 -> Dialog -> 右击 -> 插入 Dialog
    • b) 设置相应属性:
      • Style -> Child (子窗口)
      • Border -> None (无边框)
    • c) 自定义类:点击对话框模板 -> 右击 -> 添加类(MyDlg1、MyDlg2)
    • d) 主对话框类中, 定义自定义类对象,需要相应头文件

  •  主对话框类中 OnInitDialog() 做初始化工作
//添加标签页
m_tab.AddPage(TEXT("系统设置"), &dlg1, IDD_DIALOG1);
m_tab.AddPage(TEXT("系统管理"), &dlg2, IDD_DIALOG2);
//显示
m_tab.Show();
  • 附:
  • TabSheet.h:
#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.cpp:
// 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);
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值