提示窗口

摘自:http://www.codeproject.com/Articles/187753/Extended-CComboBox

// ComboBoxExt.h  

#if !defined(AFX_COMBOBOXEXTLIST_H__2AC610D5_4FCB_490A_9D15_1B47894B943D__INCLUDED_)

#define AFX_COMBOBOXEXTLIST_H__2AC610D5_4FCB_490A_9D15_1B47894B943D__INCLUDED_


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


/
// CComboBoxExtList window


class CComboBoxExt;
class CComboBoxExtList : public CListBox
{
// Construction
public:
CComboBoxExtList();


// Attributes
public:
BOOL m_bShowTooltip;
BOOL m_bTooltipOnInfo;
BOOL m_bShowListTooltipOverItem; // this has meaning only when m_bTooltipOnInfo == TRUE
CComboBoxExt* m_pComboBox;


// Operations
public:


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CComboBoxExtList)
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL


// Implementation
public:
virtual ~CComboBoxExtList();


protected:
int m_nPrevItem;
BOOL m_bToolActive;
HWND m_hWndToolTip;
TOOLINFO m_ToolInfo;


// Generated message map functions
protected:
//{{AFX_MSG(CComboBoxExtList)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
afx_msg LRESULT OnLbFindString(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};


/


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


#endif // !defined(AFX_COMBOBOXEXTLIST_H__2AC610D5_4FCB_490A_9D15_1B47894B943D__INCLUDED_)



//

// CPP

// ComboBoxExtList.cpp : implementation file
//


#include "stdafx.h"
#include "ComboBoxExt.h"


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


/
// CComboBoxExtList


CComboBoxExtList::CComboBoxExtList()
:m_bShowTooltip(TRUE)
,m_bTooltipOnInfo(FALSE)
,m_bShowListTooltipOverItem(FALSE)
,m_bToolActive(FALSE)
,m_nPrevItem(-1)
{
}


CComboBoxExtList::~CComboBoxExtList()
{
}




BEGIN_MESSAGE_MAP(CComboBoxExtList, CListBox)
//{{AFX_MSG_MAP(CComboBoxExtList)
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_MESSAGE(LB_FINDSTRING, CComboBoxExtList::OnLbFindString)
END_MESSAGE_MAP()


/
// CComboBoxExtList message handlers


void CComboBoxExtList::PreSubclassWindow() 
{
// TODO: Add your specialized code here and/or call the base class


// create tooltip
m_hWndToolTip = ::CreateWindowEx(WS_EX_TOPMOST, 
 TOOLTIPS_CLASS, 
 NULL, 
 TTS_NOPREFIX | TTS_ALWAYSTIP, 
 CW_USEDEFAULT, 
 CW_USEDEFAULT, 
 CW_USEDEFAULT, 
 CW_USEDEFAULT, 
 NULL, 
 NULL, 
 NULL, 
 NULL);
ASSERT(m_hWndToolTip);
// initialize toolinfo struct
memset(&m_ToolInfo, 0, sizeof(m_ToolInfo));
m_ToolInfo.cbSize = sizeof(m_ToolInfo);
m_ToolInfo.uFlags = TTF_TRACK | TTF_TRANSPARENT;
m_ToolInfo.hwnd = m_hWnd;
::SendMessage(m_hWndToolTip, TTM_SETMAXTIPWIDTH, (WPARAM)0, (LPARAM)SHRT_MAX);
::SendMessage(m_hWndToolTip, TTM_ADDTOOL, (WPARAM)0, (LPARAM)(LPTOOLINFO)&m_ToolInfo);


CListBox::PreSubclassWindow();
}


LRESULT CComboBoxExtList::OnLbFindString(WPARAM wParam, LPARAM lParam)
{
return SendMessage(LB_FINDSTRINGEXACT, wParam, lParam);
}


void CComboBoxExtList::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default


CListBox::OnMouseMove(nFlags, point);


if(NULL == m_pComboBox || ! m_bShowTooltip)
return;


CRect rectClient;
GetClientRect(&rectClient);


if(rectClient.PtInRect(point))
{
CPoint pointScreen;
::GetCursorPos(&pointScreen);
BOOL bOutside = FALSE;
int nItem = ItemFromPoint(point, bOutside);  // calculate listbox item number (if any)


if(! bOutside && nItem >= 0 && m_nPrevItem != nItem)
{
m_nPrevItem = nItem;
m_bToolActive = FALSE;


CString sText;
if(! m_bTooltipOnInfo)
GetText(nItem, sText);
else
m_pComboBox->GetLBInfo(nItem, sText);
m_ToolInfo.lpszText = (LPTSTR)(LPCTSTR)sText;


CRect rect;
GetItemRect(nItem, &rect);
ClientToScreen(&rect);


if(! m_bTooltipOnInfo)
{
HDC hDC = ::GetDC(m_hWnd);
ASSERT(hDC);
CFont* pFont = GetFont();
HFONT hOldFont = (HFONT)::SelectObject(hDC, (HFONT)*pFont);
SIZE size;
::GetTextExtentPoint32(hDC, sText, sText.GetLength(), &size);
::SelectObject(hDC, hOldFont);
::ReleaseDC(m_hWnd, hDC);


if(! m_bToolActive && size.cx > rect.Width() - 3)
{
::SendMessage(m_hWndToolTip, TTM_UPDATETIPTEXT, (WPARAM)0, (LPARAM)&m_ToolInfo);
::SendMessage(m_hWndToolTip, TTM_TRACKPOSITION, (WPARAM)0, (LPARAM)MAKELONG(rect.left, rect.top));
::SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)(LPTOOLINFO)&m_ToolInfo);
m_bToolActive = TRUE;
}
else
{
::SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)(LPTOOLINFO)&m_ToolInfo);
m_bToolActive = FALSE;
SetTimer(1, 80, NULL);
}
}
else // tooltip text is retrieved from additional info
{
if(! m_bToolActive && m_pComboBox->GetLBShowItemTooltipState(nItem) && ! sText.IsEmpty())
{
::SendMessage(m_hWndToolTip, TTM_UPDATETIPTEXT, (WPARAM)0, (LPARAM)&m_ToolInfo);
::SendMessage(m_hWndToolTip, TTM_TRACKPOSITION, (WPARAM)0, (LPARAM)MAKELONG(m_bShowListTooltipOverItem ? rect.left : rect.right + 1, rect.top));
::SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)(LPTOOLINFO)&m_ToolInfo);
m_bToolActive = TRUE;
}
else
{
::SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)(LPTOOLINFO)&m_ToolInfo);
m_bToolActive = FALSE;
SetTimer(1, 80, NULL);
}
}
}
}
else
{
::SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)(LPTOOLINFO)&m_ToolInfo);
m_bToolActive = FALSE;
m_nPrevItem = -1;
SetTimer(1, 80, NULL);
}
}


void CComboBoxExtList::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default


CListBox::OnTimer(nIDEvent);


CPoint point;
::GetCursorPos(&point);
ScreenToClient(&point);


CRect rectClient;
GetClientRect(&rectClient);


if(! rectClient.PtInRect(point) || 0 == (GetStyle() & WS_VISIBLE))
{
KillTimer(nIDEvent);
::SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)(LPTOOLINFO)&m_ToolInfo);
m_bToolActive = FALSE;
m_nPrevItem = -1;
}
}



http://msdn.microsoft.com/en-us/library/windows/desktop/bb760421(v=vs.85).aspx

一个很好的提示窗口参考,同时对于重绘列表控件时,未能完全显示的部分,可以采用提示窗口显示

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值