首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 自動隱藏停靠窗格增強版:滑動動畫、精確停靠、MDI 支援與 Bug 修正

     編輯:關於VC++

基於 Cristi Posea 的 CSizingControlBar 與 Cuick 的《輕松實現類 MSDN2002 界面 (二)》,本專案大幅增強自動隱藏 (Auto-Hide) 停靠窗格功能,修正多項關鍵 Bug,新增滑入/滑出動畫、精確停靠演算法、MDI 支援,並重寫非客戶區繪製邏輯。

主要修正

#問題解決方案
1雙自動隱藏視窗同時顯示引入 TID_AUTO_HIDE_DELAY 計時器序列化顯示邏輯。
2焦點切換異常 (Auto-Hide 浮動視窗 ↔ 停靠欄)重寫焦點管理,明確處理 WM_KILLFOCUS/WM_SETFOCUS 流程。
3調整停靠欄大小閃爍/顫動優化 OnNcPaint/OnSize,減少無效區重疊。
4自動隱藏視窗尺寸超出主框架OnSize 中加入邊界檢查 min(maxSize, frameClientRect)。
5靜態 MFC 連結 (Release/Debug) 編譯錯誤新增 STATIC_MFC_LINK 前置處理器定義切換連結模式。
6加載 WS_POPUP 對話框導致視窗管理混亂CDockPageBar::AddPage 強制檢查 WS_CHILD 風格,拒絕非子視窗。

新增功能與改進

  • 滑入/滑出動畫:自行實作計時器驅動的位移動畫 (AnimateWindow 對自繪視窗無效),平滑度可調。
  • 精確停靠演算法:模仿 VS.NET 行為,滑鼠拖曳時即時顯示停靠預覽矩形,支援四邊與標籤頁式停靠。已知限制:橫向停靠窗格優先填滿剩餘空間 (源自 CSizingControlBar 特性)。
  • 非客戶區重繪:將標籤頁、標題列繪製移至 WM_NCPAINT/WM_NCCALCSIZE/WM_NCHITTEST/WM_NCLBUTTON*,視覺效果更銳利,減少客戶區重繪干擾。
  • MDI 完整支援:主框架繼承 CDockAutoHideFrame (SDI) 或 CMDIAutoHideFrame (MDI),子視圖啟用時自動更新自動隱藏面板內容。

圖 1:MDI 架構下多停靠窗格 (輸出、錯誤清單、工具箱) 並存。

圖 2:MDI 自動隱藏模式,邊緣標籤頁點擊滑出。

使用方法

  1. 專案加入 DockAutoHide*.h/.cpp 核心檔案。
  2. SDI:CMainFrame 繼承 CDockAutoHideFrame;MDI:繼承 CMDIAutoHideFrame。
  3. 建立停靠頁面類別繼承 CDockPageBar,覆寫 Create 建立內容視窗 (Tree/List/Edit 等)。
  4. 主框架 OnCreate 中註冊頁面:m_dockBar.AddPage(RUNTIME_CLASS(CMyPage), _T("標題"), IDB_BITMAP)。
  5. 啟用自動隱藏:m_dockBar.EnableAutoHide(TRUE)。

編譯設定

  • 動態 MFC:預設即可。
  • 靜態 MFC:專案屬性 → C/C++ → Preprocessor → 加入 STATIC_MFC_LINK。
  • 範例專案:SDI (VC6/VC2003 相容)、MDI (VC2003 建立)。

待解決問題 (歡迎共同攻關)

  1. 橫向停靠窗格優先填滿剩餘空間,導致垂直停靠空間壓縮。
  2. 若框架包含可停靠工具列,自動隱藏浮動視窗可能遮蔽工具列 (Z-Order 問題)。

作者期待社群高手提供解決方案,共同完善這套免費的專業級停靠框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved