⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiplistctrl.cpp

📁 类似vc的集成开发环境
💻 CPP
字号:
// TipListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "c02ide.h"
#include "TipListCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MYTIP_NAME "multi_tip"
#define TIMER_INITIAL 1
#define TIMER_AUTOPOP 4
#define TIMER_RESHOW 3
#define ID_BTN_TIP 152

/////////////////////////////////////////////////////////////////////////////
// CTipListCtrl dialog


CTipListCtrl::CTipListCtrl(CWnd* pParent /*=NULL*/)
	: CDialog(CTipListCtrl::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTipListCtrl)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
		m_nTimeAutoPop=2000;
	m_nTimeReShow=100;
	m_nTimeInitial=800;

	m_bTimerInitial=FALSE;
	m_bTimerPop=FALSE;
	

	m_hCurWnd=NULL;
	m_crBg=::GetSysColor(COLOR_INFOBK);
	m_crText=::GetSysColor(COLOR_INFOTEXT);
	m_rcMargin.bottom=m_rcMargin.top=m_rcMargin.left=m_rcMargin.right=0;


}


void CTipListCtrl::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTipListCtrl)
	DDX_Control(pDX, IDC_LIST_TIP, m_ListCtrlTip);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTipListCtrl, CDialog)
	//{{AFX_MSG_MAP(CTipListCtrl)
	ON_WM_PAINT()
	ON_WM_DESTROY()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTipListCtrl message handlers

void CTipListCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
/*	CRect rc;

	GetClientRect(&rc);
	HGDIOBJ	hGdi=GetStockObject(ANSI_FIXED_FONT);//选择等宽字体
	dc.SelectObject(hGdi);
	
	//填充背景色
	dc.FillSolidRect(&rc,m_crBg);

	//绘边框
	rc.bottom--;
	rc.right--;
	dc.MoveTo(rc.left,rc.top);
	dc.LineTo(rc.right,rc.top);
	dc.LineTo(rc.right,rc.bottom);
	dc.LineTo(rc.left,rc.bottom);
	dc.LineTo(rc.left,rc.top);

	
	//保留区域
	rc.top++;
	rc.left++;
	rc.right--;
	rc.bottom--;
	//用户定义之页边距
	rc.top+=m_rcMargin.top;
	rc.bottom-=m_rcMargin.bottom;
	rc.left+=m_rcMargin.left;
	rc.right-=m_rcMargin.right;
	dc.SetTextColor(m_crText);
	
	dc.DrawText(m_strText,strlen(m_strText),&rc,0);
*/	
	// Do not call CDialog::OnPaint() for painting messages
}

void CTipListCtrl::Show()
{

	CMDIFrameWnd * nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;	
	CMDIChildWnd *nowchild = nowframe->MDIGetActive();
//	CChildFrame *nowchild = (CChildFrame *)nowframe->MDIGetActive();
   	CCrystalTextView *m_pchildview = (CCrystalTextView *)nowchild->GetActiveView();

	CCrystalEditView *m_pchildeditview = (CCrystalEditView *)nowchild->GetActiveView();
	CPoint mpt;
	GetCursorPos(&mpt);
	CRect m_rect(0,0,0,0);
	m_pchildview->GetWindowRect(m_rect);
//	if(!m_rect.PtInRect(mpt))
//		return;

	GetCursorPos(&mpt);
//	GetWindowRect(m_rect);
//	if(m_rect.PtInRect(mpt))
//		return;


//	if(!m_hCurWnd)
//		return;



//	int len=strlen(m_strText);
//	if (len==0) 
//	{
//		Hide();
//		return;
//	}



	CPoint pt;
	CSize sz;

	::GetCaretPos(&pt);
//	GetCursorPos(&pt);
//	ClientToScreen( &pt );
//	pt.x+=::GetSystemMetrics(SM_CXCURSOR)/2;//为避免光标遮住tip,本应获得光标热点与大小,再计算显示位置
//	pt.y+=::GetSystemMetrics(SM_CYCURSOR)/2;//但晓月儿查遍MSDN不知如何获得当前光标大小和热点位置,只好如此
//	sz.cx=sz.cx+20;
//	sz.cy=sz.cy;
//	CRichEditCtrl * m_edit=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT);
	CRect mrect(0,0,0,0);
//	m_edit->GetWindowRect(mrect);

	pt.x=pt.x+m_rect.left;
	pt.y=pt.y+m_rect.top;
//	sz.cx=mrect.right-mrect.left;
//	sz.cy=mrect.bottom-mrect.top;
	
//	 mrect.left=0;//0;//pt.x;
//	 mrect.top=0;//0;//pt.y;

	 sz.cx=120;
	 sz.cy=220;
//	 mrect.right=sz.cx;
//	 mrect.bottom=sz.cy;
//	m_edit->SetRect(mrect);
//	 m_edit->MoveWindow(mrect);
	 CScrollBar * p_scrollctrl=NULL;
//	 p_scrollctrl=m_ListCtrlTip->GetScrollBarCtrl(SB_VERT);

	 if(p_scrollctrl!=NULL&&m_ListCtrlTip.GetScrollPos(SB_VERT)==0)
	 {
	   p_scrollctrl->GetWindowRect(mrect);
	   sz.cx+=mrect.right-mrect.left;
	 }
//	 sz.cy+=18;
	MoveWindow(pt.x,pt.y,sz.cx,sz.cy);//


	//m_edit->MoveWindow(pt.x,pt.y,sz.cx,sz.cy);
//	ShowWindow(SW_SHOWNOACTIVATE);
	ShowWindow(SW_SHOW);
	UpdateWindow();


		
}

BOOL CTipListCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	BOOL bRet=CDialog::Create(IDD, pParentWnd);

		if(bRet)
	{
		SetOwner(pParentWnd);
		CRect rc(0,0,0,0);
	}	

		return bRet;
}

void CTipListCtrl::SetDelayTime(UINT nDelay)
{
	m_nTimeAutoPop=nDelay;
	m_nTimeReShow=nDelay;
	m_nTimeInitial=nDelay;	
}

void CTipListCtrl::SetDelayTime(DWORD dwDuration, int iTime)
{
	switch(dwDuration)
	{
	case TTDT_AUTOPOP:
		m_nTimeAutoPop=iTime;
		break;
	case TTDT_RESHOW:
		m_nTimeReShow=iTime;
		break;
	case TTDT_INITIAL:
		m_nTimeInitial=iTime;
		break;
	}
}

BOOL CTipListCtrl::AddTool(CWnd *pWnd, LPCTSTR lpszText)
{
	char *pText;
	if(m_map.Lookup(pWnd->GetSafeHwnd(),(void*&)pText))
	{
		m_map.RemoveKey(pWnd->GetSafeHwnd());
		if(pText!=LPSTR_TEXTCALLBACK)
			delete []pText;
	}
	
	if(lpszText==LPSTR_TEXTCALLBACK)
	{
		m_map.SetAt(pWnd->GetSafeHwnd(),(void*)lpszText);
	}
	else
	{
		pText=new char[strlen(lpszText)+1];
		ASSERT(pText);
		strcpy(pText,lpszText);
		m_map.SetAt(pWnd->GetSafeHwnd(),pText);
	}
	
	


	return TRUE;

}

int CTipListCtrl::GetDelayTime(DWORD dwDuration) const
{
	switch(dwDuration)
	{
	case TTDT_AUTOPOP:
		return	m_nTimeAutoPop;
		break;
	case TTDT_RESHOW:
		return m_nTimeReShow;
		break;
	case TTDT_INITIAL:
		return m_nTimeInitial;
	default:
		return 0;
		break;
	}
}

void CTipListCtrl::Hide()
{
	if(m_bTimerInitial)//OnTimer(1)还未执行
	{
		KillTimer(TIMER_INITIAL);
		m_bTimerInitial=FALSE;
	}


	if(IsWindowVisible())
	{
		ShowWindow(SW_HIDE);
		KillTimer(TIMER_AUTOPOP);
		m_bTimerPop=FALSE;//m_bTimerPop为True必在OnTimer(TIMER_INITIAL)之后
		//窗口必然可见
	}

	
}

void CTipListCtrl::RelayEvent(LPMSG lpMsg)
{
		CMDIFrameWnd * nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;	
	CMDIChildWnd *nowchild = nowframe->MDIGetActive();
//	CChildFrame *nowchild = (CChildFrame *)nowframe->MDIGetActive();
   	CCrystalTextView *m_pchildview = (CCrystalTextView *)nowchild->GetActiveView();

	CCrystalEditView *m_pchildeditview = (CCrystalEditView *)nowchild->GetActiveView();
	CPoint pt;
	::GetCursorPos(&pt);
	CRect m_rect(0,0,0,0);
//	m_pchildview->GetWindowRect(m_rect);
//	if(!m_rect.PtInRect(pt))
//		return;
	GetWindowRect(m_rect);
	if(m_rect.PtInRect(pt)&&IsWindowVisible())
		return;


	char *pText;//,*ppreText;

	static CPoint ptLast(lpMsg->pt);

	CRichEditCtrl * m_edit=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT);
//	m_edit->GetWindowText("adf\nliu\nkll\niii\nlimi\ning");

	CString str_text;
	m_edit->GetWindowText(str_text);
	pText=(char *)(LPCSTR)str_text;//(LPCSTR)
	if(!m_map.Lookup(m_pchildview->GetSafeHwnd(),(void*&)pText))
	   AddTool(m_pchildview,pText);
//	m_map.Lookup(m_pchildview->GetSafeHwnd(),(void*&)pText)
//	 else if(pText!=ppreText)
//	  {
//		  DelTool(m_pchildview);
//		  AddTool(m_pchildview,pText);
//	  }

	if(lpMsg->hwnd==m_hWnd)//||lpMsg->hwnd==m_btn.m_hWnd)
		return;
	switch(lpMsg->message)
	{
	case WM_LBUTTONDOWN:
	case WM_LBUTTONUP:
	case WM_RBUTTONDOWN:
	case WM_MBUTTONDOWN:
	case WM_RBUTTONUP:
	case WM_MBUTTONUP:
		Hide();
		break;
	case WM_MOUSEMOVE:
		{




		if(lpMsg->pt.x=ptLast.x&&lpMsg->pt.y==ptLast.y)//不知道为什么
			 	return;//鼠标不动还有WM_MOUSEMOVE消息只好这样屏蔽
		//TRACE("\nMouseMove x:%d,y:%d",lpMsg->pt.x,lpMsg->pt.y);
		//活动子窗口指针
	
//		m_map.GetStartPosition;
		if(m_hCurWnd==NULL)//当前工具窗口为空
		{
			if(m_map.Lookup(lpMsg->hwnd,(void*&)pText))//鼠标在工具窗口内
			{
				//设置初始化Timer和m_hCurWnd
				m_hCurWnd=lpMsg->hwnd;
				SetTimer(TIMER_INITIAL,m_nTimeInitial,NULL);
				m_bTimerInitial=TRUE;
			}
		}
		else
		{
			if(m_hCurWnd==lpMsg->hwnd)
			{
				//在当前工具窗口内移动
				if(!m_bTimerInitial)//还没有显示
				{
					//则重置初始化Timer
					KillTimer(TIMER_INITIAL);
					SetTimer(TIMER_INITIAL,m_nTimeInitial,NULL);
				}
				//否则已显示则不做任何动作
			}
			else
			{
				//移到当前工具窗口外则重置
				Hide();
				m_hCurWnd=NULL;
			}
		}
		}
		break;
	default:
		break;

	}
	ptLast=lpMsg->pt;
}

void CTipListCtrl::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	TRACE("\nnIDEvent:%d",nIDEvent);
	switch(nIDEvent)
	{
	case TIMER_INITIAL:
		Show();
		KillTimer(TIMER_INITIAL);
		m_bTimerInitial=FALSE;
		SetTimer(TIMER_AUTOPOP,m_nTimeAutoPop,NULL);
		m_bTimerPop=TRUE;
		break;
	case TIMER_AUTOPOP:
		Hide();
		break;
	}
	CDialog::OnTimer(nIDEvent);
	//CWnd::OnTimer(nIDEvent);
}


void CTipListCtrl::OnDestroy() 
{

	if(m_bTimerInitial)
		KillTimer(TIMER_INITIAL);
	if(m_bTimerPop)
		KillTimer(TIMER_AUTOPOP);

	char *pText;
	HWND hwnd;
	for (POSITION pos = m_map.GetStartPosition(); pos != NULL;)
	{
		m_map.GetNextAssoc(pos,(void*&)hwnd,(void*&)pText);
		if(pText!=LPSTR_TEXTCALLBACK)
		{
			delete []pText;
		}
	}

	m_map.RemoveAll();

	CDialog::OnDestroy();

	
	// TODO: Add your message handler code here
	
}

void CTipListCtrl::DelTool(CWnd *pWnd)
{
	char *pText;
	if(m_map.Lookup(pWnd->GetSafeHwnd(),(void*&)pText))
	{
		m_map.RemoveKey(pWnd->GetSafeHwnd());
		if(pText!=LPSTR_TEXTCALLBACK)
			delete []pText;

		if(pWnd->GetSafeHwnd()==m_hCurWnd)
			Hide();
	}
}

void CTipListCtrl::SetTipTextColor(COLORREF clr)
{
	m_crText=clr;
}

void CTipListCtrl::SetTipBkColor(COLORREF clr)
{
	m_crBg=clr;
}

COLORREF CTipListCtrl::GetTipBkColor() const
{
	return m_crBg;
}

COLORREF CTipListCtrl::GetTipTextColor() const
{
	return m_crText;
}

void CTipListCtrl::SetMargin(LPRECT lprc)
{
	m_rcMargin.CopyRect(lprc);
}

void CTipListCtrl::GetMargin(LPRECT lprc) const
{
	::CopyRect(lprc,&m_rcMargin);
	
}

BOOL CTipListCtrl::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
 /* 	TCHAR rgtsz[4][10] = {_T("Column 1"), _T("Column 2"), _T("Column 3"), _T("Column 4")};

	LV_ITEM			lvitem;
	LV_COLUMN		lvcolumn;
	CRect rect;
	m_ListCtrlTip.GetWindowRect( &rect );

	// Insert Image Lists
	m_pImageList = new CImageList();
	m_pImageList->Create( IDB_BITMAP_TIP, 16, 1, RGB(255,255,255) );

	m_ListCtrlTip.SetImageList( m_pImageList, LVSIL_SMALL );

	// Insert columns using the order field
	int i;
	for(i = 0; i < 2; i++)  
		{
			lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
		lvcolumn.fmt = LVCFMT_LEFT;
		lvcolumn.pszText = rgtsz[i];
		lvcolumn.iSubItem = i;
		lvcolumn.iOrder = i;
		lvcolumn.cx = rect.Width() / 4;  
		m_ListCtrlTip.InsertColumn(i, &lvcolumn);  
		}


	int iItem, iSubItem, iActualItem;
	TCHAR buffer[30];
	
	for (iItem = 0; iItem < 50; iItem++)  // will now insert the items and subitems into the list view.
		for (iSubItem = 0; iSubItem < 4; iSubItem++)
		{
			lvitem.mask = LVIF_TEXT | (iSubItem == 0? LVIF_IMAGE : 0);
			lvitem.iItem = (iSubItem == 0)? iItem : iActualItem;
			lvitem.iSubItem = iSubItem;
			lvitem.iImage = (iItem%2)?0:2;
  	sprintf( buffer, "", iItem+1, iSubItem+1);
//			buffer="";
			lvitem.pszText = buffer;

			if (iSubItem == 0)
				iActualItem = m_ListCtrlTip.InsertItem(&lvitem);
			else
				m_ListCtrlTip.SetItem(&lvitem);
		}



*/


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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -