2009年2月4日 星期三

[C++] 如何用滑鼠拖拉無標題視窗

(EZLearn 語言學習機中, 仿 iPod的面版)

如果你希望你的應用程式能變換各種面版( skin), 你應該不喜歡看到有一個 標題Bar 在上面吧. 

可是如果沒有 Title Bar , 那使用者要怎麼移動視窗呢? 我們希望如果要移動視窗, 應該是讓自己決定.

把視窗當作是一個方形的面版, 然後用滑鼠按左鍵拖拉移動視窗位置, 是我在 Longman Dictionary Helper (LDH) 啟動面版時, 使用技巧之一. 這項技巧同時也用在 EZLearn 語言學習機上,拖拉 Hello Kitty skin 時使用的方法,只不過 LDH 用 MFC, EZLearn 用 C#. 兩者大同小異.

MFC 的作法如下:

移動無標題視窗

視窗 Bording 應該要設定為 Resizing

Step 1: 加入視窗處理宣告
    BEGIN_MESSAGE_MAP(CMoveDlg, CDialog)
        ON_WM_NCHITTEST()   // for mouse draging moving
    END_MESSAGE_MAP()

Step 2:  加入開關
    //[API] 滑鼠拖拉移動 Enable/Disable
    void CMoveDlg::setDragMove(bool bValue){
        m_bDragMove=bValue;
    }

Step 3: 欺騙系統目前是在 Title
    // [視窗處理函式] 滑鼠進入視窗處理
    LRESULT CMoveDlg::OnNcHitTest(CPoint point){
        LRESULT retValue;

        // 注意: 當視窗為 WS_EX_TRANSPARENT 屬性時, 將不會接到
         //            Mouse Hit
         //            會讓 Window Drag 功能會失效

        if(m_bDragMove){
            retValue=HTCAPTION;    // enable drag the window from 
                                                                 // any point
        }else{
            retValue= CDialog::OnNcHitTest(point); // 呼叫原來的處理
        }

        return retValue;
    }

 

完成!

 

Enjoy.

by Jing

沒有留言:

張貼留言