📄 tiplistctrl.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 + -