类似OICQ自动滑动的隐藏的实现,以及源代码

王朝网络·vc·作者佚名  2006-01-08
宽屏版  字体: |||超大  

OICQ以及东方快车一些软件可以由用户设置隐藏到屏幕上端,鼠标划过时显示

实现起来十分简单,窗口滑动利用MoveWindow( RECT* rc, BOOL bReDraw);

检测鼠标是否划过窗口上方有三种方法

一,利用_TrackMouseEvent

具体实现:

//填加消息映射

//.......

ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)

//.......

//消息映射结束

void CSpDlg::OnMouseMove(UINT nFlags, CPoint point)

{

TRACKMOUSEEVENT stTRACKMOUSEEVENT;

stTRACKMOUSEEVENT.cbSize = sizeof(stTRACKMOUSEEVENT);

stTRACKMOUSEEVENT.hwndTrack=m_hWnd;

stTRACKMOUSEEVENT.dwFlags=TME_LEAVE;

_TrackMouseEvent(&stTRACKMOUSEEVENT);

CDialog::OnMouseMove(nFlags, point);

}

LRESULT CSpDlg::OnMouseLeave(WPARAM wParam, LPARAM lParam)

{

/*这里检查鼠标位置

是为了避免鼠标滑过控件时候产生的WM_MOUSELEAVE干扰正常应用*/

POINT pt;

RECT rcWindow;

GetWindowRect( &rcWindow );

GetCursorPos( &pt );

if(pt.x > rcWindow.right ¦¦ pt.x < rcWindow.left

¦¦ pt.y < rcWindow.top ¦¦ pt.y > rcWindow.bottom)/*当鼠标移动到窗口矩形外*/

MessageBox("鼠标离开了对话框",NULL,MB_OK);

return 0;

}

二,SetCapture();函数,参见MSDN,我们详细说下面的方法

三,利用WM_TIMER随时检查鼠标位置,判断是否在窗口上方。

void CAutoHideDlg::OnTimer(UINT nIDEvent)

{

POINT pt;

RECT rcWindow;

GetWindowRect( &rcWindow );

GetCursorPos( &pt );

if(pt.x > rcWindow.right || pt.x < rcWindow.left

|| pt.y < rcWindow.top || pt.y > rcWindow.bottom)

{

/*鼠标在窗口外*/

}

else

{

/*在窗口内*/

}

CDialog::OnTimer(nIDEvent);

}

算了,不说了,这部分实现起来实在是太简单,没什么好说的,想琢磨看代码吧

http://263.csdn.net/FileBBS/files/2001_6/T_150_1.zip

上面是旧的版本

下面是新的,不过都存在一个问题,详看http://www.csdn.net/expert/TopicView.asp?id=161974

http://263.csdn.net/FileBBS/files/2001_6/T_171_1.zip

[url=http://www.csdn.net.int/scripts/script.asp?script=com2]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有