Jason | 2010-4-14 |
PS:
一直对千千静听的自动依靠很好奇,现在借教材也实现一个。
今天早上醒来,发现外面飘起了点点雪花,汗,都四月中旬了,竟然还下雪 ,去年此时,我们就穿一衬衫。天气越来越诡异,大家还是要多留意天气预报啊! |
要点
1、
实现自动依靠功能的关键是处理
WM_WINDOWPOSCHANGING
的消息,当窗口位置发生改变时, Windows 发送该消息。
的消息,当窗口位置发生改变时, Windows 发送该消息。
2、
在该程序中通过调用
SystemParametersInfo(SPI_GETWORKAREA,0,&rcScrn,0)
获得除任务栏外整个工作区域的大小。
3、
在
OnWindowPosChanging
函数中用到了结构体
WINDOWPOS
,其中包含了有关窗口大小和位置的信息,定义如下:
typedef
struct tagWINDOWPOS
{ /* wp */
HWND hwnd;
HWND hwndInsertAfter;
int x;
int y;
int cx;
int cy;
UINT flags;
}
WINDOWPOS
;
实现
1
、在新建基于对话框工程
,
给对话框类添加成员变量
private
:
int m_nEdgeSnapGap;
在对话框类的默认构造函数中对其进行初始化
, m_nEdgeSnapGap(30)
2
、改写
OnWindowPosChanging()
消息
void
CDemoDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
RECT rcScrn;
SystemParametersInfo(SPI_GETWORKAREA,0,&rcScrn,0);
if (abs(lpwndpos->x-rcScrn.left)<=m_nEdgeSnapGap)
{
lpwndpos
->x=rcScrn.left;
}
else if (abs(lpwndpos->x+lpwndpos->cx-rcScrn.right)<=m_nEdgeSnapGap)
{
lpwndpos->x=rcScrn.right-lpwndpos->cx;
}
if (abs(lpwndpos->y-rcScrn.top)<=m_nEdgeSnapGap)
{
lpwndpos->y=rcScrn.top;
}
else if (abs(lpwndpos->y+lpwndpos->cy-rcScrn.bottom)<=m_nEdgeSnapGap)
{
lpwndpos->y=rcScrn.bottom-lpwndpos->cy;
}
}
3
、OK,编译运行,试试效果。
另外,m_nEdgeSnapGap定义的是依靠范围,可以改变其值试一下。