全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1372
推到 Plurk!
推到 Facebook!

要怎麼做出 Sidebar 的功能?

尚未結案
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-28 12:35:15 IP:61.218.xxx.xxx 未訂閱
有很多的軟體像是 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-31 10:01:26 IP:210.243.xxx.xxx 未訂閱
您好, 不知您有沒有發現, 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;
  }
}
//---------------------------------------------------------------------------
系統時間:2024-04-25 9:23:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!