缩小窗口到托盘

主要利用DrawAnimateRects函数。
一、首先在程序中加入以下代码:
1、获得托盘Rect
#define DEFAULT_RECT_WIDTH 150
#define DEFAULT_RECT_HEIGHT 30
static VOID GetTrayWndRect(LPRECT lpTrayRect)
{
    HWND hShellTrayWnd=FindWindowEx(NULL,NULL,TEXT("Shell_TrayWnd"),NULL);
    if(hShellTrayWnd)
    {
        HWND hTrayNotifyWnd=FindWindowEx(hShellTrayWnd,NULL,TEXT("TrayNotifyWnd"),NULL);
        if(hTrayNotifyWnd)
        {
            GetWindowRect(hTrayNotifyWnd,lpTrayRect);
            return;
        }
    }

    APPBARDATA appBarData;
    appBarData.cbSize=sizeof(appBarData);
    if(SHAppBarMessage(ABM_GETTASKBARPOS,&appBarData))
    {
        switch(appBarData.uEdge)
        {
        case ABE_LEFT:
        case ABE_RIGHT:
            lpTrayRect->top=appBarData.rc.bottom-100;
            lpTrayRect->bottom=appBarData.rc.bottom-16;
            lpTrayRect->left=appBarData.rc.left;
            lpTrayRect->right=appBarData.rc.right;
            break;

        case ABE_TOP:
        case ABE_BOTTOM:
            lpTrayRect->top=appBarData.rc.top;
            lpTrayRect->bottom=appBarData.rc.bottom;
            lpTrayRect->left=appBarData.rc.right-100;
            lpTrayRect->right=appBarData.rc.right-16;
            break;
        }

        return;
    }

    hShellTrayWnd=FindWindowEx(NULL,NULL,TEXT("Shell_TrayWnd"),NULL);
    if(hShellTrayWnd)
    {
        GetWindowRect(hShellTrayWnd,lpTrayRect);
        if(lpTrayRect->right-lpTrayRect->left>DEFAULT_RECT_WIDTH)
            lpTrayRect->left=lpTrayRect->right-DEFAULT_RECT_WIDTH;
        if(lpTrayRect->bottom-lpTrayRect->top>DEFAULT_RECT_HEIGHT)
            lpTrayRect->top=lpTrayRect->bottom-DEFAULT_RECT_HEIGHT;

        return;
    }

    SystemParametersInfo(SPI_GETWORKAREA,0,lpTrayRect,0);
    lpTrayRect->left=lpTrayRect->right-DEFAULT_RECT_WIDTH;
    lpTrayRect->top=lpTrayRect->bottom-DEFAULT_RECT_HEIGHT;
}

2、检查Animate是否可能
static BOOL GetDoAnimateMinimize(VOID)
{
    ANIMATIONINFO ai;

    ai.cbSize=sizeof(ai);
    SystemParametersInfo(SPI_GETANIMATION,sizeof(ai),&ai,0);

    return ai.iMinAnimate?TRUE:FALSE;
}

3、窗口缩小到托盘
VOID MinimizeWndToTray(HWND hWnd)
{
    if(GetDoAnimateMinimize())
    {
        RECT rcFrom,rcTo;

        GetWindowRect(hWnd,&rcFrom);
        GetTrayWndRect(&rcTo);
        DrawAnimatedRects(hWnd,IDANI_CAPTION,&rcFrom,&rcTo);
    }

    ShowWindow(hWnd,SW_HIDE);
}

4、从托盘恢复到窗口
VOID RestoreWndFromTray(HWND hWnd)
{
    if(GetDoAnimateMinimize())
    {
        RECT rcFrom,rcTo;
        GetTrayWndRect(&rcFrom);
        GetWindowRect(hWnd,&rcTo);

        DrawAnimatedRects(hWnd,IDANI_CAPTION,&rcFrom,&rcTo);
    }

    ShowWindow(hWnd,SW_SHOW);
    SetActiveWindow(hWnd);
    SetForegroundWindow(hWnd);
 }

二、调用
1、在窗口关闭和最小化事件处理中调用MinimizeWndToTray(m_hWnd);
2、在双击托盘图标的事件处理中调用RestoreWndFromTray(m_hWnd);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值