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

MFC 對話框進階技巧大全:工具列、異形視窗、拖曳、全螢幕與更多實用技巧

     編輯:關於VC++

前言

MFC 對話框是 Windows 應用程式最常見的介面形式,但預設功能有限。本文彙整 11 項實用技巧,涵蓋工具列/狀態列整合、非矩形視窗、非客戶區拖曳、啟動隱藏、全螢幕模式、焦點控制、動態縮放、任務列圖示隱藏、內容敏感說明等,助你打造專業級對話框介面。

1. 在對話框加入工具列

在 OnInitDialog 中建立 CToolBar,設定 CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY 風格,載入工具列資源,並呼叫 RepositionBars 調整客戶區配置,最後移動子視窗位置以配合工具列高度。

2. 改變對話框形狀(圓形、圓角矩形、多邊形)

利用 CreateEllipticRgn、CreateRoundRectRgn 或 CreatePolygonRgn 建立區域,於 OnInitDialog 取得客戶區大小後呼叫 SetWindowRgn 套用,即可實現非矩形視窗。

3. 實現非客戶區拖曳(點擊任意處移動視窗)

兩種方法:

  • 在 OnLButtonDown 中送出 WM_NCLBUTTONDOWN, HTCAPTION 訊息。
  • 覆寫 OnNcHitTest,將 HTCLIENT 回傳為 HTCAPTION。

4. 對話框啟動時最大化/最小化

  • 最大化:SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE)
  • 最小化:需在建構函式設旗標,覆寫 OnWindowPosChanging 移除 SWP_SHOWWINDOW,稍後再 ShowWindow(SW_SHOW)。

5. 限制對話框縮放範圍

覆寫 OnSizing,修改 LPRECT 參數強制寬高不小於指定值。

6. 加入狀態列

建立 CStatusBar 成員,OnInitDialog 中 CreateEx、SetIndicators、SetPaneInfo 設定窗格寬度,最後 RepositionBars 重新配置。

7. 啟動時完全隱藏視窗(無閃爍)

  1. 建構函式設 visible = false。
  2. 覆寫 OnWindowPosChanging,若 !visible 則 lpwndpos->flags &= ~SWP_SHOWWINDOW。
  3. 需顯示時設 visible = true; ShowWindow(SW_SHOW)。

8. 對話框全螢幕顯示

OnInitDialog 中移除 WS_CAPTION | WS_BORDER,取得螢幕解析度,呼叫 SetWindowPos(..., HWND_TOPMOST, ...) 覆蓋全螢幕。

9. Windows 2000/XP 強制取得焦點

使用 AttachThreadInput 將目前執行緒與前景視窗執行緒連結,呼叫 SetForegroundWindow 與 SetFocus,完成後再 AttachThreadInput(..., FALSE) 釋放。

10. 動態縮放/展開對話框

  • 簡單版:SetWindowPos(NULL, 0, 0, w, h, SWP_NOZORDER|SWP_NOMOVE)。
  • 動畫版:計算目標高度,在 SizeWindow 中迴圈逐漸 MoveWindow 產生伸縮動畫。

11. 讓被拖離螢幕的對話框回到可見區域

送出 DM_REPOSITION 訊息(需為最上層非子視窗)。

12. 新增/移除最大化最小化按鈕

OnCreate 或 OnInitDialog 中 ModifyStyle(0, WS_MAXIMIZEBOX | WS_MINIMIZEBOX) 或 SetWindowLong(GWL_STYLE, ...)。

13. 改變滑鼠游標

覆寫 OnSetCursor,呼叫 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_UPARROW)) 並回傳非零值。

14. 改變對話框前景/背景色

在 InitInstance 呼叫 SetDialogBkColor(RGB(255,0,0), RGB(0,255,0)) 設定紅底綠字。

15. 隱藏工作列圖示

建立隱藏的 CFrameWnd 做為父視窗,對話框建構時傳入該父視窗,於 OnInitDialog 呼叫 ModifyStyleEx(WS_EX_APPWINDOW, 0) 移除延伸風格。

16. 加入內容敏感說明 (F1 說明)

OnInitDialog 加入 WS_EX_CONTEXTHELP,覆寫 OnHelpInfo 依 dwContextId 呼叫 WinHelp(..., HELP_CONTEXTPOPUP)。

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