制做像QQ那种自动停靠.自动收缩的窗口.

类别:编程语言 点击:0 评论:0 推荐:

1.首先处理自动停靠.
    1).建立一个对话框类CDlg.
    2).
        ///dlg.h
          class CDlg
        {
            private:
                   bool m_isAutoHide; //窗口是否可以自动隐藏
                   bool m_isWinHide; // 窗口是否隐藏
               ...........
        }

      ///dlg.cpp
         .....
    void CDlg::OnMove(int x, int y)
    {
         CDialog::OnMove(x, y);
         
         ///窗口从显示到隐藏时,不做其它操作
        if(m_isWinHide)
         {
              return;
         }
         
         CRect tRect;
         GetWindowRect(tRect);
         if(tRect.top<10)
         {///如果窗口移动后的位置和到屏幕上方的距离小于10
           ///就使窗口停靠到屏幕上方.

              tRect.bottom-= tRect.top;
              tRect.top= 0;
              MoveWindow(tRect);
               ///窗口停靠后就可以自动隐藏
              m_isAutoHide= true;
          }
         else
         {
               ///如窗口没有停靠就不可以自动隐藏
              m_isAutoHide= false;
         }
 
       }

    void CDlg::OnMoving(UINT fwSide, LPRECT pRect)
    {
        if((pRect->top < 10)
          && (!m_isAutoHide) )
        {///如果窗口移动到的位置和到屏幕上方的距离小于10
           ///就使窗口停靠到屏幕上方.

                pRect->bottom-= pRect->top;
                pRect->top= 0;
                m_isAutoHide= true;
        }

        CDialog::OnMoving(fwSide, pRect);
    }
2.处理自动收缩
      //dlg.h
        class CDlg
         {
                .....
                LRESULT  OnMouseLeave( HWND hwnd, UINT msg,
                                              WPARAM  wParam,LPARAM lParam  );
         }

     //dlg.cpp
            BEGIN_MESSAGE_MAP(CDlg, CDialog)
                  ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
            END_MESSAGE_MAP()
      .......

     LRESULT CDlg::OnMouseLeave(HWND hwnd, UINT msg, WPARAM wParam,                                                                   LPARAM lParam  )
        {
             if(m_isAutoHide)
             {
                  CPoint tPoint;
                  GetCursorPos(&tPoint);
                  CRect tRect;
                  GetWindowRect(&tRect);
                  if(!(tRect.PtInRect(tPoint)))
                  {
                      m_isWinHide=true;
                   tRect.top= tRect.top - tRect.bottom +5;
                   tRect.bottom= 5;
                   MoveWindow(tRect);

                   ::SetWindowPos(
                            ::GetDesktopWindow()
                            ,HWND_TOPMOST,tRect.left,tRect.top
                            ,tRect.Width(),tRect.Height    ()
                            ,SWP_SHOWWINDOW);
                 }
            }
      return TRUE;
    }


    void CDlg::OnMouseMove(UINT nFlags, CPoint point)
        {
                 if(m_isWinHide)
                 {
                      CRect tRect;
                      GetWindowRect(&tRect);
                     tRect.bottom+= (tRect.bottom-tRect.top-5);
                     tRect.top=0;
                     MoveWindow(tRect);
                     m_isWinHide= false;
                  }

                    TRACKMOUSEEVENT EventTrack;
                      EventTrack.cbSize= sizeof(TRACKMOUSEEVENT);
                      EventTrack.dwFlags= TME_LEAVE;
                      EventTrack.hwndTrack= this->m_hWnd;
                      _TrackMouseEvent(&EventTrack);

            CDialog::OnMouseMove(nFlags, point);

        }

<完成>

本文地址:http://com.8s8s.com/it/it26967.htm