要怎麼做出 Sidebar 的功能? |
尚未結案
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
有很多的軟體像是 ObjectDock 還是 Windows 本身的工具列,
都有個 Sidebar 的功能。
就是可以在滑鼠移動到螢幕邊緣的時候顯示出來,
在滑鼠離開程式介面的時候又自動隱藏。 我想請問這個功能要如何實現呢? --
http://www.csie.nctu.edu.tw/~chtai/software.php
好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
您好, 不知您有沒有發現, Windows的工具列和其它類似的程式,
在隱藏時並非完全的隱藏, 而是會留下一個邊在螢幕邊界.
重點就在這個邊, 留下這個邊的用意就在偵測滑鼠是否有滑過螢幕
邊界. 而攔的訊息就是WM_NCHITTEST, 這個訊息會告訴你使用者是
否有把滑鼠滑過Form的邊.
實作方面, 當程式啟動時, 就把視窗放在螢幕外, 並留下一個邊,
並偵測滑鼠是否有滑過我們留下的這個邊. 若偵測到則顯示視窗.
接下來就是要偵測滑鼠是否有離開視窗了, 我寫了一個簡單的範
例如下所示, 我把一個自動隱藏的視窗放在螢幕的上方, 而偵測
滑鼠是否有離開視窗的部份我只是簡單的用了一個timer來做示範.
我把完整的碼放在http://home.so-net.net.tw/chiujihau/HideBar.zip
// Unit1.h //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TTimer *Timer1; void __fastcall FormCreate(TObject *Sender); void __fastcall Timer1Timer(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); void HitTestHandler(TMessage& Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_NCHITTEST, TMessage, HitTestHandler) END_MESSAGE_MAP(TForm); }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Unit1.cpp TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void TForm1::HitTestHandler(TMessage& Message) { DefaultHandler(&Message); if (Message.Result == HTBOTTOM) { Top = 0; // 啟動檢查偵測滑鼠是否有離開視窗的timer Timer1->Enabled = TRUE; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Width = Screen->Width; Left = 0; // 把視窗放在螢幕上方, 並留下一個邊. Top = -Height 3; Timer1->Interval = 100; Timer1->Enabled = FALSE; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { // 下面的碼是檢查滑鼠是否離開Form, 若離開則將Form放回螢幕上方. POINT CurPos; ::GetCursorPos(&CurPos); if (WindowFromPoint(CurPos) != Handle) { Top = -Height 3; Timer1->Enabled = FALSE; } } //--------------------------------------------------------------------------- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |