先上一张效果图
实现,自己写一个类,继承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才知道。一般都是显示格式风格什么的。