高分求解菜问题!!如何在MFC对话框程序里加入工具栏,并且使工具栏实现ToolTip功能???(就是鼠标放在工具栏按钮上会跳出一个提示小标签)

moony_blue 2001-05-28 11:28:00
我在OnInitDialog()加入:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD ¦ WS_VISIBLE ¦ CBRS_TOP
¦ CBRS_TOOLTIPS ¦ CBRS_FLYBY ¦ CBRS_SIZE_DYNAMIC) ¦¦
!m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

//......后面的代码是把所有控件向下移动到正确的位置

问题是:工具栏的显示与使用都正常,但是就出现不了ToolTip提示,这是为什么??

...全文
223 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
i760 2001-05-28
gz
回复
moony_blue 2001-05-28
还有别的办法吗??vc真是麻烦!
回复
moony_blue 2001-05-28
CToolTipCtrl如何使用?
回复
wuqingguo 2001-05-28
派生CToolBarCtrl,自己处理消息TTN_NEEDTEXT。参见MSDN。
另外:CToolBarCtrl::SetToolTips可能有用。


回复
moony_blue 2001-05-28
怎么没人回答?
回复
moony_blue 2001-05-28
:)
回复
moony_blue 2001-05-28
OK!
45分都给你!
回复
moony_blue 2001-05-28
太好了,我试试!
回复
seesi 2001-05-28
//简单啊
//处理TTN_NEEDTEXTW和TTN_NEEDTEXTA消息就行了


#if !defined(AFX_DLG_H__2D7322B4_958B_11D4_BF5A_005004BE6DF9__INCLUDED_)
#define AFX_DLG_H__2D7322B4_958B_11D4_BF5A_005004BE6DF9__INCLUDED_

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

/////////////////////////////////////////////////////////////////////////////
// CDlg dialog

class CDlg : public CDialog
{
// Construction
public:
CToolBar m_wndtoolbar;
CDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CDlg)
enum { IDD = IDD_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
//}}AFX_MSG
afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};

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

#endif // !defined(AFX_DLG_H__2D7322B4_958B_11D4_BF5A_005004BE6DF9__INCLUDED_)



// Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "DlgToolBar.h"
#include "Dlg.h"

//#include <afxpriv.h>

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

/////////////////////////////////////////////////////////////////////////////
// CDlg dialog


CDlg::CDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}


void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlg, CDialog)
//{{AFX_MSG_MAP(CDlg)
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xffff, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xffff, OnToolTipText)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlg message handlers

BOOL CDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
// add the toolbar.
if (!m_wndtoolbar.Create( this ) ||
!m_wndtoolbar.LoadToolBar(IDR_MAINFRAME) )
{
TRACE0("failed to create toolbar\n");
return -1; // fail to create
}

// todo: remove this if you don't want tool tips or a resizeable toolbar
m_wndtoolbar.SetBarStyle(m_wndtoolbar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY );

// we need to resize the dialog to make room for control bars.
// 首先计算工具条大小
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,
0, CWnd::reposQuery, rcClientNow);

// 然后调整对话框中各控件相关位置,使工具条插入后不受影响
CPoint ptOffset(rcClientNow.left - rcClientStart.left,
rcClientNow.top - rcClientStart.top);

CRect rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);
while (pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow();
}

// 调整对话框窗口位置
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, false);

// 最后定位工具条
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);

// if (GetRoutingFrame() != NULL) return FALSE;

// UNICODE消息
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
//TCHAR szFullText[512];
CString strTipText;
UINT nID = pNMHDR->idFrom;

if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom为工具条的HWND
nID = ::GetDlgCtrlID((HWND)nID);
}

if (nID != 0) //不为分隔符
{
//AfxLoadString(nID, szFullText);
//strTipText=szFullText;
strTipText.LoadString(nID);
strTipText = strTipText.Mid(strTipText.Find('\n',0)+1);

#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
{
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
}
else
{
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
{
_wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
}
else
{
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#endif

*pResult = 0;

// 使工具条提示窗口在最上面
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
//return TRUE;
}



void CDlg::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
dc.FillSolidRect(rect, RGB(255,0,255));
}
回复
wuqingguo 2001-05-28
到MSDN中查查CToolBarCtrl::SetToolTips吧,顺便看看CToolTipCtrl,你就知道怎样用了。
回复
moony_blue 2001-05-28
关注
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-05-28 11:28
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……