我们建立一个开始不带工具条和状态栏的工程。然后手工加入工具条、状态栏和工具提示
1、利用MFC向导创建一个名为CCControlBarDemo的基于对话框的工程
2、在CCControlBarDemoDlg.h文件的头部加入如下的常量定义。
//===============================================
//=======自定义状态栏、工具条和工具提示的命令消息
#define IDC_STATUS 100
#define IDC_TOOLBAR 102
#define IDC_BUTTON1 103
#define IDC_BUTTON2 104
#define IDC_BUTTON3 105
3、在CCControlBarDemoDlg类中添加如下的保护型变量。
protected:
HICON m_hIcon;
//首先在对话框窗口成员函数中声明工具条、按钮、状态条的对象
TBBUTTON m_bt[3]; //create按钮对象数组
CToolTipCtrl m_ctlMyToolTip; //Create工具提示对象
CStatusBarCtrl m_ctlMyStatusBar; //创建状态条对象
CToolBarCtrl m_ctlMyToolBar; //创建工具条对象
4、在CCControlBarDemoDlg类的构造函数中添加如下代码来初始化TBBUTTON结构变量即初始化三个按钮:
CCCControlBarDemoDlg::CCCControlBarDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCCControlBarDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCCControlBarDemoDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//初始化对话框上的三个按钮
for(int i=0;i<3;i++)
{
m_bt[i].dwData=0;
m_bt[i].fsState=TBSTATE_ENABLED;
m_bt[i].fsStyle=TBSTYLE_BUTTON;
m_bt[i].iBitmap=NULL;
m_bt[i].iString=i;
}
//把按钮ID名关联到对话框对象上
m_bt[0].idCommand=IDC_BUTTON1;
m_bt[1].idCommand=IDC_BUTTON2;
m_bt[2].idCommand=IDC_BUTTON3;
}
5、在CCControlBarDemoDlg类的OnInitDialog()函数中添加如下的代码以创建工具条状态栏和工具提示栏:
BOOL CCCControlBarDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//===============================================
//==================创建状态栏===================
if(!m_ctlMyStatusBar.Create(WS_CHILD|CCS_BOTTOM|WS_VISIBLE|SBARS_SIZEGRIP,CRect(0,0,0,0),this,IDC_STATUS))
{
TRACE0("创建状态栏失败\n");
return 0;
}
//================================================
//===============创建单个状态栏窗格===============
int nRight=-1;
m_ctlMyStatusBar.SetParts(1,&nRight);
//================================================
//===================创建工具条===================
if(!m_ctlMyToolBar.Create(WS_BORDER|WS_VISIBLE|WS_CHILD|CCS_TOP|CCS_ADJUSTABLE|TBSTYLE_TOOLTIPS,CRect(0,0,0,0),this,IDC_TOOLBAR))
{
TRACE0("创建工具条失败\n");
return 0;
}
LPCTSTR lpszString=_T("Button1\0Button2 \0Button3 \0\0");
m_ctlMyToolBar.AddStrings(lpszString);//工具条文本
m_ctlMyToolBar.AddButtons(3,m_bt);//添加按钮数组对象,有三个按钮
m_ctlMyToolBar.AutoSize();
m_ctlMyToolBar.SetRedraw();
//=================================================
//===================创建工具提示==================
if(!m_ctlMyToolTip.Create(this,TTS_ALWAYSTIP|WS_CHILD|WS_VISIBLE))
{
TRACE0("创建工具提示失败\n");
return 0;
}
m_ctlMyToolTip.Activate(TRUE); //激活工具提示栏
return TRUE; // return TRUE unless you set the focus to a control
}
6、为工具提示栏添加TTN_NEEDTEXT消息的处理器。首先在CCControlBarDemoDlg类的头文件中的DECLARE_MESSAGE_MAP()宏之间添加如下代码:
BOOL OnToolTipNotify(UINT id,NMHDR * pTTTStruct,LRESULT * pResult);
在CCControlBarDemoDlg类的实现文件中的BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏之间添加如下代码:
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipNotify)
在CCControlBarDemoDlg类中添加OnToolTipNotify()函数的实现代码:
BOOL CCCControlBarDemoDlg::OnToolTipNotify(UINT id, NMHDR *pTTTStruct, LRESULT *pResult)
{
TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pTTTStruct;
UINT nID=pTTTStruct->idFrom;
if(pTTT->uFlags&TTF_IDISHWND)
{
nID=::GetDlgCtrlID((HWND)nID);
if(nID==0)
return FALSE;
}
switch(nID)
{
case IDC_BUTTON1:
pTTT->lpszText="Button1"; //在工具提示栏上显示字符串“Button1”。
break;
case IDC_BUTTON2:
pTTT->lpszText="Button2";
break;
case IDC_BUTTON3:
pTTT->lpszText="Button3";
break;
}
return TRUE;
}
7、在CCControlBarDemoDlg类中添加WM_MOUSEMOVE消息处理函数,并在其中添加如下代码:
//==============================================
//===========鼠标移动函数=======================
void CCCControlBarDemoDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
str.Format("Cursor Position:%ld,%ld",point.x,point.y);
m_ctlMyStatusBar.SetText(str,0,SBT_NOBORDERS);
CDialog::OnMouseMove(nFlags, point);
}
8、最后为工具条上的三个按钮ID_BUTTON1、ID_BUTTON2和ID_BUTTON3定义消息处理函数
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnButton3();
在BEGIN_MESSAGE_MP()和END_MESSAGE_MAP()宏之间添加如下代码:
ON_COMMAND(IDC_BUTTON1,OnButton1)
ON_COMMAND(IDC_BUTTON2,OnButton2)
ON_COMMAND(IDC_BUTTON3,OnButton3)
在CCControlBarDemoDlg类中添加三个按钮的处理函数:
//================================================
//============按钮处理函数========================
void CCCControlBarDemoDlg::OnButton1()
{
AfxMessageBox("你按下了工具条的第一个按钮!");
}
void CCCControlBarDemoDlg::OnButton2()
{
AfxMessageBox("你按下了工具条的第二个按钮!");
}
void CCCControlBarDemoDlg::OnButton3()
{
AfxMessageBox("你按下了工具条的第三个按钮!");
}
9、现在可以编译运行程序了。