制作自动停靠的对话

                                     制作自动停靠的对话                               
Jason2010-4-14
PS:
        一直对千千静听的自动依靠很好奇,现在借教材也实现一个。
        今天早上醒来,发现外面飘起了点点雪花,汗,都四月中旬了,竟然还下雪 ,去年此时,我们就穿一衬衫。天气越来越诡异,大家还是要多留意天气预报啊!
 

 

要点
1、        实现自动依靠功能的关键是处理 WM_WINDOWPOSCHANGING
的消息,当窗口位置发生改变时, 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定义的是依靠范围,可以改变其值试一下。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值