MFC让组合框有下拉列表菜单的功能

先上一张效果图

实现,自己写一个类,继承CComboBox;

然后给这个类添加响应函数即可,要写的函数有OnLButtonDown和OnMenuCommand

class CMyFileTreeComboBox :public CComboBox
{
public:
	CMyFileTreeComboBox(void);
	~CMyFileTreeComboBox(void);
	DECLARE_MESSAGE_MAP()
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnMenuCommand(UINT nID);
private:
	CMenu m_menu;
};

实现

#define IDC_PROJECT_COMBO	0
#define ID_NEW_PROJECT		1
#define ID_OPEN_PROJECT		2
#define ID_SAVE_PROJECT     3
#define ID_SET_PROJECT		4 
#define ID_RECENT1			5
#define ID_RECENT2			6
#define ID_RECENT3			7
#define ID_RECENT4			8
#define ID_RECENT5			9
#define ID_RECENT6			10
#define ID_RECENT7			11
#define ID_RECENT8			12
#define ID_CUR_PROJECT		13
CMyFileTreeComboBox::CMyFileTreeComboBox(void)
{
}
CMyFileTreeComboBox::~CMyFileTreeComboBox(void)
{
	if(m_menu.m_hMenu)
	{
		m_menu.DestroyMenu();
	}
}
BEGIN_MESSAGE_MAP(CMyFileTreeComboBox, CComboBox)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND_RANGE(IDC_PROJECT_COMBO, IDC_PROJECT_COMBO+100, OnMenuCommand)
END_MESSAGE_MAP()
void CMyFileTreeComboBox::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (m_menu.m_hMenu == NULL)
	{
		HMENU hMenu = ::CreateMenu();
		for (int i=0; i<8; i++)
		{
			
			CString szRecent;
			szRecent.Format(_T("工程%d"), i);
			AppendMenu(hMenu, MF_POPUP | MF_STRING, ID_RECENT1+i, szRecent);
		}
		m_menu.CreatePopupMenu();
		CString szCur;
		GetWindowText(szCur);
		if (szCur != _T(""))
		{
			m_menu.AppendMenu(MF_CHECKED, ID_CUR_PROJECT, szCur);
			m_menu.AppendMenu(MF_SEPARATOR);
		}
		m_menu.AppendMenu(MF_STRING, ID_NEW_PROJECT, _T("新建工程..."));
		m_menu.AppendMenu(MF_STRING, ID_OPEN_PROJECT, _T("打开工程..."));
		m_menu.AppendMenu(MF_POPUP, (UINT_PTR)hMenu, _T("最近工程"));
		m_menu.AppendMenu(MF_SEPARATOR);
		m_menu.AppendMenu(MF_STRING, ID_SAVE_PROJECT, _T("保存工程"));
		m_menu.AppendMenu(MF_STRING, ID_SET_PROJECT, _T("工程设置..."));
	}
	CRect rect;
	GetClientRect(rect);
	ClientToScreen(&rect);

	m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
		rect.TopLeft().x, rect.BottomRight().y-2, this, NULL);
}
void CMyFileTreeComboBox::OnMenuCommand(UINT id)
{
	switch(id)
	{
	case ID_OPEN_PROJECT: // 打开
		MessageBox(_T("打开"));
		break;
	case ID_NEW_PROJECT: // 新建
		MessageBox(_T("新建"));
		break;
	case ID_SET_PROJECT: // 设置
		MessageBox(_T("设置"));
		break;
	case ID_SAVE_PROJECT: // 保存
		MessageBox(_T("保存"));
		break;
	case ID_RECENT1: // 最近工程
	case ID_RECENT2:
	case ID_RECENT3:
	case ID_RECENT4:
	case ID_RECENT5:
	case ID_RECENT6:
	case ID_RECENT7:
	case ID_RECENT8:
		MessageBox(_T("最近工程"));
		break;
	}
}
写好这个类后,在主对话框中添加该类的对象  CMyFileTreeComboBox m_combox;

在初始化函数中添加如下代码:

	// 创建combox
	CRect rect;
	rect.top = 0;
	rect.bottom = rect.top + 22;
	rect.left = 4;
	rect.right = rect.left + 100;
	m_combox.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWNLIST, rect, this, IDC_MY_COMBO);
	//m_combox.SetFont(..);
	m_combox.AddString(_T("pro now"));
	m_combox.SetCurSel(0);
然后就OK了。

其实里面很多还不知道具体含义,要查MSDN才知道。一般都是显示格式风格什么的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值