初步决定用 GetTickCount来记时。当停留时间达到100毫秒时,提示:
AfxMessageBox("你已经停留了100毫秒了!");
AfxMessageBox("你已经停留了100毫秒了!");
解决方案 »
- stl map insert()操作后map中的地址和我要插入的地址不一致
- 想深入一点学MFC,该朝哪个方向呢?
- ADO下如何得到SQLServer里面表格名称!
- 调用SetWindowLong为什么失败?
- VC中在Edit Box控件中产生EN_CHANGE消息时,能捕获每一次键盘的输入吗?
- 请问如何在VC环境创建服务程序,最好能够支持MFC?有例子就更好!(500分)
- 诚心求名师, 指导一下VC的学习吧!共记四贴400分!!!!!
- vc中如何在应用程序的任意部分结束整个程序?
- 请问,做一个dcom程序,怎样注册server端client端,
- 提取尖点问题
- CListCtrl中用上下键改变选择项怎么得到选择项的item啊?
- 这算不算是一个BUG呢?
Start = GetTickCount();
while(true)
{
Sleep(10);
End = GetTickCount();
if( End - Start > 100 )
AfxMessageBox("haha");
}OnMouseMove()
{
Start = GetTickCount();
}大概是否是这样?^_^,我是初学者.
-----------------
你这样用了一个 while 大循环,会很占用CPU 的,效率不高。可以在窗口类Dialog 保存2个变量
DWORD m_dwPreviousTickCount;
DWORD m_dwNowTickCount;在鼠标移动事件中这样判断CMyDialog::InitDialog()
{
m_dwPreviousTickCount = GetTickCount();
m_dwNowTickCount = GetTickCount();
}CMyDialog::OnMouseMove(UINT nFlags, CPoint point)
{ //.... 先要判断鼠标是否在按钮的矩形区域
CRect rect;
m_MyBtn->GetWindowRect(&rect);
if(!rect.PtInRect(point))
{
m_dwPreviousTickCount = GetTickCount();
return;
} m_dwNowTickCount = GetTickCount(); if( m_dwPreviousTickCount - m_dwNowTickCount >= 100*1000 )
AfxMessageBox("sir,100 seconds elapsed ,you know ,^_^");
m_dwPreviousTickCount = GetTickCount();
}
if( m_dwPreviousTickCount - m_dwNowTickCount >= 100*1000 )
AfxMessageBox("sir,100 seconds elapsed ,you know ,^_^");应该是:
if( m_dwNowTickCount - m_dwPreviousTickCount >= 100*1000 )
AfxMessageBox("sir,100 seconds elapsed ,you know ,^_^");
BOOL CExampleDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
CString sClassName;
::GetClassName(pWnd->GetSafeHwnd(),sClassName.GetBuffer(80),80);
if (sClassName=="Button")
{
//Add Code
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
if(在按钮区域中)
SetTimer(1,100,NULL);
else //不在
KillTimer(1);OnTimer()中
AfxMessageBox(......);
1,新建一个CNCButton继承自CButton2,添加成员:BOOL m_bOver; //鼠标位于按钮之上时该值为true,反之为flase
3,添加消息:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
void CNCButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!m_bOver)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 100;//100毫秒
m_bTracking = _TrackMouseEvent(&tme);
}
CButton::OnMouseMove(nFlags, point);
}
LRESULT CNCButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bOver = FALSE;
return 0;
}LRESULT CNCButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_bOver = TRUE;
AfxMessageBox("鼠标悬停100毫秒");
return 0;
}注意在构造函数处将m_bOver = FALSE;
{
// TODO: Add your message handler code here and/or call default
if (!m_bOver)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 100;//100毫秒
///////////////////////////////////////////////////////////
BOOL m_bTracking = _TrackMouseEvent(&tme);
if (!m_bTracking)return FALSE;
///////////////////////////////////////////////////////////
}
CButton::OnMouseMove(nFlags, point);
}
处理OnTimer消息,在鼠标进入按钮的时候开始这个计时器,每隔 1 毫秒为一个全局变量加一,当此全局变量满为 100 时可以触发对话框。而当鼠标移出按钮时 KillTimer,将全局编梁归 0
这只是个框架,详细的问题还要自己来写
{
if(在区域内)
{
if(m_iTimer == NULL)
{
//如果没有设置过TIMER
m_iTimer = ::SetTimer(..,100*1000,);//设置100M后执行
}
}
else //不在区域内
{
if(m_iTimer) //如果设置过timer,取消timer
{
::KillTimer(..);
m_iTimer = NULL;
}
}
}OnTimer()
{
MessageBox(...);
....
}
m_iTimer = NULL;